0

このコードはSQL2005で正常に機能しますが、SQL2008またはSQL2008R2での選択の最後からランダムな数のレコードが欠落しているように見えます。このコードを使用して、運用サーバー上のデータベースをバックアップします。2008サーバーには37個のデータベースがあり(tempdbはカウントされません)、毎日17〜35個のデータベースをバックアップします(selectを実行しても、常に37行が返されます)。実行中のジョブはエラーなしで完了しますが、すべてのデータベースをバックアップするわけではありません。

DECLARE @today VARCHAR(10)
SELECT @today = Convert(varchar(10),dateadd(day,0,Dateadd(day,datediff(day,0,getdate()),0)),120)

DECLARE @DBName varchar(500)
DECLARE DB_Cursor CURSOR FOR
SELECT name FROM sys.databases 
OPEN DB_Cursor;
FETCH NEXT FROM DB_Cursor INTO @DBNAME
WHILE @@FETCH_STATUS = 0
   BEGIN
IF @DBNAME <> 'tempdb'
BEGIN
    declare @Path varchar(500)              
    select @Path = 'g:\DBBackups\'

    declare @FileName varchar(4000)
    select @FileName = @Path + @DBNAME + '_Full_' + @today + '.bak'

        BACKUP DATABASE @DBName 
            TO DISK = @FileName
            WITH NoInit, NoFormat, SKIP
END

  FETCH NEXT FROM DB_Cursor INTO @DBNAME;
END;
CLOSE DB_Cursor;
DEALLOCATE DB_Cursor;
4

2 に答える 2

1

私はこれについてここから簡単に話しました:

基本的に、使用するカーソルをREAD_ONLY LOCAL FORWARD_ONLY STATIC変更します。データベースのロックや変更の影響を受けないようにする必要があります(これは、実際の説明で私が推測している唯一のワイルドスタブです)。これは、不思議なデータベースのスキップが発生しなかったすべての場合に私が見つけた唯一の本当の違いでした。

私はの値を調査しようとしませんでした@@FETCH_STATUS-カーソルが進むにつれて、これが0と-1以外の値に変わる可能性があります(私は通常、前者ではなく後者に対してチェックします)。だから多分に変更WHILE @@FETCH_STATUS = 0WHILE @@FETCH_STATUS <> -1ます。

于 2011-07-07T18:18:34.197 に答える
0

または、カーソルをまったく使用しないでください。:)

スクリプトには大きな欠陥があります。データベースの状態はチェックされないため、データベースミラーやログ配布セカンダリのようにオンラインではないデータベースがある場合、プロセスは失敗し、その後に続くすべてのデータベースはバックアップされません。また、間違ったデータ型を使用しています

于 2011-07-07T18:36:44.090 に答える