您好,欢迎访问利联科技官网!    24小时服务热线:400-161-0880    我们有最适合您的产品和最好的服务。登录  /  注册  /  旧平台入口

SQL数据库崩溃如何保存和恢复数据报告方案

 

任何海外代理服务器的系统都无法避免程序崩溃的状况,即使你使用了良好的机器配置和网络环境……仍然无法完全根除

系统中的随机单点故障,何况对于大部分用户来说,无法承受这样昂贵的硬件投资。所以,在系统崩溃的时候,如何恢复

原有的宝贵数据就成为一个极其重要的问题了。下面我来讲解下。


在恢复的时候,最理想的情况就是你的数据文件和日志文件都完好无损了,这样只需要sp_attach_db,把数据文件附加到

新的数据库上即可,或者在停机的时候把所有数据文件(一定要有master等)都copy到原有路径下也行,不过一般不推荐这

样的做法,sp_attach_db比较好,虽然麻烦许多。

  

但是呢,一般数据库崩溃的时候系统是未必能有时间把未完成的事务和脏页等写入磁盘的,这样的情况sp_attach_db就会

失败。那么,寄期望于DBA制定了一个良好的灾难恢复计划。按照你的恢复计划,还原最新的完全备份,增量备份或者事

务日志备份,然后如果你的活动事务日志还能读得出来的话,那么恭喜你!你可以还原到崩溃前的状态。


一般的单位都是没有专职的DBA的,如果没有可用的备份,更可能是最近一次备份的时间过于久远而导致不可接受的数据

损失,而且你的活动事务日志也处于不可用的状态,那就是最麻烦的情况了。


首先,你可以试一下sp_attach_single_file_db,试着恢复一下你的数据文件,虽然能恢复的可能性不大,不过假如这个

外代理服务器的数据库刚好执行了一个checkpoint的话,还是有可能成功的。


如果无法成功的话,先别急。还是有别的方案的。

  

我们可以试着重新建立一个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 = ''

  

现在,重新建立一个log文件。成功的机会还是相当大的,系统一般都会认可你新建立的日志。如果没有报告什么错误,现

在就可以松一口气了。


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


先把SQL Server 重新启动一下,然后检查你的数据库吧。


先设置成单用户模式,然后做dbcc

sp_dboption '', 'single user', 'true'

DBCC CHECKDB('')


如果没有什么大问题就可以把数据库状态改回去了,记得别忘了把系统表的修改选项关掉。

update sysdatabases set status = 28 where 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也许可以帮你一些忙。

如果还不太清楚,可联系您的数据库专员进行操作。


以上是使用海外代理服务器中SQL数据库崩溃导致无法使用的情况下,将数据保存和恢复的解决方案。


您可能还会对下面的文章感兴趣: