成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析數據庫頁損壞或出錯時的處理方法

運維 數據庫運維 開發
本文將詳細介紹數據庫出現頁損壞或校驗和出錯時如何處理的方法,希望對大家有所幫助。

在管理數據庫時很容易出現問題,但是出現數據庫頁損壞或校驗錯誤時該如何解決,這也是大家需要了解的重要內容。

最近一直在進一步學習數據庫故障的處理方面的知識,做為一個數據庫維護人員,我即期望遇到所有的數據庫出錯的案例,以增加自己的經驗,但同時又擔心遇到這樣或那樣無法處理的數據庫故障而導致數據丟失。

前幾天看到一個文章,是說一個網站管理員在招聘DBA時,提出一個問題:“如果在SQL Server 日志里發現一個頁損壞或是校驗和錯誤應該如何處理?”網站管理員描述,大概有90%的應聘者都會采用一個方案,用DBCC CHECKDB加上其中的一個修復選項,但其中也基本沒有人能具體解釋DBCC CHECKDB修復的過程或是工作原理及能修復到什么程度。

借助聯機文檔以及個人的一些理解和經歷,解釋一下如何面對這個問題:"當數據庫頁損壞或校驗和出錯時如何處理?"

首先,需要先了解DBCC CHECKDB,聯機文檔url:

http://technet.microsoft.com/zh-cn/library/ms176064.aspx

通過聯機文檔,可以得知有REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD三個修復選項,而提供實際功能的只有REPAIR_ALLOW_DATA_LOSS和REPAIR_REBUILD兩個,其 中REPAIR_ALLOW_DATA_LOSS 嘗試修復報告的所有錯誤,這些修復可能會導致一些數據丟失;而且REPAIR_REBUILD執行不會丟失數據的修復,包括快速修復(如修復非聚集索引中 缺少的行)以及更耗時的修復(如重新生成索引);可見REPAIR_REBUILD是我們期望的。

當你從SQL Server log里或是在程序查詢數據庫或是定期通過DBCC CHECKDB為數據庫做體檢的時候,出現了頁損壞或校驗和出錯信息時,如:

  1. ---------------------------------------------------------------------------------------------------------------------------------  
  2. M8928sg , Level 16, State 1, Line 1  
  3. Object ID 2088535921, index ID 0, partition ID 72345201021503994, alloc unit ID 72345201051571606 (type In-row data): Page (1:94299) could not be processed.See other errors for details.  
  4. Msg 8939, Level 16, State 98, Line 1  
  5. Table error: Object ID 2088535921, index ID 0, partition ID 72345201021503994, alloc unit ID 72345201051571606 (type In-row data), page (1:94299). Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed.  
  6. CHECKDB found 0 allocation errors and 2 consistency errors in table 'yourtable' (object ID 2088535921).  
  7. CHECKDB found 0 allocation errors and 2 consistency errors in database 'yourdb'.  
  8. repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (yourdb).  
  9. --------------------------------------------------------------------------------------------------------------------------------- 

現在我們應該如何做?

1.通過上面的提示,告訴我們:對象 2088535921出錯,它是一個表,頁面為1:94299

2.接下來,我們判斷損壞的頁在堆上還是聚集索引還是非聚集索引,sql server方法為:

  1. dbcc traceon (3604, -1)  
  2. go  
  3. dbcc page('yourdb', 1, 94299, 3)  
  4. go 

在輸出的結果里(會報錯,但可以看到頁頭信息),可以看到

  1. Metadata: IndexId = n 

如果n是0而表示是堆,1表示是聚集索引,>1是表示非聚集索引

ps:其實從提示信息的Object ID 2088535921, index ID 0 ,也可以簡單判斷是堆.

3.根據上面的第2步,我們知道這個頁面是堆,這對我們來講,不是好消息,因為如果是>1,我們可以刪除該非聚集索引,再重建索引,不會丟失數據,而0或1則是元數據受損,這意味著有丟失元數據的可能性。

那么如何僅僅修復這個數據頁呢,這里我們假設該庫是full模式,并且有良好的備份策略,有全備和日志備份。

那么我們可以進行頁面級還原操作,步驟如下:

a.首先進行一次日志備份,如果你不放心,還可以再做一個全備;

backup log yourdb to disk='D:\DBBak\yourdb_a.trn'

b.通過完整備份來恢復該page. (yourdb.bak是一個全備。);

restore database yourdb page= '1:94299' from disk='D:\DBBak\yourdb.bak' with norecovery

c.恢復這個全備之后的差異(假設有差異yourdb.dif),如果沒有差異備,直接到d步驟;

restore database yourdb from disk='d:\DBBak\yourdb.dif'with norecovery

