1. 程式人生 > >數據庫完整性檢查

數據庫完整性檢查

checkdb ola

為了主動發現數據庫側頁損壞,保證數據庫邏輯和物理完整性,計劃每周六上午6點,針對生產主庫上的所有系統和用戶數據庫執行DBCC CHECKDB,將結果記錄到表中。


以下為理論依據:


SQL Server數據庫可以檢測出頁損壞,此時,具體的表現形式可能為下述三種錯誤的一種:

  • 823錯誤,也就是所謂的硬IO錯誤,可以理解為SQL Server希望讀取頁,而Windows告訴SQL Server,無法讀取到該頁。

  • 824錯誤,也就是所謂的軟IO錯誤,可以理解為SQL Server已經讀取到該頁,但通過計算CheckSum等值發現不匹配,因此SQL Server認為該頁已經被損壞。

  • 825錯誤,也就是所謂Retry錯誤。


SQL Server發現錯誤的方法有兩種,分別為在讀取頁時和在備份時(本質上也是讀取頁)。但如果我們希望對於數據一致性的檢查更加的全面,那我們應該定期使用CheckDB來檢查數據的一致性,而不至於在生產時間數據被讀取時才能發現錯誤。


CheckDB命令在企業版中會使用多線程來進行,會對整個數據庫進行一致性檢查,在該過程中,使用了內建數據庫快照的方式進行,因此不會造成阻塞,但CheckDB會消耗大量的CPU、內存和IO。因此CheckDB要選擇在維護窗口時間或是系統閑時進行。


實際上,CheckDB是一套命令的匯總,通過執行下列操作檢查指定數據庫中所有對象的邏輯和物理完整性:

  • 初次檢查系統表

  • 分配單元檢查(

    DBCC CHECKALLOC

  • 完整檢查系統表

  • 對所有表進行一致性邏輯檢查(DBCC CHECKTABLE

  • 元數據檢查(DBCC CHECKCATALOG

  • SSB檢查

  • 索引視圖、XML索引等檢查


微軟最佳實踐建議


“建議您使用 PHYSICAL_ONLY 選項,以便可以頻繁檢查生產系統。 使用 PHYSICAL_ONLY 可以極大地縮短對大型數據庫運行 DBCC CHECKDB 的運行時間。 同時建議您定期運行沒有選項的 DBCC CHECKDB 應當以什麽頻率執行這些運行任務將取決於各個企業及其生產環境。

”引用自:

https://docs.microsoft.com/zh-cn/sql/t-sql/database-console-commands/dbcc-checkdb-transact-sql


成熟的方案


可以使用 https://ola.hallengren.com/

實現備份、完整性檢查、索引和統計信息維護整套方案。


數據庫完整性檢查