当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQLServer:数据库恢复

MSSQL
将代码页从SQL Server 7.0改变到SQL Server 2000
浅析SQL SERVER一个没有公开的存储过程
使用存储过程时一个错误的解决方法
执行一个安全的SQL Server安装
SQL导出到MYSQL的简单方法
SQL Server 7六种数据移动方法
数据库升迁从sqlserver6.5到sqlserver2000
用SQL 2000创建用户化XML流
解决SQL Server 2000之日志传送功能
保持多台服务器数据的一致性
将ACCESS转化成SQL2000需要注意的几个问题
一次特殊的SQL Server安装奇遇
实现上千万条数据的分页显示
使用用于SQL Server的IIS虚拟目录管理实用工具
SQL Server连接ACCESS数据库的实现
使用SQL Server数据转换服务升迁Access数据库
SQLServer和Access、Excel数据传输简单总结
XML文件导入SQL Server 2000
在视图中使用ORDER BY子句
内嵌或嵌入SQL和存储过程之对比

MSSQL 中的 SQLServer:数据库恢复


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 122 ::
收藏到网摘: n/a

以前做项目,曾经遇到过数据库发生了几乎致命的异常,但是有效的恢复,使数据得以保留,避免较大的损失。今天把一些经验整理一下,分享给大家。希望对大家有所帮助。

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

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


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


不幸的是,一般数据库崩溃都是由于存储子系统引起的,而这样的情况是几乎不可能有可用的日志用于恢复的。


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


我们可以试着重新建立一个Log,先把数据库设置为emergency modesysdatabasesstatus32768 就表示数据库处于此状态。


不过系统表是不能随便改的,设置一下先Use MasterGosp_configure 'allow updates', 1reconfigure with overrideGo然后 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_resetstatusgosp_configure 'allow updates', 0reconfigure with overrideGo
checkdb
的时候可能报告有一些错误,这些错误的数据你可能就只好丢弃了;checkdb有几种修复选项,自己看着用吧,不过最后你可能还是得REPAIR_ALLOW_DATA_LOSS,完成所有修复;chekcdb并不能完成所有的修复,我们需要更进一步的修复,用DBCC CHECKTABLE对每一个表做检查吧。


表的列表可以用sysobjects里面得到,把OBJECTPROPERTYIsTable的全部找出来检查一下吧,这样能够基本上解决问题了,如果还报告错误,试着把数据select into到另一张表检查一下。


这些都做完了之后,把所有索引、视图、存储过程、触发器等重新建立一下。可以从DBCC DBREINDEX得到帮助。