我們知道,在資料庫系統的開發和應用中,必須保證資料庫的完整性和一緻性。當資料庫出現了嚴重錯誤;當我們懷疑資料庫受到破壞(如無法用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指令所傳回的資訊能準确地反映資料庫及它的各個對象的狀态,是我們檢測資料庫的好幫手