首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server DBA 必會 DBCC 命令大全 (上):維護、驗證、資訊、雜項四大類完整語法與實戰指南

     編輯:關於SqlServer

DBCC (Database Console Commands) 是 SQL Server 診斷、維護、驗證的瑞士軍刀。本文系統整理四大類 DBCC 命令,提供標準語法、關鍵參數、實戰場景與避坑指南,作為 DBA 桌邊速查手冊 (上篇:維護、驗證、資訊、雜項)。

DBCC 四大類別速覽

類別用途代表命令
維護資料庫/索引/檔案群組物理重組、空間回收、快取清理INDEXDEFRAG, DBREINDEX, SHRINKDATABASE, SHRINKFILE, CLEANTABLE, DROPCLEANBUFFERS, FREEPROCCACHE, UPDATEUSAGE
驗證邏輯/物理一致性檢查、配置頁/目錄/約束/身分識別值驗證CHECKDB, CHECKTABLE, CHECKALLOC, CHECKFILEGROUP, CHECKCATALOG, CHECKIDENT, CHECKCONSTRAINTS
資訊統計資訊、輸入緩衝區、碎片度、開啟交易、快取狀態顯示SHOW_STATISTICS, INPUTBUFFER, SHOWCONTIG, OPENTRAN, PROCCACHE, SQLPERF
雜項追蹤旗標、DLL 卸載、修復選項等TRACEON/OFF, FREESESSIONCACHE, HELP

重點維護命令詳解

索引碎片整理與重建

-- 線上碎片整理 (Enterprise/Standard 2012+),低鎖定,適合維護窗口
DBCC INDEXDEFRAG (db_id, table_id, index_id, partition_number) WITH NO_INFOMSGS;

-- 離線/線上重建索引 (填充因子可調),重建統計資訊,效果徹底
DBCC DBREINDEX ('table_name', 'index_name', fillfactor) WITH NO_INFOMSGS;
-- 現代替代: ALTER INDEX ... REBUILD/REORGANIZE

空間回收與壓縮

-- 回收變長欄位 (varchar/varbinary/LOB) 刪除後的空間
DBCC CLEANTABLE (db_id, 'table_name', batch_size) WITH NO_INFOMSGS;

-- 資料庫/檔案壓縮 (謹慎使用,易產生碎片)
DBCC SHRINKDATABASE (db_id, target_percent, NOTRUNCATE|TRUNCATEONLY) WITH NO_INFOMSGS;
DBCC SHRINKFILE (file_id, target_size, NOTRUNCATE|TRUNCATEONLY) WITH NO_INFOMSGS;
-- 最佳實踐: 固定初始大小/成長量,僅異常暴增後一次性壓縮並鎖定大小

快取與統計校正

-- 清除乾淨緩衝區 (測試冷快取效能用)
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;

-- 清除程序快取 (重新編譯所有計畫)
DBCC FREEPROCCACHE WITH NO_INFOMSGS;

-- 修正系統目錄中頁數/行數不準 (大量匯入/截斷後)
DBCC UPDATEUSAGE (db_id, 'table_name', 'index_name') WITH COUNT_ROWS, NO_INFOMSGS;

重點驗證命令詳解

核心一致性檢查三劍客

-- 完整檢查:配置頁 + 表/索引結構 + 邏輯一致性 (最全面,耗時最長)
DBCC CHECKDB (db_id) WITH ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY, PHYSICAL_ONLY, DATA_PURITY;

-- 單表檢查 (可指定索引、修復選項)
DBCC CHECKTABLE ('table_name') WITH NOINDEX | REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD, ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY, PHYSICAL_ONLY;

-- 檔案群組檢查 (大型資料庫分區檢查)
DBCC CHECKFILEGROUP (filegroup_id) WITH NOINDEX, ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY;

修復選項風險等級 (由低到高)

選項行為資料遺失風險適用場景
REPAIR_FAST僅修復快速可修復的輕微錯誤 (如位圖)極低首選嘗試
REPAIR_REBUILD重建索引、修復非叢集索引錯誤低無備份時次選
REPAIR_ALLOW_DATA_LOSS刪除損壞頁/資料列以恢復一致性極高最後手段,必先完整備份

其他驗證命令

-- 目錄一致性 (系統表元數據)
DBCC CHECKCATALOG (db_id) WITH NO_INFOMSGS;

-- 身分識別值檢查/重設
DBCC CHECKIDENT ('table_name', NORESEED | RESEED, new_reseed_value) WITH NO_INFOMSGS;

-- 約束完整性 (FK/CK)
DBCC CHECKCONSTRAINTS ('table_name', 'constraint_name') WITH ALL_CONSTRAINTS, ALL_ERRORMSGS, NO_INFOMSGS;

-- 磁碟空間配置結構
DBCC CHECKALLOC (db_id) WITH NOINDEX, REPAIR_ALLOW_DATA_LOSS|REPAIR_FAST|REPAIR_REBUILD, ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY;

重點資訊命令詳解

-- 索引/欄位統計資訊詳細內容 (直方圖、密度向量、選擇率)
DBCC SHOW_STATISTICS ('table_name', 'index_name');

-- 顯示指定 SPID 最後一條客戶端指令 (排查阻塞/長查詢)
DBCC INPUTBUFFER (session_id, request_id) WITH NO_INFOMSGS;

-- 顯示表/索引碎片資訊 (掃描密度、邏輯/程度碎片、頁面密度)
DBCC SHOWCONTIG ('table_name', 'index_name') WITH TABLERESULTS, FAST, ALL_INDEXES, ALL_LEVELS, NO_INFOMSGS;
-- 現代替代: sys.dm_db_index_physical_stats

-- 顯示最早作用中交易/複寫交易資訊
DBCC OPENTRAN (db_id) WITH TABLERESULTS, NO_INFOMSGS;

實戰避坑指南

  • CHECKDB 執行期間:會獲取 Sch-S 鎖 (共用結構穩定),大表可能阻塞 DDL,建議維護窗口執行,或啟用 PHYSICAL_ONLY 僅做物理頁面檢查 (大幅縮短時間)。
  • SHRINK 操作:嚴禁常態化排程。會導致索引碎片化、VLF 碎片、檔案反覆成長效能抖動。僅在異常暴增 (如一次性大量刪除/截斷) 後人工執行一次並固定檔案大小。
  • FREEPROCCACHE:生產環境慎用,會導致所有計畫重新編譯,CPU 飆升。精準清除請用 DBCC FREESYSTEMCACHE('SQL Plans') 或 sp_recompile 單表/預存程序。
  • REPAIR_ALLOW_DATA_LOSS:執行前必須完整備份,且僅在無備份可還原時使用。執行後務必再次 CHECKDB 驗證。
  • 版本差異:2005+ 引入 DATA_PURITY (驗證資料型別有效性)、PHYSICAL_ONLY、TABLOCK (加速檢查) 等選項,舊版本語法需查閱對應版本線上叢書。

下篇將深入實戰場景:阻塞排查、死鎖分析、TempDB 壓力、Always On 同步延遲、效能基線建立中的 DBCC 組合拳應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved