DBCC CHECKDB:
1.檢查數據庫是否有損壞
2.盡可能修復數據庫損壞,是數據能重新被訪問
DBCC CHECKDB執行流程
1.檢查關鍵系統表
2.對數據庫運行DBCC CHECKALLOC
3.對數據庫中每個表或試圖運行DBCC CHECKTABLE
4.對數據庫運行DBCC CHECKCATLOG
5.驗證數據庫中每個索引試圖的內容
6.驗證數據庫中Service Broker數據
用法:
dbcc CHECKDB
(
{ 'database_name' | database_id | 0 }
[ , NOINDEX
| { REPAIR_ALLOW_DATA_LOSS
| REPAIR_FAST
| REPAIR_REBUILD
} ]
)
[ WITH
{
[ ALL_ERRORMSGS ]
[ , [ NO_INFOMSGS ] ]
[ , [ TABLOCK ] ]
[ , [ ESTIMATEONLY ] ]
[ , [ PHYSICAL_ONLY ] ]
[ , [ DATA_PURITY ] ]
[ , [ EXTENDED_LOGICAL_CHECKS ] ]
}
]
1. REPAIR_ALLOW_DATA_LOSS 會嘗試修復報告中所有錯誤,修復可能會導致數據丟失
2. REPAIR_FAST 保留向后兼容,不推薦使用
3. REPAIR_REBUILD,執行次要快速修復及耗時修復,修復不會導致數據丟失
4. ESTIMATEONLY 預估修復所需要的tempdb空間
5. NO_INFOMSGS 取消顯示所有信息性消息。
6. ALL_ERRORMSGS 顯示針對每個對象報告的所有錯誤。如果未指定 ALL_ERRORMSGS,則只為每個對象顯示前 200 條錯誤消息。
7. PHYSICAL_ONLY 將檢查限制為頁和記錄標頭的物理結構完整性、B 樹的物理結構以及數據庫的分配一致性。設計該檢查是為了以較小的開銷檢查數據庫的物理一致性,但它還可以檢測會危及用戶數據安全的殘缺頁、校驗和錯誤以及常見的硬件故障。
8. TABLOCK 使 DBCC CHECKDB 獲取鎖,而不使用內部數據庫快照。這包括一個短期數據庫排他 (X) 鎖。TABLOCK 可使 DBCC CHECKDB 在負荷較重的數據庫上運行得更快,但 DBCC CHECKDB 運行時會減少數據庫上可獲得的並發性。
9. EXTENDED_LOGICAL_CHECKS 如果兼容級別為 100 (SQL Server 2008) 或更高,則對索引視圖、XML 索引和空間索引(如果存在)執行邏輯一致性檢查。
10. DATA_PURITY 使 DBCC CHECKDB 檢查數據庫中是否存在無效或越界的列值。例如,DBCC CHECKDB 檢測日期和時間值大於或小於 datetime 數據類型的可接受范圍的列。
DBCC CHECKDB(REPAIR_ALLOW_DATA_LOSS)執行操作:
1.將由於IO或者校驗錯誤而標記為不可訪問的頁面重新標記為可訪問,如同這些錯誤沒有出現過一樣,這樣用戶能夠訪問這些頁面,雖然頁面有問題
2.將嘗試使用常規基於日志的恢復技術回復數據庫
3.如果由於食物日志損壞而導致數據庫恢復失敗,則將重建事務日志,重建事務日志會導致數據庫事務日志不一致
在DBCC CHECKDB(REPAIR_ALLOW_DATA_LOSS)建議:
0.建議在CHECKDB之前備份當前日志
1.建議在CHECKDB之后使用DBCC CHECKCONSTRAINTS來檢查表約束
除DBCC CHECKDB(REPAIR_ALLOW_DATA_LOSS)外的修復方法:
1. 使用備份策略恢復
2. 使用將發生錯誤的表DROP后重新導入數據
3. 使用SELECT INTO 將數據取走(EMERGENCY模式下)
修復步驟:
1、修改數據庫為緊急模式
ALTER DATABASE 庫名 SET EMERGENCY
2、使數據庫變為單用戶模式
ALTER DATABASE 庫名 SET SINGLE_USER
3、修復數據庫日志重新生成,此命令檢查的分配,結構,邏輯完整性和所有數據庫中的對象錯誤。當您指定“REPAIR_ALLOW_DATA_LOSS”作為DBCC CHECKDB命令參數,該程序將檢查和修復報告的錯誤。但是,這些修復可能會導致一些數據丟失。
DBCC CheckDB (庫名 , REPAIR_ALLOW_DATA_LOSS)
命令執行完成后可能會出現以下警告:
警告: 數據庫 '庫名' 的日志已重新生成。已失去事務的一致性。RESTORE 鏈已斷開,服務器不再有以前的日志文件的上下文,因此您需要了解它們的內容。應運行 DBCC CHECKDB 驗證物理一致性。數據庫已置於 dbo-only 模式。在准備使數據庫可用時,需要重置數據庫選項,並刪除所有多余的日志文件。
此時可以不用理會此警告,關閉Microsoft SQL Server Management Studio。
4、重新打開Microsoft SQL Server Management Studio,使數據庫變回為多用戶模式
ALTER DATABASE 庫名 SET MULTI_USER
5 重新啟動sqlserver
DBCC CHECKDB 在大數據庫上的建議
1. DBCC CHECKDB實際是對當前數據庫進行快照,在快照上執行檢查,因此防止對當前用戶執行出現阻塞和並發問題,CHCEKDB可以在多用戶模式下執行
2. DBCC CHECKDB默認使用多線程並行檢查,可以使用SP_CONFIGURE 'max degree of parallelism'來設置最大並行度
3. 使用WITH PHYSICAL_ONLY以較小開銷檢查數據庫物理一致性
4. 使用WITH NO_INDEX來避免檢查索引
5. 可以使用
SELECT
R.session_id,
R.request_id,
R.percent_complete,
R.start_time,
R.estimated_completion_time,
R.status,
R.command
FROM sys.dm_exec_requests R
WHERE command LIKE '%DBCC CHECK%'
來估算出執行DBCC還需要多長時間完成,該值可能不太准
6.將CHECKDB拆分成多個步驟完成,CHECKFILEGROUP CHECKALLOC CHECKTABLE
7.在備份機上測試
