SQLServer 2008以上误 *** 作数据库恢复方法——日志尾部备份

SQLServer 2008以上误 *** 作数据库恢复方法——日志尾部备份,第1张

概述         经常看到有人误删数据,或者误 *** 作,特别是update和delete的时候没有加where,然后就喊爹喊娘了。人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题。         遇到这种情况,一般都是没有做备份,不然也不会来发问了。首先要冷静,否则会有更大的灾难。直到你放弃。 解决方法:        对于这类问题,主要是找回误 *** 作之前的数据,在2008之

         经常看到有人误删数据,或者误 *** 作,特别是update和delete的时候没有加where,然后就喊爹喊娘了。人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题。

        遇到这种情况,一般都是没有做备份,不然也不会来发问了。首先要冷静,否则会有更大的灾难。直到你放弃。


解决方法:

       对于这类问题,主要是找回误 *** 作之前的数据,在2008之前,有个很出名的工具Log Exploer,听说还挺好用的,这个网上大把教程,这里就不多说了。但是唯一遗憾的是,不支持2008及更高版本,这时除了其他第三方工具,那么最常用的就是本文提到的方法——日志尾部备份。本文实验环境2008R2,对于2008及其以上版本可以使用这个方法,其实2005也可以,2000很少用,没试过,只是2008之前可以使用Log Exploer,所以就没必要用这种方法。

      下面图文并茂讲解 *** 作方法,至于原理,不属于本文范围,而且我相信真遇到误 *** 作的时候,估计没人会看原理了。

步骤: (1)、检查数据库的恢复模式,如图:



或者使用脚本检查:

[sql]  view plain  copy  

SELECT recovery_model,recovery_model_desc   FROM sys.databases   WHERE name ='AdventureWorks'  
结果如下:


        确保数据库的恢复模式最起码不能为【简单】。至于如何修改成完整模式,我觉得这些应该没必要多说了。

 

       切记,对于任何重要环境,不仅仅是客户正式环境(俗称生产环境),都强烈建议使用【完整恢复模式】,虽然对于另外两种(大容量日志(BulK_LOGGED)、简单(SIMPLE))来说,完整恢复模式产生的日志会大,但是在出现问题的时候,就会觉得这些都不算什么了。并且我也想不到任何理由对于正式环境不使用完整恢复模式。只要管理得当,完整恢复模式的日志也不会太变态。

(2)、这里其实隐含另外一步,曾经做过最少一次的完整备份。因为所有类型的备份都基于完整备份,如果没有最少一次完整备份,其他类型的备份都是多余的,所以在这里强调一下,在创建完一个新数据库之后,强烈建议甚至强制做一次完整备份。

copy   SELECT  database_name,recovery_model,name    FROM msdb.dbo.backupset  
使用上面的语句粗略可以看到有那些数据库做过备份,由于测试,所以做了几次备份,可以看到我这个时间点已经做了备份了。


(3)、确保别人不再连接数据库,然后做一次日志尾部备份:

首先先创建一点数据:

copy   /*   由于tempdb永远为简单恢复模式,所以不适合做案例。   这里使用微软的示例数据库AdventureWorks   */   USE AdventureWorks   GO   IF OBJECT_ID('testRestore'IS NOT NULL        DROP TABLE testRestore   GO   CREATE      (         id INT IDENTITY(1, 1) ,         NAME VARCHAR(50)       );   --插入测试数据:      INSERT INTO testRestore(Name)   SELECT 'test1'   UNION ALL    SELECT 'test2'   SELECT 'test3'   SELECT 'test4'   SELECT 'test5'   SELECT 'test6'   SELECT 'test7'   SELECT 'test8'   SELECT * FROM testRestore   检查一下结果:



然后来做个删除 *** 作,为了定位是啥时候发生的,我加了一个waitfor命令,让它在某个时间发生,这样恢复的时候就有准确性:

copy   USE AdventureWorks   WAITFOR TIME '21:45'   DELETE FROM dbo.testRestore  
现在来看看数据:

copy  


到这一步,灾难出现了。但是切记要冷静

下面就是本文的重点开始,做一次日志备份,最重要是选择【备份日志尾部】



然后在【选项】页选择:除【事务日志】除,其他红框包裹的地方为强烈建议勾选的地方。并且保证数据库不要有别人在连接,因为备份日志尾部会使数据库处于还原状态,拒绝其他会话的连接,如果不断开其他连接,是备份不了的。




然后按确定,当然,可以使用上方的【脚本】来生成语句:


copy
  USE Master   BACKUP LOG [AdventureWorks] TO  DISK = N'E:\AdventureWorks.bak' WITH  NO_TRUNCATE , NOFORMAT, NOINIT,  NAME = N'AdventureWorks-事务日志 备份', SKIP, NOREWIND, NOUNLOAD,  NORECOVERY , COMPRESSION,  STATS = 10, CHECKSUM   declare @backupSetId as int   select @backupSetId = position from msdb..backupset where database_name=N'AdventureWorks' and backup_set_id=(select max(backup_set_id) where database_name=N'AdventureWorks' )   if @backupSetId is null begin raiserror(N'验证失败。找不到数据库“AdventureWorks”的备份信息。', 16, 1) end   RESTORE VERIFYONLY FROM  DISK = N'E:\AdventureWorks.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND   GO  
此时,数据库会处于【正在还原】的状态


如果发现备份不了可以用下面语句查看,并把spid杀掉:


copy   SELECT  * FROM sys.sysprocesses WHERE dbID=DB_ID('AdventureWorks')  
执行结果:


然后kill掉。

接着继续备份。

然后进行还原,如图:

先要还原完整备份,选择最近的那次,由于日志备份的特性(以后其他文章再说),只认最后一次备份,所以要选择最新的那次,否则还原不了。



这里又有一个注意事项,记得选择:



接着还原日志文件,这是最最重要的一步:



然后:



由于实验的时候出了点问题,后面重做了,所以时间选择到22:19分,我是在22:20分删除数据的。这里不用太在意,只要把时间点指定到你误删除的时间之前即可。而由于日志尾部备份都是最后一个备份文件,所以这里选则红框部分即可:


现在再检查一下:



可以看到,数据已经还原成功。

总结

以上是内存溢出为你收集整理的SQLServer 2008以上误 *** 作数据库恢复方法——日志尾部备份全部内容,希望文章能够帮你解决SQLServer 2008以上误 *** 作数据库恢复方法——日志尾部备份所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1173431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存