【问题标题】:Automating DBCC CHECKDB自动化 DBCC CHECKDB
【发布时间】:2010-11-27 07:46:14
【问题描述】:

我目前正在尝试在 SQL Server 2005 上编写一个作业脚本,该作业将自动执行 DBCC CHECKDB 进程。基本上,我使用游标在实例上的每个数据库上运行和运行 DBCC CHECKDB。有时它可以工作,运行每个数据库并将错误记录在我为此目的设计的表中,有时它只运行几个数据库并停止。有谁知道发生了什么?我已经包含了用于光标的代码。

DECLARE @DbName varchar(100)

DECLARE
  GetDbName CURSOR
    LOCAL
    FORWARD_ONLY
    OPTIMISTIC
      FOR
         SELECT
           name
         FROM
           sys.databases
         ORDER BY
           name 

  OPEN GetDbName
  FETCH NEXT FROM GetDbName
  INTO @DbName
    WHILE (@@fetch_status = 0)
      BEGIN

        print @DbName

        INSERT INTO
          TempLog
        EXEC('DBCC CHECKDB ('+ @DbName +') WITH NO_INFOMSGS, TABLERESULTS')

        FETCH NEXT FROM GetDbName
        INTO @DbName

      END
CLOSE GetDbName
DEALLOCATE GetDbName

【问题讨论】:

    标签: sql-server database


    【解决方案1】:

    sufficiently high (20+) severity 的错误——根据我的经验,这些错误最常见,例如无效的文本指针——将停止当前正在运行的任何 SQL 作业,带有极端偏见,忽略 try/catch 结构并终止连接。我建议将此任务移至外部进程,并为每个 DBCC CHECKDB 命令建立一个新连接,以便在遇到高严重性错误时继续执行。

    【讨论】:

    • +1 这很可能是问题所在。严重错误也会进入错误日志和系统事件日志,因此很容易在那里检查。
    【解决方案2】:

    使用未记录的 sp_MSforeachdb 存储过程

    exec sp_msforeachdb 'use ?; dbcc checkdb'
    

    【讨论】:

    • 我一开始就是这么用的。有同样的问题
    • OK 不确定它是否会像光标一样爆炸(即使在幕后可能就是这样!)
    • 是的,我就是这么想的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2021-02-06
    相关资源
    最近更新 更多