SQL Server 异常断电后,数据库状态变为SUSPECT的问题解决方法

异常断电后开启报表服务器,发现一个数据库OTS状态变为SUSPECT,不能查询,不能查看属性,不能备份。

Windows 2003 sp2 +SQL Server 2005 sp2 

1.尝试ONLINE数据库,失败。

Database 'OTS' cannot be opened - it has been marked SUSPECT by recover Explanation 

查看对应的数据文件和日志文件,存在.

2.运行checkdb ‘OTS’,提示Database 'OTS' cannot be opened.

3.关闭SQL SERVER,拷出MDF,LDF文件.

*遇到数据库有问题时,最好不要用SQL SERVER的备份,因为全备份会截断事务日志,可能造成数据库无法恢复.也不要做detach和delete动作,这样可能MDF檔再也附加不上去,数据库彻底没用了.事实上,此时也无法进行这些动作。

4.检查磁盘空间是否足够,MEM是否正常.

如果磁盘不再有可用空间,无法完成restore过程,数据库也会被置为suspect状态.

5.开启SQL SERVER,用sa账号登录。

USE   master  
GO  
sp_configure   'allow   updates',   1  
GO  
RECONFIGURE   WITH   OVERRIDE  
GO

执行sp_resetstatus  'OTS',关闭ots数据库的置疑标志。完成后信息如下:

Database   'OTS'   status   reset!  
WARNING:   You   must   reboot   SQL   Server   prior   to   accessing   this   database!
sp_configure   'allow   updates',   0  
GO  
RECONFIGURE   WITH   OVERRIDE  
GO 

6.重启SQL SERVER,故障依旧。

7.尝试将OTS数据库改名后新建一同名数据库,失败,不能rename.

8.删除掉OTS数据库,尝试用备份出来的MDF和LDF档新建一个同名数据库。

*不到万不得已,千万不要做删除的动作。事实证明,OTS数据库删除后,数据文件和日志文件再也不能附加上去,故障不能重现。

9.将MDF和LDF文件拷到其他磁盘 ,再附加,报同样错误.

10.使用sp_attach_single_db只附加MDF檔,仍然报错.

SQL Server detected a logical consistency-based I/O error: incorrect checksum (expected: 0x5b206e03; actual: 0x2acd7ef5). It occurred during a read of page (1:79842) in database ID 7 at offset 0x00000026fc4000 in file 'D:\Data\OTS.mdf'.  Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information,see SQL Server Books Online.

11.关闭数据库,对磁盘进行扫描.同时修复坏磁盘错误.这个过程持续了相当长时间.完成后,再次开启SQL SERVER,故障依旧.

12.用CREATE DATABASE DBName ON ( FILENAME = N'DBFile' ) FOR ATTACH_REBUILD_LOG附加数据库时出现提示:The log cannot be rebuilt because the database was not cleanly shut down.

13.此时已经没有OTS库可以拿来做恢复了,只好在网上寻找恢复工具.找到一个Recovery for SQL Server,可以从MDF和LDF中将大部分结构和数据恢复出来,但是有部分数据对象有问题,特别是存储过程有一些乱码.

14.新建同名的数据库OTS(数据库文件名也跟以前一样),停止数据库服务,用COPY出来的.mdf文件覆盖新数据库的同名文件,启动数据库服务。

运行alter database OTS set emergency,将数据库设置为emergency mode

运行下面的命令恢复数据库:


---- 来自jb51.cc
use master
exec sp_dboption 'OTS',N'single',N'true' --将目标数据库置为单用户状态
dbcc checkdb('OTS')

数据库CHECK发现大量GAM,SGAM分配错误,和类似以下信息:

Msg 8935,Level 16,State 1,Line 1
Table error: Object ID 862626116,index ID 1,partition ID 72057594055360512,alloc unit ID 72057594063814656 (type In-row data). The previous link (1:66955) on page (1:1183) does not match the previous page (1:200244) that the parent (1:69276),slot 23 expects for this page.
Msg 8935,alloc unit ID 72057594063814656 (type In-row data). The previous link (1:41230) on page (1:1757) does not match the previous page (1:91286) that the parent (1:57623),slot 6

通过系统表查看 Object ID 862626116的TABLE,发现PK字段有重复值。

因为此表数据是从其他DB抄过来的,所以数据丢失也没有关系,所以执行下面的语句。


---- 来自jb51.cc
dbcc checkdb('OTS',REPAIR_ALLOW_DATA_LOSS)

提示上面提到的TABLE PK字段有重复值,而GAM,SGAM分配错误已经被repair


---- 来自jb51.cc
dbcc checkdb('OTS',REPAIR_REBUILD)

仍然提示上面提到的TABLE PK字段有重复值。我们暂时不管它,将目标数据库置为多用户状态


---- 来自jb51.cc
exec sp_dboption 'OTS',N'false'

此时数据库已经可用,再来看那个有问题的TABLE,constraint已经没有了,只剩下PK和index,我们将PK取消掉,查找出有重复值的行,删除掉,再建上PK。

再次运行checkdb 'OTS',已经没有错误。

最后做一次数据库的完整备份。

 

总结:

1.出现问题时不要惊慌,惊慌的后果往往是不理性的思考甚至不思考就做出一些不可逆的动作。

2.没有把握时,不要轻易做分离数据库、删除数据库、重启数据库服务器动作。

3.在数据库可以打开的时候,使用CheckDB,等待它运行完成并报告所有错误,再根据这些错误来制定修复策略,虽然这个过程会比较长。

4.CheckDB并不能解决一切问题,所有数据只能靠完整的备份来恢复。所以,备份重于一切。如果实在没有办法,也可以借助一些工具,通过读取MDF,LDF档,生成脚本的方法来恢复结构和数据。

5.不管修复动作能不能成功,都要注意查找产生问题的原因,防止再次出现类似问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( 'table_name' [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: 'No Process is on the Other End of the Pipe'。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:
对于指定的缓冲区大小而言,源列的数据太大