代码之家  ›  专栏  ›  技术社区  ›  Eric Z Beard

为什么sql server 2005维护计划对dbcc checkdb使用了错误的数据库?

  •  0
  • Eric Z Beard  · 技术社区  · 16 年前

    这是一个问题,我见过别人,除了我自己,我没有找到一个很好的解释。

    假设您有一个维护计划,其中包含检查数据库的任务,如下所示:

    USE [MyDb]
    GO
    DBCC CHECKDB with no_infomsgs, all_errormsgs
    

    如果在任务执行后查看日志,可能会看到以下内容:

    08/15/2008 06:00:22,spid55,Unknown,DBCC CHECKDB (mssqlsystemresource) executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 0 minutes 0 seconds.
    08/15/2008 06:00:21,spid55,Unknown,DBCC CHECKDB (master) executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 0 minutes 0 seconds.
    

    它没有检查mydb,而是检查master和msssqlsystemresource。

    为什么?

    我的解决方法是使用以下命令创建一个SQL Server代理作业:

    dbcc checkdb ('MyDb') with no_infomsgs, all_errormsgs;
    

    那总是很好的。

    08/15/2008 04:26:04,spid54,Unknown,DBCC CHECKDB (MyDb) WITH all_errormsgs<c/> no_infomsgs executed by NT AUTHORITY\SYSTEM found 0 errors and repaired 0 errors. Elapsed time: 0 hours 26 minutes 3 seconds.
    
    3 回复  |  直到 10 年前
        1
  •  1
  •   Booji Boy    16 年前

    如果您使用的是维护计划,那么最好使用check database integrity任务。如果您真的想运行自己用t-sql编写的维护,那么在作业中使用一个步骤运行它,而不是在维护计划中,上面的代码可以正常工作。正如stu所说,go语句是客户机指令,而不是sql关键字,而且似乎只受到isql、wsql、osql等客户机和sql代理的尊重。我认为它在DTS包中工作。显然,在DTSX中没有。

        2
  •  1
  •   Stu    10 年前

    首先,请记住 GO 不是SQL关键字;它只是(通常)由客户端实现/识别的批处理分隔符,而不是服务器。因此,取决于上下文和客户机,实际上不能保证在批处理之间保留当前数据库。

        3
  •  0
  •   Booji Boy    16 年前

    您有一个check database integrity任务,双击它选择mydb,当计划运行时,它只检查master?真奇怪。你确定你没有别的计划?