我应该检查哪些系统数据库和碎片整理索引?

Sur*_*raj 5 sql-server-2005 sql-server maintenance dbcc-checkdb

我有 SQL Server Agent (2005) 作业,定期对任何高度碎片化的索引执行 CHECKDB 和碎片整理 (ALTER INDEX REORGANIZE/REBUILD)。这些是典型的维护最佳实践。我想知道我应该将这些作业应用到哪个系统数据库?现在我只在 master 上运行 CHECKDB,我依稀记得设置它,因为我在某本书上看到过它。

那么,我应该针对以下哪项执行 CHECKDB 和/或索引碎片整理?

  • 掌握
  • 模型
  • 数据库数据库
  • 临时数据库

Kin*_*hah 5

应使用 CHECKDB 检查所有系统和用户数据库。唯一的例外是 tempdb,因为您无法生成 tempdb 的快照,而 checkdb 在幕后生成数据库快照。

棘手的部分是对于 tempdb(当 Tempdb 损坏时),因为我们知道它会在 SQL Server 重新启动完成后重新创建,但是当您重新启动 SQL Server 时 Tempdb 文件不会被删除,并且也不会被初始化为 0(零),因此腐败可能持续存在。

Tempdb 损坏(这种情况很少见......并且很可能是由于 SQL Server 中的错误)在此处进行了描述。


Aar*_*and 5

在我看来,一般的 checkdb 实际上只适用于 master 和 msdb。model 或 tempdb 中不应该有易失性数据(Kin 指出了一篇关于 tempdb 中损坏的好文章 - 如果您迁移到更现代的 SQL Server 版本,问题应该少得多)。我不会费心对 tempdb 进行常规操作,但只有在您确实收到损坏报告时才处理它。恕我直言。如果您已将用户对象添加到模型中,以便在每个新数据库中创建它们,则可能会增加那里的风险,因此您可能需要包含它。通常它很小,所以无论如何包含它也没有什么坏处。

对于碎片整理,MSDB 实际上是您应该担心的唯一数据库(特别是如果您的备份历史记录和作业历史记录表不受控制地增长)。如果您将用户表放在那里,Master 将是一个候选者,但我宁愿通过完全删除它们来解决这个问题,而不是尝试优化它们。如上所述,您不应该在模型中频繁更改数据,并且 tempdb 也不应该有任何永久对象,因此对其进行碎片整理要么是浪费,要么是虚假的,或者两者兼而有之。