数据库文件损坏后的恢复方法

来源:互联网 发布:最大的源码交易平台 编辑:程序博客网 时间:2024/05/01 21:11

 

 

    2008年7月7日,星期一,数据库服务器的磁盘阵列卡坏了,硬件维护人员更换了磁盘阵列卡,但是系统的数据库文件已经损坏。用了两天的时间恢复该数据库。数据库使用的是SQLSERVER2000,数据库名是regie_sc_sj,数据库文件名regie_sc_sj_data.mdf.

问题检查过程

1、在企业管理器中专卖数据库的状态是置疑,用以下命令修复数据库状态:
USE master
GO
sp_configure 'allow updates', 1
GO
RECONFIGURE WITH OVERRIDE
GO
sp_resetstatus 'regie_sc_sj'
但是修复不成功,无法找到该数据库。检查发现数据库文件没有丢失,只是数据库文件没有连接到SQLSERVER中。

2、通过SQLSERVER的企业管理器将数据库文件附加到SQLSERVER中,也没有成功,报错为“823” 磁盘故障造成的问题。

3、将数据库文件复制到其它机器上,并且在新的机器上附加到企业管理器中,出现相同的报错。说明磁盘的故障已经损坏了数据库文件。该数据库上次备份是在2004年,时间太久已经无法使用这个备份文件,现在只能尽量恢复现有的数据库文件。


修复过程

1、在master库的sysdatabases表中添加专卖数据库信息:
   Use Master
--修改系统属性,允许修改系统表的内容
   sp_configure 'allow updates', 1
   reconfigure with override
--添加专卖数据库信息到sysdatabases表中,其中status=32768表示紧急模式
insert into sysdatabases(name,dbid,sid,mode,status,status2,crdate,reserved,category,cmptlevel,filename) 
values ( 'regie_sc_sj',10,0x01,0,32768,'1090519040',getdate(),getdate(),0,80,'D:/108809数据库备份/regie_sc_sj_data.mdf') from sysdatabases

2、检查并修复数据库文件:
--设置regie_sc_sj数据库一次只能一个用户访问
   sp_dboption 'regie_sc_sj', 'single user', 'true'
--检查和修复数据库
   DBCC CHECKDB('regie_sc_sj')
修复后记录下有报错的表

3、恢复数据库原由属性
   sp_dboption 'regie_sc_sj', 'single user', 'false'

   sp_configure 'allow updates', 0
   reconfigure with override

4、现在数据库中的数据能够查询到,但是没有日志文件,新建日志文件,重启数据库服务。

5、重启数据库服务以后,如果数据库正常,那么就大功告成了,但是如果数据库成为了置疑状态或者日志文件无法新建,那么就只有继续下面的操作了。

6、先按照1到3步的步骤将数据库恢复到可以查询到的状态,不要重启数据库服务,将表、视图、存储过程和函数等用户创建的信息导成脚本。

7、新建一个数据库,在新的数据库(regie_sc_sj_jy)中执行前面导出来的脚本,注意表的脚本中要有索引、用户、主键等信息,在执行表脚本前要将表脚本中的原数据库名(regie_sc_sj)该为新的数据库名(regie_sc_sj_jy)。

8、将数据库中各个表的数据导到新的数据库中。导数据的过程中,前面数据库检查的时候出现过问题的表单独导,这些表已经损坏,无法修复,数据会丢失一部分。

9、到完数据以后,重启数据库服务,将regie_sc_sj和regie_sc_sj_jy都从数据库管理器中分离出去,重新附加regie_sc_sj_jy的数据库文件到管理器中,并将数据库名字修改为regie_sc_sj.

这样数据库regie_sc_sj就修复完成了,但是还是有些数据丢失。

 

俗话说“善战者,无赫赫功”,数据库的维护应该已预防为主,但是如果真的出现数据库文件损坏的情况,不管多好的解决技巧都不如有个近期的备份进行简单的恢复操作,所以真正要做到数据库的安全,还是要对数据库进行定时备份。