天天看點

資料頁邏輯錯誤的檢查及處理方法

資料頁邏輯錯誤的檢查及處理方法

前言:資料庫越大,使用時間越長,貌似穩定性也在逐漸下降。資料頁邏輯錯誤,可能是DBA遇到比較棘手的問題之一,本文将基于實戰模式給出一些檢查及處理的方法。當然,任何方法都是受制于環境的限制,本文中介紹的方法也隻适用于某些特定環境,僅供參考;

===================華麗麗的分割線========================

前幾天碰到一個錯誤,具體資訊如下:

         SQL Server 檢測到基于一緻性的邏輯 I/O 錯誤 pageid 不正确(應為 6:49413777,但實際為 0:0)。在檔案 'M:\SQLDATA\Pk_4.ndf' 中、偏移量為 0x00005e3fd22000 的位置對資料庫 ID 5 中的頁 (6:49413777) 執行 讀取 期間,發生了該錯誤。SQL Server 錯誤日志或系統事件日志

或許這是DBA遇到比較棘手的問題之一了。萬幸的是,發生錯誤的資料庫是一個事務複制環境中的訂閱庫,而且有負載均衡扛着,基本上對業務沒有影響;

1、發現該錯誤後,第一反應是存儲(樓主的土豪公司用的是IO卡)出現邏輯錯誤,嘗試手動重新開機伺服器,讓IO卡進行自檢;進入系統後,發現問題沒有解決;

     這一步,在IO卡自檢完成進入系統後,需要進一步使用廠商提供的監控程式檢查IO卡是否有實體壞塊,并收集相關日志。經過其他同僚檢查,IO卡沒有異常報錯;

2、通過我們的監控工具定位到publication是位于Publisher_A的pk_order_BEQ_new,該publication中涉及3個表

  Order_A   \   Order_B   \   Order_C

3、在出現問題的機器上(以下稱為subscriber_A)通過select count(1) from table_name(nolock)的方式快速檢測具體是哪個表有問題;

    此處的檢測方法有局限性,初步分析如下:

  a)  如果是小表,可能在頁損壞之前有類似操作,導緻全部頁還在緩存區中,因而select count(1)是可以擷取結果的,無法判斷出該表是否存頁損壞;

  b)  如果IAM頁中還有6:49413777的資訊,且該頁還在緩存區中,也是無法判斷出該表是否存頁損壞;

  c)  如果IAM頁中沒有6:49413777的資訊,則select count(1)的時候會跳過已損壞的頁,仍然可以擷取結果,也是無法判斷出該表是否存頁損壞;

隻有當IAM頁中有6:49413777的資訊,而該頁又被交換出緩存區,需要進行實體讀的時候,才會導緻select count(1)無法擷取結果,具體情況如下:

此處檢測 Order_A正常,Order_B報錯;但這隻能證明Order_B表确實存在損壞的頁,而Order_A卻不能斷定一定是正常的;

當時的檢測辦法隻是按照select count(1)的方式,判斷出Order_B表存在壞頁;但實際上,可以從Publisher_A的distribution.dbo.msrepl_errors中擷取目前由複制引起的無法寫入損壞頁的XACT_Seqno,進而通過sp_browsereplcmds ‘XACT_Seqno’,’ XACT_Seqno’,及command_id定位到具體引起該錯誤的對象名、操作類型和主鍵值;

但此方法也有弊端,由于頁中可能存在多條記錄,如果是頁頭損壞,将導緻該頁中的所有記錄都無法讀取,而msrepl_errors重試間隔大約1分鐘,是以通過此方法确定損壞的資料頁較慢;

4、通過distribution.dbo.msrepl_errors定位到orderexpend_pop表也存在損壞頁,并定位到是由delete操作發現異常,是以修改subscriber_A上相應的複制存儲過程;

  之前采用的僅屏蔽掉IF部分的做法在此處并不适用,因為delete時的傳回資訊并不再是“影響0行記錄”,而是由于頁損壞導緻記錄無法找到并删除;

delete [dbo].[Order_A]
where [Id] = @pkc1
--if @@rowcount = 0
--    if @@microsoftversion>0x07320000
--        exec sp_MSreplraiserror 20598      

  此處為了友善後面定位可能出現的損壞頁,修改存儲過程如下:

  先建立記錄表monitor.dbo.tmp_byxl_Order_A_20140428

--CREATE TABLE monitor.dbo.tmp_byxl_Order_A_20140428 (id BIGINT,checkdate DATETIME DEFAULT GETDATE())
--再修改存儲過程
INSERT INTO monitor.dbo.tmp_byxl_Order_A_20140428(id) VALUES(@pkc1)
RETURN;
--  delete [dbo].[Order_A]
--where [Id] = @pkc1
--if @@rowcount = 0
--    if @@microsoftversion>0x07320000
--        exec sp_MSreplraiserror 20598      

  此處修改的目的:盡快跳過相應的删除操作,使Publisher_A的複制指令不緻于積壓的過多;

  對于update和insert操作也應進行相應的修改,否則将導緻後續指令延遲;

 5、考慮到DBCC checktable在執行修複時需要将資料庫改為單使用者模式,影響使用者通路,是以不作為首選修複方案;

  由于subscriber_A是負載中的讀庫,是以首先将該伺服器脫離負載環境,同時檢查是否有通過IP直連資料庫的應用,協調切串;

  如果直連的應用較多,短期内無法将連接配接串切走,可以先從上級分發重新複制一份不更名的表到subscriber_A,待資料同步後添加索引及相應的權限,再從Publisher_A上停止這個表的寫入,摘除複制後交換subscriber_A的表名,重新搭建不初始化訂閱的複制關系;這樣可以在繼續讀取舊表大部分資料的同時完成新表的初始化工作,唯一受影響的除了磁盤空間外,還有初始過程中的IO開銷;

  需要注意的是,如果publication中包含多個表,且上級釋出伺服器Publisher_A為SQLSERVER 2008 R2,則需要這個publication下所有的表都要重新初始化到新表;

  由于08 R2版本在删除article時會導緻複制事務丢失的BUG,是以,隻能按publication整體删除訂閱,是以需要以publication為機關進行資料初始化;

  關于如何實作複制訂閱端更名的表,可以看一下我之前的blog《Replication的犄角旮旯(一)--變更訂閱端表名的應用場景》

6、繼續對損壞頁進行定位,一種方法是通過DBCC CHECKTABLE,另一種方法是通過DBCC IND檢索頁的連續性;

資料頁邏輯錯誤的檢查及處理方法
資料頁邏輯錯誤的檢查及處理方法
create table dbcc_ind 
( 
  PageFID numeric(20), 
  PagePID numeric(20),  
  IAMFID numeric(20), 
  IAMPID numeric(20), 
  ObjectID numeric(20), 
  IndexID numeric(20), 
  PartitionNumber numeric(20), 
  PartitionID numeric(20),  
  iam_chain_type nvarchar(100),  
  PageType numeric(20), 
  IndexLevel numeric(20),  
  NextPageFID numeric(20), 
  NextPagePID numeric(20), 
  PrevPageFID numeric(20), 
  PrevPagePID numeric(20) 
) 

INSERT dbcc_ind 
EXEC ('DBCC IND(Pk,Order_A,1)')       

View Code

  從上圖可以看出

  第一行:PagePID=49413776,NextPagePID=49413777

  第二行:PagePID=49413778,PrevPagePID=49413777

  從49413776~49413778是本應該是連續的3個頁,但由于49413777頁損壞,無法讀取其資訊,是以缺少PagePID=49413777的記錄;

 7、使用DBCC PAGE對6:49413777檢查,頁頭部資訊已無法正确讀取;注意下圖中紅色框内的資訊

8、建立資料庫快照并備份資料庫(為了後續測試),使用DBCC CHECKTABLE(添加noindex 、with physical_only參數提高檢查效率)檢查Order_A表;用時4分鐘(2KW行記錄,資料+索引約60G),檢測結果如下:

以下測試是基于我們的一種假設,如果頁損壞發生在寫庫上(沒有其他的資料副本),想要不丢失資料的修複變得十分困難;

另外,就是我們剛更新的SQL 2012的寫庫由于有windows 2012的跨子網群集的支援,配合某C的儲存設備(基于存儲底層的block級鏡像),可實作跨機房的災備;

但對于上述問題,資料是否就安全呢?

 9、将資料備份恢複到某C裝置,通過其磁盤塊的鏡像機制同步到備用端,再啟用備用節點,發現并不能使邏輯錯誤消除;

  分析原因:基于存儲底層的block級鏡像隻是從底層對塊進行複制,而無法驗證資料邏輯級别的錯誤,是以損壞的頁并不能是以得到修複;

  是以,建議對使用C裝置的庫還需要使用alwayson或鏡像做一級保護,alwayson和鏡像中的頁修複功能可以最大限度修複此類錯誤;

10、對subscriber_A做DBCC CHECKTABE,注意修改為single_user模式,先選用repair_rebuilt模式,執行15分鐘後,提示無法進行修複;

資料頁邏輯錯誤的檢查及處理方法
資料頁邏輯錯誤的檢查及處理方法
1 消息 8939,級别 16,狀态 5,第 2 行
 2 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 (6:16320656)。測試(m_headerVersion == HEADER_7_0)失敗。值為 0 和 1。
 3         DBCC 語句的修複級别導緻避開了此修複。
 4 消息 8939,級别 16,狀态 6,第 2 行
 5 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 (6:16320656)。測試((m_type >= DATA_PAGE && m_type <= UNDOFILE_HEADER_PAGE) || (m_type == UNKNOWN_PAGE && level == BASIC_HEADER))失敗。值為 0 和 0。
 6         修複此錯誤要求首先修正其他錯誤。
 7 消息 8939,級别 16,狀态 7,第 2 行
 8 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 (6:16320656)。測試(m_freeData >= PageHeaderOverhead () && m_freeData <= (UINT)PAGESIZE - m_slotCnt * sizeof (Slot))失敗。值為 0 和 8192。
 9         修複此錯誤要求首先修正其他錯誤。
10 消息 8909,級别 16,狀态 1,第 2 行
11 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 ID (6:49413777) 在其頁頭中包含錯誤的頁 ID。頁頭中的 PageId 為 (0:0)。
12         DBCC 語句的修複級别導緻避開了此修複。
13 消息 8909,級别 16,狀态 1,第 2 行
14 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 ID (6:49430702) 在其頁頭中包含錯誤的頁 ID。頁頭中的 PageId 為 (0:0)。
15         DBCC 語句的修複級别導緻避開了此修複。
16 消息 8909,級别 16,狀态 1,第 2 行
17 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 ID (6:49478961) 在其頁頭中包含錯誤的頁 ID。頁頭中的 PageId 為 (0:0)。
18         DBCC 語句的修複級别導緻避開了此修複。
19 消息 8909,級别 16,狀态 1,第 2 行
20 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 ID (6:49895141) 在其頁頭中包含錯誤的頁 ID。頁頭中的 PageId 為 (0:0)。
21         DBCC 語句的修複級别導緻避開了此修複。
22 CHECKTABLE 發現有 0 個配置設定錯誤和 7 個一緻性錯誤與任何單個的對象都沒有關聯。
23 Order_A的 DBCC 結果。
24 消息 8928,級别 16,狀态 1,第 2 行
25 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data): 無法處理頁 (6:49413777)。有關詳細資訊,請參閱其他錯誤消息。
26         DBCC 語句的修複級别導緻避開了此修複。
27 消息 8976,級别 16,狀态 1,第 2 行
28 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。在掃描過程中未發現頁 (6:49413777),但該頁的父級 (7:49486993) 和上一頁 (6:49413776) 都引用了它。請檢查以前的錯誤消息。
29         修複此錯誤要求首先修正其他錯誤。
30 消息 8978,級别 16,狀态 1,第 2 行
31 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。頁 (6:49413778) 缺少上一頁 (6:49413777) 對它的引用。可能是鍊連結有問題。
32         修複此錯誤要求首先修正其他錯誤。
33 消息 8928,級别 16,狀态 1,第 2 行
34 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data): 無法處理頁 (6:49478961)。有關詳細資訊,請參閱其他錯誤消息。
35         修複此錯誤要求首先修正其他錯誤。
36 消息 8976,級别 16,狀态 1,第 2 行
37 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。在掃描過程中未發現頁 (6:49478961),但該頁的父級 (7:49537707) 和上一頁 (6:49478960) 都引用了它。請檢查以前的錯誤消息。
38         修複此錯誤要求首先修正其他錯誤。
39 消息 8978,級别 16,狀态 1,第 2 行
40 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。頁 (6:49478962) 缺少上一頁 (6:49478961) 對它的引用。可能是鍊連結有問題。
41         修複此錯誤要求首先修正其他錯誤。
42 消息 8928,級别 16,狀态 1,第 2 行
43 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data): 無法處理頁 (6:49841633)。有關詳細資訊,請參閱其他錯誤消息。
44         修複此錯誤要求首先修正其他錯誤。
45 消息 8939,級别 16,狀态 98,第 2 行
46 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data),頁 (6:49841633)。測試(IS_OFF (BUF_IOERR, pBUF->bstat))失敗。值為 2057 和 -4。
47         修複此錯誤要求首先修正其他錯誤。
48 消息 8976,級别 16,狀态 1,第 2 行
49 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。在掃描過程中未發現頁 (6:49841633),但該頁的父級 (7:49917538) 和上一頁 (6:49841632) 都引用了它。請檢查以前的錯誤消息。
50         修複此錯誤要求首先修正其他錯誤。
51 消息 8978,級别 16,狀态 1,第 2 行
52 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。頁 (6:49841634) 缺少上一頁 (6:49841633) 對它的引用。可能是鍊連結有問題。
53         修複此錯誤要求首先修正其他錯誤。
54 消息 8928,級别 16,狀态 1,第 2 行
55 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data): 無法處理頁 (6:49895141)。有關詳細資訊,請參閱其他錯誤消息。
56         修複此錯誤要求首先修正其他錯誤。
57 消息 8976,級别 16,狀态 1,第 2 行
58 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。在掃描過程中未發現頁 (6:49895141),但該頁的父級 (6:49912485) 和上一頁 (6:49895140) 都引用了它。請檢查以前的錯誤消息。
59         修複此錯誤要求首先修正其他錯誤。
60 消息 8978,級别 16,狀态 1,第 2 行
61 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。頁 (6:49895142) 缺少上一頁 (6:49895141) 對它的引用。可能是鍊連結有問題。
62         修複此錯誤要求首先修正其他錯誤。
63 消息 8928,級别 16,狀态 1,第 2 行
64 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data): 無法處理頁 (6:16320656)。有關詳細資訊,請參閱其他錯誤消息。
65         DBCC 語句的修複級别導緻避開了此修複。
66 消息 8976,級别 16,狀态 1,第 2 行
67 表錯誤: 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)。在掃描過程中未發現頁 (6:16320656),但該頁的父級 (7:16360354) 和上一頁 (7:50019300) 都引用了它。請檢查以前的錯誤消息。
68         修複此錯誤要求首先修正其他錯誤。
69 消息 8978,級别 16,狀态 1,第 2 行
70 表錯誤: 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)。頁 (6:49412182) 缺少上一頁 (6:49430702) 對它的引用。可能是鍊連結有問題。
71         修複此錯誤要求首先修正其他錯誤。
72 消息 8928,級别 16,狀态 1,第 2 行
73 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data): 無法處理頁 (6:49430702)。有關詳細資訊,請參閱其他錯誤消息。
74         修複此錯誤要求首先修正其他錯誤。
75 消息 8976,級别 16,狀态 1,第 2 行
76 表錯誤: 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)。在掃描過程中未發現頁 (6:49430702),但該頁的父級 (6:49434625) 和上一頁 (6:49433061) 都引用了它。請檢查以前的錯誤消息。
77         修複此錯誤要求首先修正其他錯誤。
78 消息 8978,級别 16,狀态 1,第 2 行
79 表錯誤: 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)。頁 (7:50019299) 缺少上一頁 (6:16320656) 對它的引用。可能是鍊連結有問題。
80         修複此錯誤要求首先修正其他錯誤。
81 對象 'Order_A' 的 4214698 頁中有 200428357 行。
82 CHECKTABLE 在表 'Order_A' (對象 ID 300580159)中發現 0 個配置設定錯誤和 19 個一緻性錯誤。
83 對于由 DBCC CHECKTABLE (Pk.dbo.Order_A, repair_rebuild)發現的錯誤,repair_allow_data_loss 是最低的修複級别。
84 DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理者聯系。      

11、繼續通過repair_allow_data_loss模式進行修複,執行約1小時後修複完畢,丢失記錄10條;

資料頁邏輯錯誤的檢查及處理方法
資料頁邏輯錯誤的檢查及處理方法
1 消息 8939,級别 16,狀态 5,第 1 行
  2 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 (6:16320656)。測試(m_headerVersion == HEADER_7_0)失敗。值為 0 和 1。
  3         該錯誤已修複。
  4 消息 8939,級别 16,狀态 6,第 1 行
  5 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 (6:16320656)。測試((m_type >= DATA_PAGE && m_type <= UNDOFILE_HEADER_PAGE) || (m_type == UNKNOWN_PAGE && level == BASIC_HEADER))失敗。值為 0 和 0。
  6         該錯誤已修複。
  7 消息 8939,級别 16,狀态 7,第 1 行
  8 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 (6:16320656)。測試(m_freeData >= PageHeaderOverhead () && m_freeData <= (UINT)PAGESIZE - m_slotCnt * sizeof (Slot))失敗。值為 0 和 8192。
  9         該錯誤已修複。
 10 消息 8909,級别 16,狀态 1,第 1 行
 11 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 ID (6:49413777) 在其頁頭中包含錯誤的頁 ID。頁頭中的 PageId 為 (0:0)。
 12         該錯誤已修複。
 13 消息 8909,級别 16,狀态 1,第 1 行
 14 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 ID (6:49430702) 在其頁頭中包含錯誤的頁 ID。頁頭中的 PageId 為 (0:0)。
 15         該錯誤已修複。
 16 消息 8909,級别 16,狀态 1,第 1 行
 17 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 ID (6:49478961) 在其頁頭中包含錯誤的頁 ID。頁頭中的 PageId 為 (0:0)。
 18         該錯誤已修複。
 19 消息 8909,級别 16,狀态 1,第 1 行
 20 表錯誤: 對象 ID 0,索引 ID -1,分區 ID 0,配置設定單元 ID 0 (類型為 Unknown),頁 ID (6:49895141) 在其頁頭中包含錯誤的頁 ID。頁頭中的 PageId 為 (0:0)。
 21         該錯誤已修複。
 22 CHECKTABLE 發現有 0 個配置設定錯誤和 7 個一緻性錯誤與任何單個的對象都沒有關聯。
 23 CHECKTABLE 修複了 0 個配置設定錯誤和 7 個一緻性錯誤,這些錯誤不與任何單個對象相關聯。
 24 Order_A的 DBCC 結果。
 25 修複: 已為資料庫 'Pk' 中的對象 'dbo.Order_A' 成功地重新生成了 Clustered 索引。
 26 修複: 頁 (6:49413777) 已從對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)釋放。
 27 修複: 頁 (6:49478961) 已從對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)釋放。
 28 修複: 頁 (6:49841633) 已從對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)釋放。
 29 修複: 頁 (6:49895141) 已從對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)釋放。
 30 修複: 已為資料庫 'Pk' 中的對象 'dbo.Order_A, idx_Order_A_ck_new_orderid' 成功地重新生成了 Nonclustered 索引。
 31 修複: 頁 (6:16320656) 已從對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)釋放。
 32 修複: 頁 (6:49430702) 已從對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)釋放。
 33 修複: 已為資料庫 'Pk' 中的對象 'dbo.Order_A, idx_Order_A_venderid_orderid' 成功地重新生成了 Nonclustered 索引。
 34 消息 8945,級别 16,狀态 1,第 1 行
 35 表錯誤: 将重新生成對象 ID 300580159,索引 ID 1。
 36         該錯誤已修複。
 37 消息 8928,級别 16,狀态 1,第 1 行
 38 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data): 無法處理頁 (6:49413777)。有關詳細資訊,請參閱其他錯誤消息。
 39         該錯誤已修複。
 40 消息 8976,級别 16,狀态 1,第 1 行
 41 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。在掃描過程中未發現頁 (6:49413777),但該頁的父級 (7:49486993) 和上一頁 (6:49413776) 都引用了它。請檢查以前的錯誤消息。
 42         該錯誤已修複。
 43 消息 8978,級别 16,狀态 1,第 1 行
 44 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。頁 (6:49413778) 缺少上一頁 (6:49413777) 對它的引用。可能是鍊連結有問題。
 45         該錯誤已修複。
 46 消息 8928,級别 16,狀态 1,第 1 行
 47 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data): 無法處理頁 (6:49478961)。有關詳細資訊,請參閱其他錯誤消息。
 48         該錯誤已修複。
 49 消息 8976,級别 16,狀态 1,第 1 行
 50 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。在掃描過程中未發現頁 (6:49478961),但該頁的父級 (7:49537707) 和上一頁 (6:49478960) 都引用了它。請檢查以前的錯誤消息。
 51         該錯誤已修複。
 52 消息 8978,級别 16,狀态 1,第 1 行
 53 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。頁 (6:49478962) 缺少上一頁 (6:49478961) 對它的引用。可能是鍊連結有問題。
 54         該錯誤已修複。
 55 消息 8928,級别 16,狀态 1,第 1 行
 56 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data): 無法處理頁 (6:49841633)。有關詳細資訊,請參閱其他錯誤消息。
 57         該錯誤已修複。
 58 消息 8939,級别 16,狀态 98,第 1 行
 59 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data),頁 (6:49841633)。測試(IS_OFF (BUF_IOERR, pBUF->bstat))失敗。值為 2057 和 -4。
 60         該錯誤已修複。
 61 消息 8976,級别 16,狀态 1,第 1 行
 62 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。在掃描過程中未發現頁 (6:49841633),但該頁的父級 (7:49917538) 和上一頁 (6:49841632) 都引用了它。請檢查以前的錯誤消息。
 63         該錯誤已修複。
 64 消息 8978,級别 16,狀态 1,第 1 行
 65 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。頁 (6:49841634) 缺少上一頁 (6:49841633) 對它的引用。可能是鍊連結有問題。
 66         該錯誤已修複。
 67 消息 8928,級别 16,狀态 1,第 1 行
 68 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data): 無法處理頁 (6:49895141)。有關詳細資訊,請參閱其他錯誤消息。
 69         該錯誤已修複。
 70 消息 8976,級别 16,狀态 1,第 1 行
 71 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。在掃描過程中未發現頁 (6:49895141),但該頁的父級 (6:49912485) 和上一頁 (6:49895140) 都引用了它。請檢查以前的錯誤消息。
 72         該錯誤已修複。
 73 消息 8978,級别 16,狀态 1,第 1 行
 74 表錯誤: 對象 ID 300580159,索引 ID 1,分區 ID 72057594125221888,配置設定單元 ID 72057594134265856 (類型為 In-row data)。頁 (6:49895142) 缺少上一頁 (6:49895141) 對它的引用。可能是鍊連結有問題。
 75         該錯誤已修複。
 76 消息 8945,級别 16,狀态 1,第 1 行
 77 表錯誤: 将重新生成對象 ID 300580159,索引 ID 2。
 78         該錯誤已修複。
 79 消息 8928,級别 16,狀态 1,第 1 行
 80 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data): 無法處理頁 (6:16320656)。有關詳細資訊,請參閱其他錯誤消息。
 81         該錯誤已修複。
 82 消息 8976,級别 16,狀态 1,第 1 行
 83 表錯誤: 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)。在掃描過程中未發現頁 (6:16320656),但該頁的父級 (7:16360354) 和上一頁 (7:50019300) 都引用了它。請檢查以前的錯誤消息。
 84         該錯誤已修複。
 85 消息 8978,級别 16,狀态 1,第 1 行
 86 表錯誤: 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)。頁 (6:49412182) 缺少上一頁 (6:49430702) 對它的引用。可能是鍊連結有問題。
 87         該錯誤已修複。
 88 消息 8928,級别 16,狀态 1,第 1 行
 89 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data): 無法處理頁 (6:49430702)。有關詳細資訊,請參閱其他錯誤消息。
 90         該錯誤已修複。
 91 消息 8976,級别 16,狀态 1,第 1 行
 92 表錯誤: 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)。在掃描過程中未發現頁 (6:49430702),但該頁的父級 (6:49434625) 和上一頁 (6:49433061) 都引用了它。請檢查以前的錯誤消息。
 93         該錯誤已修複。
 94 消息 8978,級别 16,狀态 1,第 1 行
 95 表錯誤: 對象 ID 300580159,索引 ID 2,分區 ID 72057594132299776,配置設定單元 ID 72057594142720000 (類型為 In-row data)。頁 (7:50019299) 缺少上一頁 (6:16320656) 對它的引用。可能是鍊連結有問題。
 96         該錯誤已修複。
 97 消息 8945,級别 16,狀态 1,第 1 行
 98 表錯誤: 将重新生成對象 ID 300580159,索引 ID 7。
 99         該錯誤已修複。
100 對象 'Order_A' 的 4214698 頁中有 200428357 行。
101 CHECKTABLE 在表 'Order_A' (對象 ID 300580159)中發現 0 個配置設定錯誤和 19 個一緻性錯誤。
102 CHECKTABLE 在表 'Order_A' (對象 ID 300580159)中修複了 0 個配置設定錯誤和 19 個一緻性錯誤。
103 DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理者聯系。      

結論:

  1、建議對寫庫搭建同步的鏡像或alwayson環境(優先選用同步模式),以最大限度的保證資料不丢失;

  2、如讀庫遇到此類問題,先重新開機伺服器,讓儲存設備自檢,确認無法修複的,再進行脫離負載、通知研發切串的操作;

  3、盡量避免直接DBCC CHECKTABLE的修複操作,因為這樣的操作需要在單使用者模式下執行;首選通過複制對異常的表進行更名的初始化,實作資料頁的修複;

  4、即便定位到哪些記錄存在于損壞頁中,也無法通過重新導入資料或重建聚集索引實作修複功能;

繼續閱讀