d.恢復之后的log備份,可能有多個(假設為yourdb_1.trn,yourdb_2.trn);

  1. restore log yourdb from disk='d:\DBBak\yourdb_1.trn' with norecovery  
  2. restore log yourdb from disk='d:\DBBak\yourdb_2.trn' with norecovery  
  3. restore log yourdb from disk='d:\DBBak\yourdb_a.trn' with norecovery 

e.做一個最新的日志備;

  1. backup log yourdb to disk='D:\DBBak\yourdb_e.trn' 

f.還原最后的(e步驟)日志備份;

  1. restore log yourdb from disk='d:\DBBak\yourdb_e.trn' with recovery 

g.結束

4.經過步驟三之后,我們再來檢查一下該表是否還有錯,從提示信息Object ID 2088535921里,我們查出表名tbname;

  1. tbname: select object_name(2088535921) 

然后 dbcc checktable('yourtable')檢測,如果沒有報錯,則表示修復完成

5.最后,對整個庫再做一次dbcc checkdb檢查;

ps:需要注意的是,sql server 的page級恢復在企業版和開發版中,支持聯機恢復page數據,在標準版只能脫機修復;

在dbcc checkdb修復選項里,用repair_rebuild修復數據,聯機文檔稱是不丟失數據,但在某些環境下可能也會丟失數據,不過,我沒遇到過:)

用repair_allow_data_loss選項時,聯機文檔稱可能會丟失數據,而對于堆或聚集索引的頁損壞,sql server 會釋放該頁面,造成數據的丟失,但repair_allow_data_loss選項有兩種情況是不會丟失數據,一種是非聚集索引上的頁錯誤,另外是lob頁數據錯誤。

數據庫頁損壞總結:

一定要有良好的數據庫備份策略,備份重于一切;

要有異機備份,并且時時同步該備份文件;

當數據庫出現故障時,不要過于心急,冷靜分析一下錯誤;

如果不能確定如何做,可以借助google,如果你的錯誤信息里中文的,請翻譯成英文后再google,這樣搜到解決方案的可能性更大;

做修復時,一定要再備一次數據庫;

dbcc checkdb的repair_allow_data_loss選項永遠是最后的選擇。

結束,如有錯誤,請指正。

原文標題:當數據庫出現頁損壞或校驗和出錯時如何處理

鏈接:http://www.cnblogs.com/nzperfect/archive/2009/09/27/1575102.html

【編輯推薦】

  1. MySQL蠶食Oracle市場 六成IT設施使用開源軟件
  2. 使用調度和鎖定進行MySQL查詢優化
  3. MySQL基本調度策略淺析
  4. MySQL左連接、右連接和內連接詳解
  5. MySQL數據庫性能優化的關鍵參數
責任編輯:彭凡 來源: 博客園
相關推薦

2010-04-09 14:37:08

Oracle數據庫

2011-08-03 14:02:02

數據庫連接ACCESS

2009-03-30 14:52:43

復制數據庫Oracle

2009-03-23 09:05:01

2011-07-27 15:28:10

MySQL數據庫字符編碼集

2010-03-24 09:42:12

Oracle數據庫

2009-07-20 15:14:44

iBATIS.NET連

2011-07-04 13:36:15

2010-05-20 14:25:25

2010-10-08 09:38:55

Android數據庫事

2011-01-21 11:12:01

Spring

2010-04-09 15:35:28

Oracle數據庫

2010-10-29 11:06:12

Oracle scot

2010-04-13 15:35:12

Oracle處理損壞數

2017-09-14 10:10:55

數據庫MySQL架構

2009-09-18 14:25:36

LINQ to SQL

2009-03-16 13:30:55

腳本數據字典Oracle

2010-04-26 10:52:46

Oracle 數據庫

2010-06-07 13:30:15

2016-08-23 14:25:19

MySQL約束數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99视频在线| 午夜视频网 | 夜夜骑天天干 | 国产中文字幕在线观看 | 91免费在线看 | 精品美女视频在免费观看 | chengrenzaixian| 久久大陆| 免费v片在线观看 | 亚洲看片| 天天插天天操 | 午夜久久久 | 国产精品永久免费视频 | 一区二区三区韩国 | 国产一区二区在线观看视频 | 亚洲日韩中文字幕一区 | 毛片韩国 | 特级黄一级播放 | 国产乱码精品一区二区三区忘忧草 | 一区二区三区四区在线 | 视频一区二区在线观看 | 国产成人一区二区三区 | 久久久精品一区二区三区 | 日韩一区二区三区在线播放 | 亚洲电影专区 | 午夜小视频在线播放 | 精品一区二区三区不卡 | 国产98色在线 | 日韩 | 国产精品一区二区在线 | 欧美日韩综合精品 | 亚洲 欧美 日韩在线 | 精品国产91 | 久久久91| 免费影视在线观看 | 三级视频在线观看电影 | 视频一区二区三区四区五区 | 久草网址| 成人黄色电影免费 | 亚洲成人一区二区 | 中文字幕国 | 少妇久久久久 |