DBCC (Database Console Commands) 是 SQL Server 管理員診斷、維護、調校資料庫的核心工具箱。本文彙整 36 個常用 DBCC 命令,按功能分類詳解語法、參數與實戰場景,涵蓋死鎖追蹤、頁面檢視、一致性檢查、索引維護、記憶體管理、日誌縮減等核心運維場景,附上實測輸出範例,適合 DBA 隨時查閱。
DBCC TRACEON (1204, 3605, -1); -- 1204:死鎖資訊, 3605:輸出至Error Log, -1:全域生效
GO
DBCC TRACESTATUS(-1); -- 查看目前啟用的旗標
GO
常用追蹤旗標速查表:
| 旗標 | 用途 |
|---|---|
| 1204 | 記錄死鎖參與者的執行資料 |
| 1205 | 記錄死鎖受害者資訊 |
| 1211 | 停用鎖升級 |
| 2528 | 禁用 DBCC CHECKDB 並行檢查 |
| 3604 | 輸出結果至用戶端 |
| 3605 | 輸出結果至 Error Log |
| 8602 | 忽略索引提示 |
| 8780 | 強制完整最佳化 |
DBCC TRACEON(3604); -- 輸出至用戶端
DBCC PAGE('Northwind', 1, 100, 1); -- DB名, 檔案號, 頁號, 列印選項(0-3)
printopt 選項:0=標題, 1=逐行+偏移表, 2=整頁+偏移表, 3=逐行+欄位值。
DBCC CHECKALLOC('Northwind'); -- 檢查頁面配置與系統表一致性
DBCC CHECKCATALOG('Northwind');
DBCC CHECKCONSTRAINTS('Products') WITH ALL_CONSTRAINTS;
僅驗證邏輯約束(FK、CHECK),不檢查磁碟層面。
DBCC CHECKDB
[ ( 'db_name' [ , NOINDEX | REPAIR_ALLOW_DATA_LOSS ] ) ]
[ WITH
{ NO_INFOMSGS | ALL_ERRORMSGS | PHYSICAL_ONLY | ESTIMATEONLY | TABLOCK }
];
PHYSICAL_ONLY:僅檢查實體頁面損壞,速度最快,適合大型資料庫例行巡檢。REPAIR_ALLOW_DATA_LOSS:最後手段,可能遺失資料,需單用戶模式。DBCC CLEANTABLE ('db_name', 'table_name', [batch_size]);
執行 ALTER TABLE DROP COLUMN 後釋放 TEXT/IMAGE 或變長欄位殘留空間。
DBCC DBREINDEX ('table_name' [, index_name [, fillfactor ]]) [WITH NO_INFOMSGS];
DBCC INDEXDEFRAG (db_id | 'db_name', table_id | 'table_name', index_id | 'index_name');
SQL Server 2005+ 不再支援,改由 Buffer Pool 自動管理。
DBCC DROPCLEANBUFFERS; -- 僅移除未修改的頁面,不影響髒頁
DBCC FREEPROCCACHE; -- 強制重新編譯所有計畫
可加參數清除特定計畫控制代碼:DBCC FREEPROCCACHE (0x05000600...)。
DBCC SQLPERF(LOGSPACE); -- 各資料庫記錄檔使用率
DBCC SQLPERF(IOSTATS); -- I/O 統計
DBCC SQLPERF(THREADS); -- 執行緒狀態
DBCC SHRINKDATABASE (db_name, [target_percent [, {NOTRUNCATE | TRUNCATEONLY}]]);
DBCC SHRINKFILE (file_id | 'file_name', [target_size [, {NOTRUNCATE | TRUNCATEONLY | EMPTYFILE}]]);
實戰技巧:先備份記錄檔 → 切換 SIMPLE 模式 → SHRINKFILE (N'log_name', 1, TRUNCATEONLY) → 切回 FULL 模式 → 立即完整備份。
DBCC IND:列出索引/表使用的頁面清單。DBCC LOG:檢視交易記錄檔內容。DBCC DBINFO:顯示資料庫啟動頁、版本、檢查點等結構資訊。DBCC REBUILD_LOG:重建遺失記錄檔的緊急手段(需允許系統表更新)。DBCC OPENTRAN:找出最久未提交的交易與持有者 SPID。DBCC INPUTBUFFER:查看指定 SPID 最後送入的 T-SQL 批次。DBCC ERRORLOG; -- 關閉當前日誌,啟動新日誌檔
DBCC FLUSHPROCINDB (db_id);
CHECKDB WITH PHYSICAL_ONLY,每月完整 CHECKDB。REORGANIZE (5-30%) 或 REBUILD (>30%),配合 FILLFACTOR。掌握這些 DBCC 命令,能讓 DBA 從被動救火轉為主動預防,穩守資料庫健康防線。