读书人

怎么恢复误删数据

发布时间: 2013-01-17 10:28:55 作者: rapoo

如何恢复误删数据

*/-->>TravyLee生成测试数据:USE MASTERGOIF OBJECT_ID('TestDb') IS NOT NULLDROP DATABASE TestDbGOCREATE DATABASE TestDb;GO--设置数据库为完整恢复模式ALTER DATABASE TestDb SET RECOVERY FULL WITH NO_WAITGO--查看系统表中TestDb数据库的恢复级别SELECT recovery_model,recovery_model_desc  FROM sys.databases  WHERE name ='TestDb'  /*recovery_modelrecovery_model_desc-------------------------------------------1FULL*/--接下来使用TestDb数据库来测试USE TestDbGOIF OBJECT_ID('StuInfo') IS NOT NULLDROP TABLE StuInfoCREATE TABLE StuInfo(Id int identity(1,1),StuId varchar(25),StuName nvarchar(25),StuSex varchar(25),Others nvarchar(255))GOinsert StuInfo(StuId,StuName,StuSex,Others)select '200911076','test01','男','2009年入学,目前在四川成都实习' union allselect '200911077','test02','男','2009年入学,目前在上海实习' union allselect '200911078','test03','女','2009年入学,留校考研' union allselect '200911079','test04','男','2009年入学,目前在四川成都实习' union allselect '200911080','test05','女','2009年入学,留校考研' union allselect '200911081','test06','男','2009年入学,目前在广东深圳实习'GO--现在我对数据库做一次完整的备份:BACKUP DATABASE [TestDb] TO  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH NOFORMAT, NOINIT,  NAME = N'TestDb-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10GO--现在我查看表里的数据   都存在SELECT * FROM StuInfo/*IdStuIdStuNameStuSexOthers---------------------------------------------1200911076test01男2009年入学,目前在四川成都实习2200911077test02男2009年入学,目前在上海实习3200911078test03女2009年入学,留校考研4200911079test04男2009年入学,目前在四川成都实习5200911080test05女2009年入学,留校考研6200911081test06男2009年入学,目前在广东深圳实习*/--现在我来对数据进行一些插入操作:insert StuInfo(StuId,StuName,StuSex,Others)select '200911082','test07','男','2009年入学,目前在四川成都实习' union allselect '200911083','test08','女','2009年入学,目前在上海实习'select getdate()--2013-01-11 09:10:07.500--此时表StuInfo里面有8条数据  我原本想删除掉id为3,5的数据 但我错误的把表里的数据--全部删除了--错误的执行了以下命令delete from StuInfoselect getdate()--2013-01-11 09:11:15.207--再次查看数据:select * from StuInfo--无结果:/*此时我发现自己犯的这个错误,为了弥补,我需要把数据恢复到刚刚插入数据之后的这个时间点,于是我做了一下操作*/--这时由于我误删数据,我需要将数据恢复到我插入数据之前的状态--也就是2013-01-11 09:11:15.207这个时间点之前--在误删数据之前,我做过一次完整的数据库备份--这个时候我首先要冷静下来,对事务日志进行一次备份:USE [master] BACKUP LOG [TestDb] TO  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH  NO_TRUNCATE , NOFORMAT, NOINIT,  NAME = N'TestDb-事务日志  备份', SKIP, NOREWIND, NOUNLOAD,  NORECOVERY ,  STATS = 10, CHECKSUMGOdeclare @backupSetId as intselect @backupSetId = position from msdb..backupset where database_name=N'TestDb' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'TestDb' )if @backupSetId is null begin raiserror(N'验证失败。找不到数据库“TestDb”的备份信息。', 16, 1) endRESTORE VERIFYONLY FROM  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWINDGO--现在我们来还原数据库,由于我错误的删除了数据   --首先我根据完整备份进行一次还原,也就是说把数据库还原到RESTORE DATABASE [TestDb] FROM  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 10GO--接下来根据日志备份来恢复数据库:RESTORE LOG [TestDb] FROM  DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH  FILE = 2,  NOUNLOAD,  STATS = 10,  STOPAT = N'2013-01-11T09:10:08'--这个时间是我在误删数据之前的时间GO--接下来我们来验证数据是否恢复:use [TestDb]goselect * from StuInfo/*IdStuIdStuNameStuSexOthers----------------------------1200911076test01男2009年入学,目前在四川成都实习2200911077test02男2009年入学,目前在上海实习3200911078test03女2009年入学,留校考研4200911079test04男2009年入学,目前在四川成都实习5200911080test05女2009年入学,留校考研6200911081test06男2009年入学,目前在广东深圳实习7200911082test07男2009年入学,目前在四川成都实习8200911083test08女2009年入学,目前在上海实习*/总结:为了能够在错误操作或者灾难发生后使数据尽快恢复,数据库就必须要满足一下前提:1,数据库的恢复模式必须是完整恢复模式2,灾难发生前或者错误删除数据之前必须做过一个完整数据库备份3,在上次数据库完整备份之后,如果做过任何日志备份,这些备份现在都能找到满足这些要求后,数据库就可以恢复到任何一个时间点了。恢复的具体步骤:1,灾难发生后备份活动事务日志(也称尾日志)2,还原最新完整数据库备份,而不做事务恢复(WITH NORECOVERY)3,如果存在差异备份    则还原差异备份,而不做事务恢复(WITH NORECOVERY)4,从备份后创建的第一个事务日志开始,使用NORECOVERY一次还原事务日志5,恢复数据库到某个时间点(WITH  STOPAT = N'某个时间点')

4楼jiangyongweier昨天 16:27
哇塞,你好聪明啊 ,值得试试看
Re: TravyLee昨天 16:30
回复jiangyongweiern不聪明 方法是借鉴书上的
3楼maco_wang昨天 16:12
小李子写的不错,支持一下!
Re: TravyLee昨天 16:26
回复maco_wangn我现在改行了 哈哈 不去抢分 而是看书写博客
2楼lisw20113天前 20:12
这是真的吗
Re: TravyLee3天前 21:26
回复lisw2011n假的
1楼woleyuan20114天前 10:47
这个值得认真看一看。
Re: TravyLee4天前 10:50
回复woleyuan2011n嗯 希望能给大家有所帮助 方法也是借鉴书上的

读书人网 >其他数据库

热点推荐