我們知道,在數據庫系統的開發和應用中,必須保證數據庫的完整性和一致性。
當數據庫出現了嚴重錯誤;當我們懷疑數據庫受到破壞(如無法用drop命令刪除數據庫或對象,使用某個表時出現“不可靠數據”的信息等);當用戶改變了Server的缺省排序的順序或改變了字符集而需要檢查;當SA對系統做定期檢查;這些時候,我們都需要使用數據庫一致性檢查工具(Database Consistenecy Checker,簡稱DBCC)。DBCC是一個實用命令集,用來檢查一個數據庫的邏輯一致性及物理一致性。在開發和應用中,DBCC是我們經常要使用的命令。
DBCC命令的格式如下
dbcc
(checktable ((表名|表標識( [, skip_ncindex] ) |
checkdb [(數據庫名[, skip_ncindex] )] |
checkalloc [ (數據庫名[, fix | nofix] )] |
tablealloc( {表名|表標識}
[,{full |optimized |fast |null}
[, fix |nofix] ]]) |
indexalloc ( {表名|表標識},索引標識
[,{full |optimezed | fast | null}
[, fix |nofix ]] ) |
checkcatalog [ (數據庫名)] |
dbrepair(數據庫名,dropdb ) |
reindex({表名|表標識} ) |
fix_text({表名|表標識) }
dbcc的權限,對于checktable,fix_text和reindex是缺省賦給表的屬主,對于checkdb,checkalloc,checkcatalog,dbrepair,indexalloc和tablealloc,是缺省賦給數據庫屬主的。DBO自動獲得DBCC命令和全部選項的權限。該權限不可轉授。此外,dbcc在數據庫是活動時運行,除了dbrepair選項和帶有fix選項的dbcc checkalloc以外。
checktable選項
checktable是用來對一個指定的表做檢查,確保索引和數據頁正確地連接,索引按正確的順序存儲,所有指針的一致性,每頁上數據信息的合理性,頁偏移的合理性。如果日志段在它自己的(日志)設備上,對syslogs表使用dbcc checktable命令可以報告已使用的和剩余的日志空間,使用skip_ncindex選項使得dbcc checktable跳過對用戶表上非聚簇索引(nonclustered index)的檢查。缺省是檢查所有的索引。
例1.檢查日志使用的空間量和未用的空間量:
dbcc checktable (syslogs)
若日志段在日志設備上,則會返回如下信息:
checking syslogs
The total number of data page in the table is 1.
NOTICE:Space used on the log segment is 0.20 Mbytes, 0.13%.
NOTICE:Space free on the log segment is 153.4Mbytes,99.87%.
DBCC execution Completed.If dbcc printed error messages,
Contact a user with SA role.
若日志不在它自己的設備上,則會顯示下列信息:
NOTICE:Notification of log space used/free.
Can not be reported because the log segment is not on its own device.
例2. dbcc checktable (titles)
The total number of data page in this table is 3.
Table has 18 data rows.
DBCC execution Completed. If DBCC printed error messages. contact a user with SA role.
checkdb選項
運行checkdb選項同checktable檢查的內容一樣,但它是對一指定數據庫中的每張表都做這樣的檢查。若未指定數據庫名,checkdb檢查當前的數據庫。checkdb返回的信息,也同于checktable。
checkalloc選項
checkalloc是檢查指定數據庫,看其所有正確分配的頁和尚未分配的頁的情況。若未指定數據庫名,則checkalloc檢查當前數據庫。checkalloc會返回已分配的和使用的空間數量。checkalloc的缺省模式為nofix,要使用fix選項,必須把數據庫置于單用戶模式。
例:
dbcc checkalloc (pubs2)
.
.
.
alloc page 0 (#of extent=32 used pages=68 ref pages=68)
alloc page 256 (# of extent=32 used pages=154 ref pages=154)
alloc page 512 (# of extent=28 used pages=184 ref pages=184)
alloc page 768 (# of extent=1 used pages=1 ref pages=1)
total (# of extent=93 used pages=407 ref pages=407) in this database.
DBCC execution completed.If dbcc printed error message,
Contact a user with System Adminstrator (SA) role.
tablealloc選項
tablealloc檢查指定的表以確保所有頁都被正確地分配。它是checkalloc的縮小版本。對單張表進行相同的完整性檢查。使用tablealloc可以生成三種類型的報表:full,optimized和fast。full選項相當于表一級的checkalloc;它報告各種類型的分配錯誤。optimized選項基于表的對象分配映像(OAM)頁里列出的分配頁生成報告。它并不報告,也不能整理OAM頁里沒有列出的在分配頁上沒有引用的擴展(extent)。如果沒有指明類型,或使用了null,則optimized選項是缺省的設置。fast選項,并不生成分配報告,但生成一個被引用但并沒有在擴展里分配的頁的額外的報告。fix|nofix選項決定tablealloc 是否整理表中發現的分配錯誤。對于所有的表,缺省為fix,但系統表除外,它們的缺省為nofix。要對系統表使用fix選項,必須首先將數據庫置成單用戶模式。
例:
dbcc tablealloc(titles)
顯示信息如下:
The default report option of OPTIMIZED is used for this run. The default fix option of FIX.is used for this run.
.
.
.
Total #of extent=3
Alloc page 256 (# of extent=1 used pages=2 ref pages=2).
Alloc page 256(# of extent=1 used pages=2 ref pages=2)
Alloc page 256 (# of extent=1 used pages=2 ref pages=2)
Total (# of extent=3 used pages=8 ref pages=8) in this database.
indexalloc 選項
indexalloc檢查指定的索引,確保所有的頁都被正確地分配,它是checkalloc的縮小版本,對單獨一條索引指定同樣的完整性檢查。其中各選項與tablealloc相同。
checkcatalog選項
checkcatalog選項用于檢查系統表內,系統表之間的一致性。例如:它確保在syscolumns表中的每一(數據)類型在systypes表中都有一個相匹配的記錄;對于sysobjects中的每個表和視圖在syscolumns表中應有關于它們每一列的描述記錄;確保在syslogs中的最后一個檢查點是有效的。checkcatalog也報告任何已定義的段。若不指定數據庫名,則檢查當前數據庫。
dbrepair選項
dbrepair(數據庫名,dropdb)選項是刪除一個受破壞的數據庫。受破壞的數據庫是不能用drop database命令刪除的,drop database只能刪除正常的數據庫,當執行dbrepair命令時,任何用戶(包括執行此命令的用戶)都不得使用正被刪除的數據庫。該選項要在master庫中運行。
reindex選項
reindex選項通過運行dbcc checktable的“fast”執行方式檢查用戶表上索引的完整性。如果它檢測出索引有問題則會刪除并重建索引。在SQL Server的排列順序改變之后,SA或表屬主應該執行這一選項。此選項不能在用戶定義的事務中運行。
例:
dbcc reindex (titles)
返回信息:One or more indexes corrupt.They will be rebuilt.
fix_text選項
SQL Server的字符集由單字節轉變為多字節后,fix_text選項用于升級文本值。SQL Server的字符集由單字節轉變為多字節字符集會使文本數據的管理更加復雜。由于文本值可能較大足以覆蓋若干頁,SQL Server必須能處理(通過頁約束)可能橫跨頁的字符。為做到這點,服務器需要在每一文本頁上添加一些信息。SA或表屬主必須在文本數據的每一個表上運行dbcc fix_text,以計算所需要的新頁數。
總之,DBCC命令所返回的信息能準確地反映數據庫及它的各個對象的狀態,是我們檢測數據庫的好幫手。