数据库完整性检查
為了主動發(fā)現(xiàn)數(shù)據(jù)庫側(cè)頁損壞,保證數(shù)據(jù)庫邏輯和物理完整性,計(jì)劃每周六上午6點(diǎn),針對生產(chǎn)主庫上的所有系統(tǒng)和用戶數(shù)據(jù)庫執(zhí)行DBCC CHECKDB,將結(jié)果記錄到表中。
以下為理論依據(jù):
SQL Server數(shù)據(jù)庫可以檢測出頁損壞,此時(shí),具體的表現(xiàn)形式可能為下述三種錯誤的一種:
823錯誤,也就是所謂的硬IO錯誤,可以理解為SQL Server希望讀取頁,而Windows告訴SQL Server,無法讀取到該頁。
824錯誤,也就是所謂的軟IO錯誤,可以理解為SQL Server已經(jīng)讀取到該頁,但通過計(jì)算CheckSum等值發(fā)現(xiàn)不匹配,因此SQL Server認(rèn)為該頁已經(jīng)被損壞。
825錯誤,也就是所謂Retry錯誤。
SQL Server發(fā)現(xiàn)錯誤的方法有兩種,分別為在讀取頁時(shí)和在備份時(shí)(本質(zhì)上也是讀取頁)。但如果我們希望對于數(shù)據(jù)一致性的檢查更加的全面,那我們應(yīng)該定期使用CheckDB來檢查數(shù)據(jù)的一致性,而不至于在生產(chǎn)時(shí)間數(shù)據(jù)被讀取時(shí)才能發(fā)現(xiàn)錯誤。
CheckDB命令在企業(yè)版中會使用多線程來進(jìn)行,會對整個數(shù)據(jù)庫進(jìn)行一致性檢查,在該過程中,使用了內(nèi)建數(shù)據(jù)庫快照的方式進(jìn)行,因此不會造成阻塞,但CheckDB會消耗大量的CPU、內(nèi)存和IO。因此CheckDB要選擇在維護(hù)窗口時(shí)間或是系統(tǒng)閑時(shí)進(jìn)行。
實(shí)際上,CheckDB是一套命令的匯總,通過執(zhí)行下列操作檢查指定數(shù)據(jù)庫中所有對象的邏輯和物理完整性:
初次檢查系統(tǒng)表
分配單元檢查(DBCC CHECKALLOC)
完整檢查系統(tǒng)表
對所有表進(jìn)行一致性邏輯檢查(DBCC CHECKTABLE)
元數(shù)據(jù)檢查(DBCC CHECKCATALOG)
SSB檢查
索引視圖、XML索引等檢查
微軟最佳實(shí)踐建議
“建議您使用?PHYSICAL_ONLY?選項(xiàng),以便可以頻繁檢查生產(chǎn)系統(tǒng)。?使用?PHYSICAL_ONLY?可以極大地縮短對大型數(shù)據(jù)庫運(yùn)行?DBCC CHECKDB?的運(yùn)行時(shí)間。?同時(shí)建議您定期運(yùn)行沒有選項(xiàng)的?DBCC CHECKDB。?應(yīng)當(dāng)以什么頻率執(zhí)行這些運(yùn)行任務(wù)將取決于各個企業(yè)及其生產(chǎn)環(huán)境。
”引用自:
https://docs.microsoft.com/zh-cn/sql/t-sql/database-console-commands/dbcc-checkdb-transact-sql
成熟的方案
可以使用 https://ola.hallengren.com/
實(shí)現(xiàn)備份、完整性檢查、索引和統(tǒng)計(jì)信息維護(hù)整套方案。
轉(zhuǎn)載于:https://blog.51cto.com/ultrasql/2050157
總結(jié)
- 上一篇: Java @Transient 注解使用
- 下一篇: MySQL日常应用操作记录