天天看點

MS SQL Server 2000 DBCC 簡介

MS SQL Server 2000 DBCC 簡介

        今天跟“雲網首席程式員”旺旺(點選進入旺旺部落格)聊天,發現自己好久沒有發表技術類文章了,有點對不起程式員朋友們了,(呵呵,自大的家夥)。

        前些天一個好朋友的SQL SERVER 2000資料庫崩潰了,詢問我如何解決。錯誤号為8925,資料庫無法使用。這個問題以前(兩年前了,嘿嘿,時間飛度啊)我曾經碰到過,并解決過,這裡小結一下吧,希望在大家碰到類似問題的時候能提供幫助。

        一般來說,這種錯誤主要是由于資料庫在存儲資料過程中發生的硬性錯誤,而且多數是由于索引錯誤引起的。SQL SERVER DBCC指令集就是這樣一套提供檢查資料庫錯誤并修複錯誤的工具集。作為DBA的同志們應該一個月至少執行一次DBCC指令差錯并修複錯誤。

        注意:特别地,本文為針對資料庫錯誤号為8925、8935、8956的解決方案。且建議做好資料庫的備份工作。

------------------------------------------------------------

錯誤描述:

錯誤 8925

嚴重級别 16

消息正文

表錯誤:跨對象連結:頁 %1!,槽 %2!(位于對象 ID %3!,索引 ID %4! 中)指向了頁 %5!,槽 %6!(位于對象 ID %7!,索引 ID %8! 中)。

解釋

當 Microsoft? SQL Server? 在與表關聯的一個頁鍊的頁連結中檢測到不一緻時會出現該錯誤。發現某一頁在本應該隻連結一個鍊時連結了多個頁鍊。表資料具有一個雙向連結頁鍊,每個索引級别也具有一個這樣的頁鍊。

重要  這屬于嚴重錯誤,必須立即更正。

如果不帶修複子句的 DBCC CHECKDB 在運作時處理期間檢測到該錯誤,還會出現錯誤 605。

錯誤 8956

嚴重級别 16

消息正文

索引行 (%1!:%2!:%3!)(其值為 %4!)指向由 %5! 辨別的資料行。

解釋

如果 Microsoft? SQL Server? 傳回該錯誤資訊,通常是在錯誤 8952 之後。

該錯誤資訊表明一個或多個索引損壞,必須進行修複或除去。

對策

通過執行帶有 REPAIR_ALLOW_DATA_LOSS、REPAIR_FAST 或 REPAIR_REBUILD 子句的 DBCC CHECKDB 來修複索引。若要确定最符合需要的修複子句,執行前請參考 DBCC CHECKDB。

重要  如果執行帶有修複子句之一的 DBCC CHECKDB 未更正索引問題,或者您不确定帶有修複子句的 DBCC CHECKDB 對資料的作用,請與您的主要支援提供者聯系。

------------------------------------------------------------

--示例解決方案(在查詢分析器中執行)

--将資料庫狀态置為單使用者模式(必須)

ALTER DATABASE YourDataBaseName SET SINGLE_USER

GO

--修複資料庫

DBCC CHECKDB('YourDataBaseName',REPAIR_ALLOW_DATA_LOSS)

GO

--将資料庫狀态置為多使用者模式(必須)

ALTER DATABASE YourDataBaseName SET MULTI_USER

GO

------------------------------------------------------------

--MS SQL Server 2000 Help 相關說明

DBCC CHECKDB

檢查指定資料庫中的所有對象的配置設定和結構完整性。

文法

DBCC CHECKDB

    ( 'database_name'

            [ , NOINDEX

                | { REPAIR_ALLOW_DATA_LOSS

                    | REPAIR_FAST

                    | REPAIR_REBUILD

                    } ]

    )    [ WITH { [ ALL_ERRORMSGS ]

                    [ , [ NO_INFOMSGS ] ]

                    [ , [ TABLOCK ] ]

                    [ , [ ESTIMATEONLY ] ]

                    [ , [ PHYSICAL_ONLY ] ]

                    }

        ]

參數

'database_name'

是要對其中的所有對象配置設定和結構完整性進行檢查的資料庫。如果未指定,則預設為目前資料庫。資料庫名稱必須符合辨別符的規則。有關更多資訊,請參見使用辨別符。

NOINDEX

指定不檢查非系統表的非聚集索引。NOINDEX 減少執行總時間,因為它不對使用者定義的表的非聚集索引進行檢查。NOINDEX 對系統表沒有影響,因為 DBCC CHECKDB 總是對所有系統表索引進行檢查。

REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD

指定 DBCC CHECKDB 修複發現的錯誤。給定的 database_name 必須在單使用者模式下以使用修複選項,它可以是下列值之一。

值 描述

REPAIR_ALLOW_DATA_LOSS 執行由 REPAIR_REBUILD 完成的所有修複,包括對行和頁進行配置設定和取消配置設定以改正配置設定錯誤、結構行或頁的錯誤,以及删除已損壞的文本對象。這些修複可能會導緻一些資料丢失。修複操作可以在使用者事務下完成以允許使用者復原所做的更改。如果復原修複,則資料庫仍會含有錯誤,應該從備份進行恢複。如果由于所提供修複等級的緣故遺漏某個錯誤的修複,則将遺漏任何取決于該修複的修複。修複完成後,備份資料庫。

REPAIR_FAST 進行小的、不耗時的修複操作,如修複非聚集索引中的附加鍵。這些修複可以很快完成,并且不會有丢失資料的危險。

