DBCC (Database Console Commands) 是 SQL Server 管理員診斷、修復、監控資料庫的核心工具箱。本文系統整理 20 大類常用 DBCC 命令,涵蓋追蹤旗標、頁面解析、一致性檢查、索引維護、記憶體管理、縮減檔案等實戰場景,並附上參數詳解與最佳實務建議。
使用 DBCC TRACEON/OFF/STATUS 啟用/停用/查看旗標。全域旗標需加 -1 參數,否則僅對當前連線生效。
| 旗標 | 用途 | 典型場景 |
|---|---|---|
| 1204 | 輸出死結詳細資訊至錯誤記錄檔 | 死結排查,配合 3605 寫入 ERRORLOG |
| 1222 | 以 XML 格式輸出死結圖(建議取代 1204) | SQL 2008+,較易解析 |
| 3604 | 將 DBCC 輸出導向用戶端(SSMS 訊息頁籤) | 配合 DBCC PAGE、DBCC TRACESTATUS 觀察輸出 |
| 3605 | 將 DBCC 輸出導向 SQL Server ERRORLOG | 生產環境記錄死結、檢查結果 |
| 2528 | 停用 DBCC CHECKDB 並行檢查 | 高負載時段降低檢查資源爭用 |
| 3205 | 禁用備份時磁帶硬體壓縮 | 跨站點磁帶交換相容性 |
| 8602 | 忽略索引提示 (INDEX HINT) | 測試優化器原始選擇 |
| 8780 | 強制完整優化(停用優化逾時) | 複雜查詢優化不足時測試 |
-- 全域啟用 1204+3605,死結資訊寫入 ERRORLOG
DBCC TRACEON(1204, 3605, -1);
GO
DBCC TRACESTATUS(-1); -- 驗證全域旗標狀態
GO
DBCC TRACEON(3604); -- 必須先開啟
DBCC PAGE ( { 'dbname' | dbid }, file_id, page_id [, print_option] );
-- print_option: 0=頁首(預設) 1=頁首+每列 2=頁首+整頁傾印 3=頁首+每列+完整欄位值
常用場景:
sys.dm_db_database_page_allocations (SQL 2012+) 取代 DBCC IND。檢查磁碟空間配置一致性(GAM、SGAM、PFS、IAM 頁),不檢查資料邏輯。速度較快,適合頻繁排程。
DBCC CHECKALLOC ('MyDB') WITH NO_INFOMSGS, ALL_ERRORMSGS;
檢查系統目錄內部一致性(sys.objects、sys.columns、sys.indexes 等關聯),極快,建議每日執行。
DBCC CHECKCATALOG ('MyDB') WITH NO_INFOMSGS;
包含 CHECKALLOC + CHECKCATALOG + CHECKTABLE (所有表/索引)。
-- 生產環境建議參數
DBCC CHECKDB ('MyDB')
WITH
NO_INFOMSGS, -- 抑制資訊訊息,只報錯
ALL_ERRORMSGS, -- 報告所有錯誤(預設前 200 筆)
PHYSICAL_ONLY, -- 僅檢查物理結構(頁首、檢驗和),大幅縮短時間
MAXDOP = 4; -- 限制平行度,避免佔滿 CPU
-- 若需修復(極度謹慎):
-- DBCC CHECKDB ('MyDB', REPAIR_ALLOW_DATA_LOSS) WITH SINGLE_USER, NO_INFOMSGS;
最佳實務:
PHYSICAL_ONLY 日檢,完整 CHECKDB 週檢。WITH TABLOCK 可加速但會封鎖使用者。REPAIR_REBUILD 無資料遺失,REPAIR_ALLOW_DATA_LOSS 最後手段)。| 命令 | 用途 | 現代替代方案 (SQL 2005+) |
|---|---|---|
| DBCC DBREINDEX | 離線重建單一/所有索引,可指定 FILLFACTOR | ALTER INDEX ... REBUILD (ONLINE 選項) |
| DBCC INDEXDEFRAG | 線上整理分葉層碎片,不更新統計 | ALTER INDEX ... REORGANIZE |
| DBCC SHOWCONTIG | 顯示掃描密度、邏輯/實體碎片 | sys.dm_db_index_physical_stats |
建議:使用 ALTER INDEX / sys.dm_db_index_physical_stats 替代舊命令,功能更強、支援線上操作、可整合維護計畫。
-- 清除乾淨緩衝頁(模擬冷快取測試效能),不關機
DBCC DROPCLEANBUFFERS;
-- 清除程序快取(所有編譯計畫),慎用!會導致重新編譯風暴
DBCC FREEPROCCACHE;
-- 精準清除單一計畫
DBCC FREEPROCCACHE (plan_handle);
-- 釋放未使用的記憶體給 OS(視覺上縮小 SQL Server 記憶體佔用)
DBCC FREESYSTEMCACHE('ALL');
警告:縮減會造成嚴重索引碎片、產生大量交易記錄、阻塞使用者。**非必要勿用**。
-- 縮減資料檔至目標剩餘空間百分比
DBCC SHRINKDATABASE ('MyDB', 10); -- 保留 10% 可用空間
-- 縮減特定檔案至指定大小 (MB)
DBCC SHRINKFILE ('MyDB_Data', 5000); -- 縮至 5 GB
-- 僅釋放未使用空間至 OS,不移動頁面(較安全)
DBCC SHRINKFILE ('MyDB_Log', TRUNCATEONLY);
縮減後**必須重建索引**消除碎片。
| 命令 | 功能 | 備註 |
|---|---|---|
| DBCC CHECKCONSTRAINTS | 檢查 FOREIGN KEY / CHECK 約束一致性 | 不檢查磁碟層面,僅驗證邏輯 |
| DBCC CLEANTABLE | 回收 DROP VARIABLE COLUMN 留下的空間 | 需指定 batch_size 避免長鎖定 |
| DBCC PINTABLE / UNPINTABLE | 釘住/釋放表頁面於緩衝集區 | SQL 2005+ 已棄用,勿使用 |
| DBCC OPENTRAN | 顯示最早的作用中交易資訊 | 排查長時間交易、記錄檔增長原因 |
| DBCC INPUTBUFFER | 顯示指定 SPID 最後提交的 T-SQL | 配合 sp_who2 排查阻塞頭 |
| DBCC SQLPERF(LOGSPACE) | 顯示所有資料庫記錄檔使用率 | 監控記錄檔暴增的首選 |
| DBCC HELP ('command') | 顯示指定 DBCC 命令語法說明 | 離線查閱利器 |
sysadmin 固定伺服器角色或 db_owner 資料庫角色。CHECKDB、SHRINK、REINDEX 等會產生大量記錄,確保記錄檔有足夠空間或採用簡單復原模式(非生產)。DBCC 是 SQL Server 內建的「瑞士刀」,掌握核心 20 類命令即可應對 95% 運維場景。建立標準化檢查腳本(每日 CHECKCATALOG、週 CHECKDB PHYSICAL_ONLY、月完整 CHECKDB),配合監控告警,讓資料庫健康狀態可視、可控、可追溯。