WEB开发网
开发学院数据库MSSQL Server 当数据库出现页损坏或校验和出错时如何处理 阅读

当数据库出现页损坏或校验和出错时如何处理

 2009-09-28 00:00:00 来源:WEB开发网   
核心提示: 现在我们应该如何做?1.通过上面的提示,告诉我们:对象 2088535921出错,当数据库出现页损坏或校验和出错时如何处理(2),它是一个表,页面为1:942992.接下来,结束,如有错误,我们判断损坏的页在堆上还是聚集索引还是非聚集索引,sql server方法为:dbcctraceon(36

现在我们应该如何做?

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.dif),如果没有差异备,直接到d步骤;
    restore database yourdb from disk='d:\DBBak\yourdb.dif'  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.结束
4.经过步骤三之后,我们再来检查一下该表是否还有错,从提示信息Object ID 2088535921里,我们查出表名tbname;
    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选项永远是最后的选择。

结束,如有错误,请指正。

上一页  1 2 

Tags:数据库 出现 损坏

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接