REPAIR_REBUILD 執行由 REPAIR_FAST 完成的所有修複,包括需要較長時間的修複(如重建索引)。執行這些修複時不會有丢失資料的危險。

WITH

指定有關下列内容的選項:傳回錯誤資訊的數量、獲得的鎖或估計的 tempdb 要求。

ALL_ERRORMSGS

顯示每個對象不受限制的錯誤數。如果沒有指定 ALL_ERRORMSGS,每個對象至多顯示 200 個錯誤資訊。按對象 ID 對錯誤資訊進行排序(從 tempdb 中生成的消息除外)。

NO_INFOMSGS

禁止顯示所有資訊性消息(嚴重級别 10)和關于所用空間的報告。

TABLOCK

導緻 DBCC CHECKDB 獲得共享表鎖。TABLOCK 可使 DBCC CHECKDB 在負荷較重的資料庫上運作得更快,但 DBCC CHECKDB 運作時會減少資料庫上可獲得的并發性。

ESTIMATE ONLY

顯示估計的 tempdb 空間大小,要運作帶有所有其它指定選項的 DBCC CHECKDB 則需要該空間。不執行該檢查。

PHYSICAL_ONLY

僅限于檢查頁和記錄标題實體結構的完整性,以及頁對象 ID 和索引 ID 與配置設定結構之間的一緻性。該檢查旨在以較低的開銷檢查資料庫的實體一緻性,同時還檢測會危及使用者資料安全的殘缺頁和常見的硬體故障。PHYSICAL_ONLY 始終意味着 NO_INFOMSGS,并且不能與任何修複選項一起使用。

注釋

DBCC CHECKDB 對索引視圖執行實體一緻性檢查。隻用于向後相容的 NOINDEX 選項也适用于索引視圖上的任何輔助索引。

DBCC CHECKDB 是最安全的修複語句,因為它對最多的可能出現的各種錯誤進行辨別和修複。如果隻報告資料庫中有配置設定錯誤,請執行帶修複選項的 DBCC CHECKALLOC 以對這些錯誤進行修複。然而,若要確定正确修複所有錯誤(包括配置設定錯誤),請執行帶修複選項的 DBCC CHECKDB,而不要執行帶修複選項的 DBCC CHECKALLOC。

DBCC CHECKDB 對資料庫中所有内容的完整性進行驗證。如果目前正在執行或最近已執行 DBCC CHECKDB,則不需要運作 DBCC CHECKALLOC 或 DBCC CHECKTABLE。

DBCC CHECKDB 執行同樣的檢查,仿佛是對資料庫中的每個表執行 DBCC CHECKALLOC 語句和 DBCC CHECKTABLE 語句。

預設情況下,DBCC CHECKDB 不擷取表鎖。但它擷取架構鎖,該鎖防止對中繼資料進行更改,但允許更改資料。擷取的架構鎖将防止使用者得到排它表鎖,在生成聚集索引、除去任何索引或截斷表時需要排它表鎖。

DBCC 語句收集資訊,然後掃描日志以查找所做的任何其它更改,并在掃描的結尾将兩組資訊合并在一起以産生資料的一緻視圖。

如果指定 TABLOCK 選項,DBCC CHECKDB 将擷取共享表鎖。這樣可允許某些類别的錯誤有更詳細的錯誤資訊,并通過避免使用事務日志資料而将所要求的 tempdb 空間大小降為最低。TABLOCK 選項不阻止日志截斷并使指令可以更快地運作。

DBCC CHECKDB 對資料庫中每個表的 text、ntext 和 image 頁的連結和大小及資料庫中所有頁的配置設定進行檢查。

對于資料庫中每個表,DBCC CHECKDB 檢查其:

索引和資料頁是否已正确連結。

索引是否按照正确的順序排列。

各指針是否一緻。

每頁上的資料是否均合理。

頁面偏移量是否合理。

錯誤表示資料庫中的潛在問題,應該立即改正。

預設情況下,DBCC CHECKDB 對對象執行并行檢查。并行度由查詢處理器自動确定。最大并行度的配置方式與并行查詢相同。使用 sp_configure 系統存儲過程限制可用于 DBCC 檢查的最大處理器數。有關更多資訊,請參見 max degree of parallelism 選項。

使用跟蹤标記 2528 可禁用并行檢查。有關更多資訊,請參見跟蹤标記。

結果集

不管是否指定任何選項(NO_INFOMSGS 或 NOINDEX 選項除外),如果未指定資料庫,DBCC CHECKDB 傳回目前資料庫的以下結果集(值可能會變化):

DBCC results for 'master'.

DBCC results for 'sysobjects'.

There are 862 rows in 13 pages for object 'sysobjects'.

DBCC results for 'sysindexes'.

There are 80 rows in 3 pages for object 'sysindexes'.

'...'

DBCC results for 'spt_provider_types'.

There are 23 rows in 1 pages for object 'spt_provider_types'.

CHECKDB found 0 allocation errors and 0 consistency errors in database 'master'.

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定 NO_INFOMSGS 選項,DBCC CHECKDB 将傳回以下結果集(消息):

The command(s) completed successfully.

如果指定 ESTIMATEONLY 選項,DBCC CHECKDB 将傳回以下結果集。

Estimated TEMPDB space needed for CHECKALLOC (KB)

-------------------------------------------------

13

(1 row(s) affected)

Estimated TEMPDB space needed for CHECKTABLES (KB)

--------------------------------------------------

57

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

權限

DBCC CHECKDB 權限預設授予 sysadmin 固定伺服器角色或 db_owner 固定資料庫角色的成員且不可轉讓。

------------------------------------------------------------