数据库连接出错:浅析数据库页损坏或出错时的处理思路方法

  在管理数据库时很容易出现问题但是出现数据库页损坏或校验时该如何解决这也是大家需要了解重要内容

  最近直在进步学习数据库故障处理方面知识做为个数据库维护人员我即期望遇到所有数据库出错案例以增加自己经验但同时又担心遇到这样或那样无法处理数据库故障而导致数据丢失

  前几天看到个文章是说个网站WebSite管理员在招聘DBA时提出个问题:“如果在SQL Server 日志里发现个页损坏或是校验和应该如何处理?”网站WebSite管理员描述大概有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 3个修复选项而提供实际功能只有REPAIR_ALLOW_DATA_LOSS和REPAIR_REBUILD两个其 中REPAIR_ALLOW_DATA_LOSS 尝试修复报告所有这些修复可能会导致些数据丢失;而且REPAIR_REBUILD执行不会丢失数据修复包括快速修复(如修复非聚集索引中 缺少行)以及更耗时修复(如重新生成索引);可见REPAIR_REBUILD是我们期望

当你从SQL Server log里或是在查询数据库或是定期通过DBCC CHECKDB为数据库做体检时候出现了页损坏或校验和出错信息时如:

---------------------------------------------------------------------------------------------------------------------------------  M8928sg , Level 16, State 1, Line 1  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.  Msg 8939, Level 16, State 98, Line 1  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.  CHECKDB found 0 allocation errors and 2 consistency errors in table 'yourtable' (object ID 2088535921).  CHECKDB found 0 allocation errors and 2 consistency errors in database 'yourdb'.  repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (yourdb).  --------------------------------------------------------------------------------------------------------------------------------- 现在我们应该如何做?

  1.通过上面提示告诉我们:对象 2088535921出错它是个表页面为1:94299

  2.接下来我们判断损坏页在堆上还是聚集索引还是非聚集索引sql server思路方法为:

dbcc traceon (3604, -1)  go  dbcc page('yourdb', 1, 94299, 3)  go 在输出结果里(会报错但可以看到页头信息)可以看到

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.d)如果没有差异备直接到d步骤;

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

d.恢复的后log备份,可能有多个(假设为yourdb_1.trn,yourdb_2.trn);

restore log yourdb from disk='d:\DBBak\yourdb_1.trn' with norecovery  restore log yourdb from disk='d:\DBBak\yourdb_2.trn' with norecovery  restore log yourdb from disk='d:\DBBak\yourdb_a.trn' with norecovery e.做个最新日志备;

backup log yourdb to disk='D:\DBBak\yourdb_e.trn' f.还原最后(e步骤)日志备份;

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

 



Tags:  数据库损坏 数据库已损坏 数据库损坏怎么办 数据库连接出错

延伸阅读

最新评论

发表评论