昨天在工作中遇到一个情况,就是Development环境中的某台服务器上的某个数据库进入了Suspect状态。以前看书倒是知道说这个状态,不过实际工作当中从来没有遇到过。那么一些背景情况是这样的。

环境:Development

数据库产品:SQL Server 2008 R2

数据库业务类型:DataWare House

数据库恢复模式:Simple

备份情况:每天就一个备份

在Google上查询了相关资料加上自己对于这种情况已有的储备知识,首先我第一部先到SQL Server Log里面查找最近关于这个数据库的一些报错信息,定位到到底是为什么还有何时发生的?

从SQL Server Log我找到了这样一些日志记录。 原因是在6月13号这台服务器的SQL Server重启时在CHECKDB命令检查这个数据库时发现了Error。很可能就是这台服务器意外重启而导致了这个很可能是一致性检查不通过的问题。更糟糕的在后面。

这里有几个链接来自Microsoft的BOL。里面讲了上图提示的两个Error的cause和fix/resolution

https://support.microsoft.com/en-us/kb/2015753

https://technet.microsoft.com/zh-cn/library/ff713991(v=sql.105).aspx

https://support.microsoft.com/en-us/kb/2015741

这个时候应该是尽可能对该数据库运行DBCC CHECKDB来确定遇到一致性问题的页面数量(范围)。这个时候我需要先把数据库切换到EMERGENCY模式才可能访问数据库。

ALTER DATABASE [YourDatabase] SET EMERGENCY

然后我运行了DBCC checkdb来定位问题页面
DBCC checkdb([YourDatabase])

命令输出了下面的信息:

Msg 7987, Level 16, State 1, Line 1
System table pre-checks: Object ID 5 has chain linkage mismatch. (1:29885)->next = (1:28340), but (1:28340)->prev = (1:28339). Check statement terminated due to unrepairable error.
DBCC results for 'XXXX'.
CHECKDB found 0 allocation errors and 0 consistency errors in database 'XXXX'.

很明显可以看到某个数据库表对象两个页面的前后指向出了问题,没办法match上。感兴趣的你可以用DBCC PAGE打开上提到的几个页面去看下里面页头的内容。不过我觉得糟糕的是这个Object_ID = 5的信息。这意味着这个对象很可能是张系统表。我觉得它糟糕的原因是因为即便这时我做最坏的打算用DBCC CheckDB ([YourDatabase], REPAIR_ALLOW_DATA_LOSS)来解决这个问题,也还是不成,因为DBCC CHECKDB存在很多限制,并不是说所有的表都可以repair的,其中就包括system table。DBCC CHECKDB的作者在他的一篇博文中讲到了这点。因为系统表本身就是SQL Server用来存储用户表元数据的地方,一旦某张系统表出现问题而强制repair这种系统表不就是意味着要把有问题的页面删掉,而页面中涉及到的用户表也需要被删掉来保证一致性呢。这样的结果显然完全无法接受。不过即便如此,这样的答案还是令人沮丧的。因为这就是意味着除非恢复备份,否则这张系统表将无法得救。幸运的是,如果坏的是某些页面像GAM,SCAM,PFS这样的页面,那将是顶级灾难。必须完全恢复整个数据库。而至少现在我有个想法,就是利用SQL Server的PAGE RESTORE,只恢复特定的页面。这点我不晓得行不行得通,毕竟页面是某张系统表的。以后找个时间试下。

http://www.sqlskills.com/blogs/paul/checkdb-from-every-angle-can-checkdb-repair-everything/

这里还有作者讲的另外一篇关于corruption的文章:http://www.sqlskills.com/blogs/paul/corruption-demo-databases-and-scripts/

