1. 程式人生 > >Sql Server實用操作-資料庫一致性檢測工具(DBCC)

Sql Server實用操作-資料庫一致性檢測工具(DBCC)

在危急時刻,資料庫一致性檢測(DBCC)可能是你最重要的工具。本文向你簡單介紹DBCC的功能,它們包括: 檢測表和相關目錄的完整性。 
檢測整個資料庫。 
檢測資料庫頁的完整性。 
重建任何指定表中的目錄。 
你為何需要學習DBCC 如果你甚至還不知道為何使用DBCC,下面提供一些原因: 需要不斷分割資料庫頁(表和目錄),這可能會破壞分配。 
目錄可能遭到破壞,或效率降低。 
SQL Server引擎有時會誤解你的意圖。 
需要大量更新時,事情可能會很麻煩(記住,任何指定的更新實際為刪除和插入)。 
單個頁面,雖然仍然“健康”,但可能會失去它們的最優儲存足跡。 如何執行DBCC 
你可以用兩種方法執行DBCC:通過命令列視窗或查詢分析器(Query Analyzer)視窗。如果你認為必要,你還可以確定其操作的時間。(我從未感到有必要這樣做,因為在微軟的所有產品中,我對SQL Server的穩定性最為自信。我認為它是雷蒙德推出的最佳產品。但是,感覺也可能出錯。) DBCC命令包括以下擴充套件: CheckDB:檢測整個資料庫的一致性,是檢查資料庫破壞的基本方法。 
CheckTable:檢測特定表的問題。 
CheckAlloc:檢測資料庫的單個頁面,包括表和目錄。 
Reindex:重建某個特定表的目錄。 
CacheStats:說明當前儲存在記憶體快取中的物件。 
DropCleanBuffers:釋放當前儲存在緩衝區中的所有資料,這樣你就可以繼續進行檢測,而不必使用前面的結果。 
Errorlog:刪除(縮短)當前日誌。你可以考慮確定包含這個命令的操作的時間,一個星期左右執行一次。 
FlushProclnDB:清除特定資料庫的儲存過程快取(使用它的資料庫id而不是名稱)。使用下列程式碼找出id: SELECT dbid FROM master.dbo.sysdatabases WHERE name = '<name your poison> IndexDefrag:減少目錄分裂,但不給檔案加鎖,以便使用者能夠繼續應用資料庫。 
CheckCatalog:檢測特定資料庫表及表之間的一致性(後者意味著使用外來鍵等。)
如何使用這五個擴充套件 DBCC首先建立一個數據庫快照(在某些情況下,如應用一個Master、TempDB或只讀資料庫時)。附帶條件:要使用DBCC,資料庫必須處於單使用者模式。 使用DBCC CheckDB 此命令保證: 資料與目錄頁正確連線。 
目錄被正確分類,並保持最新。 
指標一致。 
每個頁面的資料保持最新。 
頁面偏移值保持最新。 
以下是使用CheckDB的最常見方法: DBCC CHECKDB ('AdventureWorks', REPAIR_FAST) DBCC CHECKDB ('AdventureWorks', REPAIR_REBUILD) DBCC CHECKDB ('AdventureWorks', REPAIR_ALLOW_DATA_LOSS) 你還可以指定其它幾個選項,但以上是三個最重要的選項。我按順序列出這些DBCC命令, 你應該先執行它們,然後檢查結果。前兩個選項不會造成資料損失,但第三個選項會引起資料損失。因此建議把第三個命令放在一個事務內,如果資料損失不可接受,你可以執行一次回滾(ROLLBACK)。 使用DBCC CheckTable 大多數情況下,你遇到的問題往往與資料庫中的一個或幾個表,而不是整個資料庫有關。這時即可執行CheckTable。首先,使用相關資料庫,然後執行DBCC CheckTable命令。下面是兩個例子: DBCC CheckTable ('Sales,SalesOrderHeader') DBCC CheckTable ('Sales,SalesOrderHeader', REPAIR_REBUILD) 使用DBCC CheckAlloc 這個命令檢測資料頁及其目錄的一致性。下面是兩個例子: DBCC CHECKALLOC ('Sales.SalesOrderDetails') DBCC CHECKALLOC ('Sales.SalesOrderDetails', REPAIR_REBUILD) 使用DBCC CheckCatalog 使用這個命令來驗證一個數據庫系統表的一致性。你指定資料庫的名稱進行檢查,自變數WITH NO_INFOMSGS可選。下面是一個例子: DBCC CHECKCATALOG ('AdventureWorks') 使用DBCC ReIndex 這個命令促使某個特定的表或檢視中的一個或幾個目錄進行重建。你還可以應用某個特定目錄的名稱和填充係數。列表A中包含兩個例子。第三個自變數說明我希望使用重建目錄中的一個90%的填充係數。 一 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命令分類 維護語句DBCC DBREINDEX 重建指定資料庫中表的一個或多個索引
DBCC DBREPAIR 除去損壞的資料庫 
DBCC INDEXDEFRAG 整理指定的表或檢視的聚集索引和輔助索引碎片
DBCC SHRINKDATABASE 收縮指定資料庫中的資料檔案大小
DBCC SHRINKFILE 收縮相關資料庫的指定資料檔案或日誌檔案大小
DBCC UPDATEUSAGE 報告和更正 sysindexes 表的不正確內容,
該內容可能會導致通過 sp_spaceused 
系統儲存過程產生不正確的空間使用報表 狀態語句DBCC INPUTBUFFER 顯示從客戶端傳送到MS SQL Server 的最後一個語句
DBCC OPENTRAN 如果在指定資料庫記憶體在最舊的活動事務和最舊的分佈和 非分散式複製事務, 則顯示與之相關的資訊。只有當存在活動事務或資料庫包含複製資訊時, 才顯示結果。如果沒有活動事務,就顯示資訊性訊息
DBCC OUTPUTBUFFER 以十六進位制或 ASCII 格式返回指定系統程序 ID (SPID) 的當前輸出緩衝區
DBCC PROCCACHE 以報表形式顯示有關過程快取記憶體的資訊
DBCC SHOWCONTIG 顯示指定的表的資料和索引的碎片資訊
DBCC SHOW_STATISTICS 顯示指定表上的指定目標的當前分佈統計資訊
DBCC SQLPERF 提供有關所有資料庫中的事務日誌空間使用情況的統計資訊
DBCC TRACESTATUS 顯示跟蹤標記的狀態
DBCC USEROPTIONS 返回當前連線的活動(設定)的 SET 選項
驗證語句DBCC CHECKALLOC 檢查指定資料庫的磁碟空間分配結構的一致性
DBCC CHECKCATALOG 檢查指定資料庫中的系統表內及系統表間的一致性
DBCC CHECKCONSTRAINTS 檢查指定表上的指定約束或所有約束的完整性
DBCC CHECKDB 檢查指定資料庫中的所有物件的分配和結構完整性
DBCC CHECKFILEGROUP 檢查指定檔案組中的所有表(在當前資料庫中)的分配和結構完整性
DBCC CHECKIDENT 檢查指定表的當前標識值,如有必要,還對標識值進行更正 DBCC CHECKTABLE 檢查指定表或索引檢視的資料、索引及 text、ntext 和 image 頁的完整性
DBCC NEWALLOC 檢查資料庫的擴充套件結構內的每個表的資料和索引頁的分配 其他語句
DBCC dllname (FREE) 從記憶體中解除安裝指定的擴充套件儲存過程動態連結庫 (DLL)
DBCC HELP 返回指定的 DBCC 語句的語法資訊
DBCC PINTABLE 將表標記為駐留,這表示MS SQL Server不從記憶體中重新整理表頁
DBCC ROWLOCK 在MS SQL Server 6.5 版中使用,對錶啟用插入行鎖定 (IRL) 操作
DBCC TRACEOFF 禁用指定的跟蹤標記
DBCC TRACEON 開啟(啟用)指定的跟蹤標記
DBCC UNPINTABLE 將表標記為不在記憶體駐留。將表標記為不在記憶體駐留後,
可以清空快取記憶體中的表頁