在管理数据库时很容易出现问题,但是出现数据库页损坏或校验错误时该如何解决,这也是大家需要了解的重要内容。
最近一直在进一步学习数据库故障的处理方面的知识,做为一个数据库维护人员,我即期望遇到所有的数据库出错的案例,以增加自己的经验,但同时又担心遇到这样或那样无法处理的数据库故障而导致数据丢失。
前几天看到一个文章,是说一个网站管理员在招聘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为数据库做体检的时候,出现了页损坏或校验和出错信息时,如:
--------------------------------------------------------------------------------------------------------------------------------- M8928sg,Level16,State1,Line1 ObjectID2088535921,indexID0,partitionID72345201021503994,allocunitID72345201051571606(typeIn-rowdata):Page(1:94299)couldnotbeprocessed.Seeothererrorsfordetails. Msg8939,Level16,State98,Line1 Tableerror:ObjectID2088535921,indexID0,partitionID72345201021503994,allocunitID72345201051571606(typeIn-rowdata),page(1:94299).Test(IS_OFF(BUF_IOERR,pBUF-> bstat))failed. CHECKDBfound0allocationerrorsand2consistencyerrorsintable'yourtable'(objectID2088535921). CHECKDBfound0allocationerrorsand2consistencyerrorsindatabase'yourdb'. repair_allow_data_lossistheminimumrepairlevelfortheerrorsfoundbyDBCCCHECKDB(yourdb). ---------------------------------------------------------------------------------------------------------------------------------
现在我们应该如何做?
1.
转载请注明:IT运维空间 » 运维技术 » 浅析数据库页损坏或出错时的处理方法
发表评论