DBCC CHECKDB 策略:上次成功检查、拆分工作、解读结果
SQL Server维护命令
-- Last successful CHECKDB (1900-01-01 = never):
SELECT name, DATABASEPROPERTYEX(name, 'LastGoodCheckDbTime') AS last_good_checkdb
FROM sys.databases
WHERE state_desc = N'ONLINE' AND name <> N'tempdb'
ORDER BY last_good_checkdb;
-- Estimated tempdb requirement:
DBCC CHECKDB (N'Musteri') WITH ESTIMATEONLY;
-- Split a large DB across days: allocation + catalog + table by table CHECKTABLE
USE [Musteri];
DBCC CHECKALLOC (N'Musteri') WITH NO_INFOMSGS;
DBCC CHECKCATALOG (N'Musteri') WITH NO_INFOMSGS;
DBCC CHECKTABLE (N'dbo.Siparis') WITH NO_INFOMSGS, ALL_ERRORMSGS;
-- Get results as rows (error rows with object and page):
DBCC CHECKDB (N'Musteri') WITH TABLERESULTS, NO_INFOMSGS, ALL_ERRORMSGS, MAXDOP = 4;作用
显示每个数据库上次成功执行 CHECKDB 的时间,估算所需的 tempdb,允许将大型数据库的检查拆分为 CHECKALLOC + CHECKCATALOG + CHECKTABLE 几部分,并以行(对象、索引、页)形式返回结果。
适用场景
审计维护工作时、超大数据库无法在维护窗口内完成时,或在 823/824 之后确定损坏范围时。
注意
结果中出现“repair_allow_data_loss is the minimum repair level”表示修复会删除数据;先考虑从完好的备份还原(或页还原)。若只有非聚集索引(index_id > 1)受影响,删除并重建该索引即可无数据丢失地修复。发现损坏后要调查磁盘子系统。PHYSICAL_ONLY 会跳过逻辑检查;仍需定期执行完整 CHECKDB。用 CHECKTABLE 拆分时,若不同时运行 CHECKALLOC/CHECKCATALOG,覆盖是不完整的。