繁体   English   中英

为什么Sql Server 2005维护计划将错误的数据库用于dbcc checkdb?

[英]Why do Sql Server 2005 maintenance plans use the wrong database for dbcc checkdb?

这是我除了自己以外还遇到过的其他人的一个问题,我没有找到很好的解释。

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

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.

对于初学者,请始终记住GO不是SQL关键字; 它仅仅是(通常)由客户端而非服务器实现/识别的批处理分隔符。 因此,根据上下文和客户端,实际上并不能保证在批次之间保留当前数据库。

如果您正在使用维护计划,则最好使用检查数据库完整性任务。 如果您真的想运行自己的维护,则使用t-sql编写维护,然后使用作业中的某个步骤而不是维护计划中的步骤来运行它,并且上面的代码可以正常工作。 就像Stu所说的,GO语句是客户端指令而不是sql关键字,并且似乎仅受isql,wsql,osql等,客户端和sql代理的尊重。 我认为它可以在DTS包中使用。 显然,虽然不是DTSX。

您有一个检查数据库完整性任务,双击它选择MyDb,然后在计划运行时仅检查主数据库? 奇怪的。 您确定您没有其他计划在运行吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM