DBCC--CHECKDB


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.在備份機上測試

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM