【问题标题】:Can I run DBCC CHECKDB from .NET?我可以从 .NET 运行 DBCC CHECKDB 吗?
【发布时间】:2009-05-22 08:29:50
【问题描述】:

我正在编写一个计划作业来模拟 SQL Express 的 SQL Server 维护计划。 (我必须这样做,因为 SQL Express 不存在 SQL 代理和相关工具)

其中一个步骤是进行数据库完整性检查。用于此的 TSQL 是:

DBCC CHECKDB(N'Northwind')  WITH NO_INFOMSGS

我如何知道在执行此命令期间是否发生错误,在使用 ADO.NET 时会抛出 Exception 还是必须解析 >文本输出命令(如果是,我在输出中寻找什么)

这很难测试,因为我手头没有损坏的数据库。

【问题讨论】:

    标签: .net sql-server tsql ado.net sql-server-administration


    【解决方案1】:

    您可以将TABLERESULTS 选项与CHECKDB (DBCC CHECKDB WITH TABLERESULTS) 一起使用。 这将为您提供一个记录集,其中包含 ErrorLevelStateMessageText(以及许多其他列)等列。

    该记录集的Level 列(严重级别)应该足以确定是否有任何错误。

    MS 表示级别 11 到 16 是“由用户生成的,并且可以由用户更正”。所以我想说 17 以上的任何东西都应该意味着:停止进行任何备份(以避免用损坏的备份覆盖好的备份),尽可能使系统脱机,并立即通知操作员。

    并且级别 11 到 16 可能也应该报告给操作员(通过常规电子邮件或其他方式),以便他在必要时进行检查。 (不过,我不确定CHECKDB 是否会报告级别 11 到 16 的错误。不过,在其中记录错误/通知操作员的代码可能不会受到伤害。)

    注意:如果您将TABLERESULTSNO_INFOMSGS 结合使用,并且如果CHECKDB 没有发现任何错误,您将不会得到任何错误 结果是记录集,甚至没有一个没有行的记录集。

    注意2:在某些情况下,CHECKDB 只会失败并显示错误代码。到目前为止,我只看到一个触发此错误的错误,它看起来像这样:

    Msg 211, Level 23, State 51, Line 3
    Possible schema corruption. Run DBCC CHECKCATALOG.
    Msg 0, Level 20, State 0, Line 0
    A severe error occurred on the current command.  The results, if any, should be discarded.
    

    我没有经常使用 ADO.NET,但我认为 ADO.NET 会通过抛出异常来做出反应。 此外,由于这是一个严重性 >= 20 的错误,它会导致客户端连接被关闭。


    总结一下:我会运行DBCC CHECKDB WITH TABLERESULTS。如果命令失败,则存在问题(可能是严重问题)。如果没有,请继续遍历结果集,并查找任何 >= 17 的严重级别。如果找到,则可能也存在某种严重问题。

    【讨论】:

    • 想添加一条评论,严重级别为 10 的消息是信息性的,表示由于您输入的信息中的错误导致的问题。从 11 到 16 的严重级别由用户生成,并且可以由用户进行更正。所以我建议检查 Levels >= 11。实际上大多数错误都会有 level = 16
    • 我已经写过 11 到 16 级可能应该报告给操作员。如果他提供了不正确的 SQL,他可能会在 11 ... 16 范围内得到一个错误。但是他的工作总是会失败。如果语法正确,我看不出 CHECKDB 如何/为什么会报告“用户可纠正错误”。即使是这样,我 99% 的把握也不会是因为数据库损坏了。在这种情况下,我真的希望收到 21 级以上的消息。
    【解决方案2】:

    是的,我相信您需要处理从 DBCC CHECKDB 返回的文本输出。

    为帮助您进行测试,以下参考详细说明了如何故意破坏 SQL Server 数据库。

    http://sqlblogcasts.com/blogs/tonyrogerson/archive/2007/03/10/how-to-create-a-corrupt-database-using-bulk-insert-update-and-bcp-sql-server-as-a-hex-editor.aspx

    【讨论】:

    • 感谢有关如何破坏数据库的 URL,这真的很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    相关资源
    最近更新 更多