0

此代码在 SQL 2005 中运行良好,但似乎错过了 SQL 2008 或 SQL 2008R2 中选择末尾的随机记录数。我使用此代码备份生产服务器上的数据库。2008 服务器上有 37 个 db(不包括 tempdb),它每天备份 17 到 35 个这些 db(即使我运行选择,我总是返回 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 = 0改成WHILE @@FETCH_STATUS <> -1.

于 2011-07-07T18:18:34.197 回答
0

或者更好的是,根本不要使用光标。:)

剧本有严重缺陷。它不会检查数据库的状态,因此如果您有一个不在线的数据库,例如数据库镜像或日志传送辅助数据库,则该过程将失败,并且不会备份其后出现的所有数据库。此外,您使用了错误的数据类型

于 2011-07-07T18:36:44.090 回答