当SQL Server数据库崩溃时如何恢复

2008-04-02 10:44:41来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

任何数据库系统都无法避免崩溃的状况,即使您使用了Clustered,双机热备……仍然无法完全根除系统中的单点故障,何况对于大部分用户来说,无法承受这样昂贵的硬件投资。所以,在系统崩溃的时候,如何恢复原有的宝贵数据就成为一个极其重要的问题了。

在恢复的时候,最理想的情况就是您的数据文档和日志文档都完好无损了,这样只需要sp_attach_db,把数据文档附加到新的数据库上即可,或在停机的时候把任何数据文档(一定要有master等)都copy到原有路径下也行,但是一般不推荐这样的做法,sp_attach_db比较好,虽然麻烦许多。

但是呢,一般数据库崩溃的时候系统是未必能有时间把未完成的事务和脏页等写入磁盘的,这样的情况sp_attach_db就会失败。那么,寄期望于DBA定制了一个良好的灾难恢复计划吧。按照您的恢复计划,还原最新的完全备份,增量备份或事务日志备份,然后假如您的活动事务日志还能读得出来的话,恭喜您!您能够还原到崩溃前的状态。

一般的单位都是没有专职的DBA的,假如没有可用的备份,更可能是最近一次备份的时间过于久远而导致不可接受的数据损失,而且您的活动事务日志也处于不可用的状态,那就是最麻烦的情况了。

不幸的很的是,一般数据库崩溃都是由于存储子系统引起的,而这样的情况是几乎不可能有可用的日志用于恢复的。
那么就只好试一下这些方案了。当然,是需要至少您的数据文档是存在的,要是数据文档、日志文档和备份都没有了的话,别找我,您能够到楼顶上去唱“神啊,救救我吧”。

首先,您能够试一下sp_attach_single_file_db,试着恢复一下您的数据文档,虽然能恢复的可能性不大,但是假如这个数据库刚好执行了一个checkpoint的话,还是有可能成功的。

假如您没有好到有摸彩票的手气,最重要的数据库没有像您期盼的那样attach上去,不要气馁,还是有别的方案的。

我们能够试着重新建立一个log,先把数据库配置为emergency mode,sysdatabases的status为32768 就表示数据库处于此状态。

但是系统表是不能随便改的,配置一下先
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
然后
update sysdatabases set status = 32768 where name = '<db_name>'
现在,祈求满天神佛的保佑吧,重新建立一个log文档。成功的机会还是相当大的,系统一般都会认可您新建立的日志。假如没有报告什么错误,现在就能够松一口气了。

虽然数据是恢复了,可是别以为事情就算完成了,正在进行的事务肯定是丢失了,原来的数据也可能受到一些损坏。

先把SQL Server 重新启动一下,然后检查您的数据库吧。
先配置成单用户模式,然后做dbcc
sp_dboption '<db_name>', 'single user', 'true'
DBCC CHECKDB('<db_name>')
假如没有什么大问题就能够把数据库状态改回去了,记得别忘了把系统表的修改选项关掉。
update sysdatabases set status = 28 where name = '<db_name>' --当然您的数据库状态可能不是这个,自己改为合适的值吧。也能够用sp_resetstatus
go
sp_configure 'allow updates', 0
reconfigure with override
Go

checkdb的时候可能报告有一些错误,这些错误的数据您可能就只好丢弃了。
checkdb有几种修复选项,自己看着用吧,但是最后您可能还是得用REPAIR_ALLOW_DATA_LOSS,完成任何修复。
chekcdb并不能完成任何的修复,我们需要更进一步的修复,用DBCC CHECKTABLE对每一个表做检查吧。
表的列表能够用sysobjects里面得到,把OBJECTPROPERTY是IsTable的全部找出来检查一下吧,这样能够基本上解决问题了,假如还报告错误,试着把数据select into到另一张表检查一下。
这些都做完了之后,把任何索引、视图、存储过程、触发器等重新建立一下。DBCC DBREINDEX也许能够帮您一些忙。


标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 小议MSSQL Server 2000的安全及管理

下一篇: 在业务系统中处理小数精度, 四舍五入,全舍弃,全进位的方法