成人免费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-04-13 15:35:12

Oracle處理損壞數

2010-10-29 11:06:12

Oracle scot

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-07-06 14:40:15

解決SQL Serve

2010-06-07 13:30:15

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区在线观看视频 | 欧美一级免费看 | 国产乡下妇女做爰 | 精品久久久久一区二区国产 | 黄色av网站在线观看 | 国产免费xxx| 日本成人一区二区 | 亚洲成人一区二区 | 欧美中文字幕一区二区三区亚洲 | 一本色道精品久久一区二区三区 | 亚洲国产高清高潮精品美女 | 日韩色综合 | 国产精品成人久久久久 | 亚洲国产福利视频 | 亚洲高清在线 | 成人性视频在线播放 | 精品视频免费在线 | 91九色在线观看 | 成人免费大片黄在线播放 | 国产成人综合一区二区三区 | 91影库| 久久精品99国产精品日本 | 国产精品一区二区三 | 99国内精品久久久久久久 | 色资源在线视频 | 亚洲深夜福利 | 日韩三区 | 欧美性吧 | 亚洲免费成人 | 日韩免费一区 | 另类二区 | 日韩免费高清视频 | 精品国产精品国产偷麻豆 | 国产九九九九 | 91视在线国内在线播放酒店 | 精品国产乱码久久久久久中文 | 天天操夜夜操 | 天天操夜夜看 | 欧美一级www片免费观看 | 久久精品国产v日韩v亚洲 | 欧美激情久久久久久 |