上面说了那么多,为了验证确实没办法repair一张系统表的页面,我也试了一下,确实不行。
ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ([YourDatabase], REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE [YourDatabase] SET MULTI_USER

下面是输出信息:

Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.
Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.
Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.
Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.
Msg 7987, Level 16, State 1, Line 3
System table pre-checks: Object ID 5 has chain linkage mismatch. (1:29885)->next = (1:28340), but (1:28340)->prev = (1:28339). Check statement terminated due to unrepairable error.
DBCC results for 'XXXX'.
CHECKDB found 0 allocation errors and 0 consistency errors in database 'XXXX'.

万一说备份都没有,或者备份实在是太旧了,而且上面我提到的那个PAGE RESTORE的办法又行不通,那就没办法了,只剩一个办法:

因为这个时候数据库已经进入正常模式,可以被访问。我们只有尽可能去挽救数据。把可以访问的数据表里面的数据都导出到另外一个库。

至于这里,因为是开发环境,我直接restore了整个库。


RESTORE FILELISTONLY
FROM DISK = '\\XXXXXX\MyDB\MyDB_NB_FULL_20150624000352.BAK'

RESTORE DATABASE MyDB
FROM DISK = '\\XXXXXX\MyDB\MyDB_NB_FULL_20150624000352.BAK'
WITH MOVE 'MyDBPrimary' TO 'D:\MSSQL\Data\MyDBPrimary.mdf',
MOVE 'MyDBLog01' TO 'O:\MSSQL\Log\MyDBLog01.ldf',
MOVE 'MyDBData24' TO 'O:\Data3\MSSQL\Data\MyDBData24.ndf',
MOVE 'MyDBData23' TO 'O:\Data2\MSSQL\Data\MyDBData23.ndf',
MOVE 'MyDBData22' TO 'O:\Data1\MSSQL\Data\MyDBData22.ndf',
MOVE 'MyDBData21' TO 'O:\MSSQL\Data\MyDBData21.ndf',
MOVE 'MyDBData20' TO 'H:\Data3\MSSQL\Data\MyDBData20.ndf',
MOVE 'MyDBData19' TO 'H:\Data2\MSSQL\Data\MyDBData19.ndf',
MOVE 'MyDBData18' TO 'H:\Data1\MSSQL\Data\MyDBData18.ndf',
MOVE 'MyDBData17' TO 'H:\MSSQL\Data\MyDBData17.ndf',
MOVE 'MyDBData16' TO 'D:\Data3\MSSQL\Data\MyDBData16.ndf',
MOVE 'MyDBData15' TO 'D:\Data2\MSSQL\Data\MyDBData15.ndf',
MOVE 'MyDBData14' TO 'D:\Data1\MSSQL\Data\MyDBData14.ndf',
MOVE 'MyDBData13' TO 'D:\MSSQL\Data\MyDBData13.ndf',
MOVE 'MyDBData12' TO 'O:\Data3\MSSQL\Data\MyDBData12.ndf',
MOVE 'MyDBData11' TO 'O:\Data2\MSSQL\Data\MyDBData11.ndf',
MOVE 'MyDBData10' TO 'O:\Data1\MSSQL\Data\MyDBData10.ndf',
MOVE 'MyDBData09' TO 'O:\MSSQL\Data\MyDBData09.ndf',
MOVE 'MyDBData08' TO 'H:\Data3\MSSQL\Data\MyDBData08.ndf',
MOVE 'MyDBData07' TO 'H:\Data2\MSSQL\Data\MyDBData07.ndf',
MOVE 'MyDBData06' TO 'H:\Data1\MSSQL\Data\MyDBData06.ndf',
MOVE 'MyDBData05' TO 'H:\MSSQL\Data\MyDBData05.ndf',
MOVE 'MyDBData04' TO 'D:\Data3\MSSQL\Data\MyDBData04.ndf',
MOVE 'MyDBData03' TO 'D:\Data2\MSSQL\Data\MyDBData03.ndf',
MOVE 'MyDBData02' TO 'D:\Data1\MSSQL\Data\MyDBData02.ndf',
MOVE 'MyDBData01' TO 'D:\MSSQL\Data\MyDBData01.ndf', REPLACE, STATS = 10; Restore完记得DBCC CHECKDB(MyDB)

Database Corruption ->> Fix Database In Suspect State的更多相关文章

  1. Avoiding PostgreSQL database corruption

    TL;DR: Don't ever set fsync=off, don't kill -9 the postmaster then deletepostmaster.pid, don't run P ...

  2. Oracle® Database Patch 19121551 - Database Patch Set Update 11.2.0.4.4 (Includes CPUOct2014) - 傲游云浏览

    Skip Headers Oracle® Database Patch 19121551 - Database Patch Set Update 11.2.0.4.4 (Includes CPUOct ...

  3. Azure SQL Database (19) Stretch Database 概览

    <Windows Azure Platform 系列文章目录>  Azure SQL Database (19) Stretch Database 概览      Azure SQL Da ...

  4. 使用duplicate target database ... from active database复制数据库

    使用duplicate target database ... from active database复制数据库 source db:ora11auxiliary db:dupdb 1.修改监听文件 ...

  5. Oracle Database 12c Using duplicate standby database from active database Created Active DataGuard

    primary database db_name=zwc, db_unique_name=zwc standby database db_name=zwc, db_unique_name=standb ...

  6. Teradata Delete Database and Drop Database

    DELETE DATABASE and DELETE USER statements delete all data tables, views, and macros from a database ...

  7. Cannot connect to database because the database client

    问题描述: arcgis server10.1  arcgis sde10出现下面问题 Cannot connect to  database because the database client ...

  8. What is the difference between database table and database view?

    The database table has a physical existence in the database. A view is a virtual table, that is one ...

  9. Database Sharding Challenges DATABASE SHARDING

    w分布式查询.数据聚合.跨碎片join是可且应避免的.自增主键管理.基于-会话/事务/语句-选择碎片.通过-主键/模块/碎片索引-碎片化数据 http://www.agildata.com/datab ...

随机推荐

  1. 随堂作业——到底有几个“1”(C++)

    一.设计思路 在课堂上讨论的时候,老师提出的思路是利用之前的结果计算出比它更大的数字的“1”.但是我不是这么想的,我是把输入的正整数每位上的数都分解出来计算.如abc,就先算c,再加上b,最后再加上a ...

  2. CodeColorer支持的语言

    CodeColorer支持的语言有:abap, actionscript, actionscript3, ada, apache, applescript, apt_sources, asm, asp ...

  3. Zabbix实现微信告警

    zabbix实现微信告警可以分为以下两个步骤: 在百度告警告警平台实现微信告警 将Zabbix接入百度告警平台 微信告警 实现微信告警只需要如下四步: 个人主页关注微信 升级策略配置微信告警 服务管理 ...

  4. 使用SecureRandom类替代Random类

    java.util.Random 产生确定的值可能被恶意的程序预测到. java.security.SecureRandom 产生不确定的随机数不能被预测到. 所以优先使用java.security. ...

  5. ubuntu重置root密码

    from: http://mmicky.blog.163.com/blog/static/150290154201398113034698/ 使用ubuntu的时候忘记了root密码该如何重置?我使用 ...

  6. 02.Redis主从集群的Sentinel配置

    1.集群环境 1.Linux服务器列表 使用4台CentOS Linux服务器搭建环境,其IP地址如下: 192.168.110.100 192.168.110.101 192.168.110.102 ...

  7. js的全局函数

    JS的全局函数,全局函数和window对象的函数不一样. 全局函数不属于任何一个内置对象. JS包含以下7个全局函数,用于一些常用的功能: escape(),unescape(); //编码,解码. ...

  8. 【转载】C++——CString用法大全

    CString常用方法简介 作者:webmaster 出处:无 CString::Compareint Compare( LPCTSTR lpsz ) const;返回值  字符串一样 返回0     ...

  9. vs2010 使用IIS EXPRESS出错.

      出现的问题:   解决方法: 左键单击Web项目,  查看属性选项卡, 将 托管管道模式改成Classic就可以了.

  10. aspx文件、aspx.cs文件、aspx.designer.cs文件之讲解

    .aspx文件:(页面)书写页面代码.存储的是页面design代码.只是放各个控件的代码,处理代码一般放在.cs文件中. .aspx.cs文件:(代码隐藏页)书写类代码.存储的是程序代码.一般存放与数 ...