如何恢复误删数据
2013-01-11 09:29
435 查看
--误删表数据,如何恢复过来 /* 真实案例:在执行语句的时候错误的把系统中的一个表的数据全部删除 在删除之前,我做过一次完整的数据库备份,再删除之后,我第一时 间做了尾日志备份 也就是说 我手上现在有一份最新的完整备份 和删除数据之后的尾 日志备份 */
/*
版本信息:
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
*/ -->>TravyLee生成测试数据: USE MASTER GO IF OBJECT_ID('TestDb') IS NOT NULL DROP DATABASE TestDb GO CREATE DATABASE TestDb; GO --设置数据库为完整恢复模式 ALTER DATABASE TestDb SET RECOVERY FULL WITH NO_WAIT GO --查看系统表中TestDb数据库的恢复级别 SELECT recovery_model, recovery_model_desc FROM sys.databases WHERE name ='TestDb' /* recovery_model recovery_model_desc ------------------------------------------- 1 FULL */ --接下来使用TestDb数据库来测试 USE TestDb GO IF OBJECT_ID('StuInfo') IS NOT NULL DROP TABLE StuInfo CREATE TABLE StuInfo ( Id int identity(1,1), StuId varchar(25), StuName nvarchar(25), StuSex varchar(25), Others nvarchar(255) ) GO insert StuInfo(StuId,StuName,StuSex,Others) select '200911076','test01','男','2009年入学,目前在四川成都实习' union all select '200911077','test02','男','2009年入学,目前在上海实习' union all select '200911078','test03','女','2009年入学,留校考研' union all select '200911079','test04','男','2009年入学,目前在四川成都实习' union all select '200911080','test05','女','2009年入学,留校考研' union all select '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 = 10 GO --现在我查看表里的数据 都存在 SELECT * FROM StuInfo /* Id StuId StuName StuSex Others --------------------------------------------------------------------------------- 1 200911076 test01 男 2009年入学,目前在四川成都实习 2 200911077 test02 男 2009年入学,目前在上海实习 3 200911078 test03 女 2009年入学,留校考研 4 200911079 test04 男 2009年入学,目前在四川成都实习 5 200911080 test05 女 2009年入学,留校考研 6 200911081 test06 男 2009年入学,目前在广东深圳实习 */ --现在我来对数据进行一些插入操作: insert StuInfo(StuId,StuName,StuSex,Others) select '200911082','test07','男','2009年入学,目前在四川成都实习' union all select '200911083','test08','女','2009年入学,目前在上海实习' select getdate()--2013-01-11 09:10:07.500 --此时表StuInfo里面有8条数据 我原本想删除掉id为3,5的数据 但我错误的把表里的数据 --全部删除了 --错误的执行了以下命令 delete from StuInfo select 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, CHECKSUM GO declare @backupSetId as int select @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) end RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND GO --现在我们来还原数据库,由于我错误的删除了数据 --首先我根据完整备份进行一次还原,也就是说把数据库还原到 RESTORE DATABASE [TestDb] FROM DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10 GO --接下来根据日志备份来恢复数据库: 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] go select * from StuInfo /* Id StuId StuName StuSex Others ---------------------------------------------------------------- 1 200911076 test01 男 2009年入学,目前在四川成都实习 2 200911077 test02 男 2009年入学,目前在上海实习 3 200911078 test03 女 2009年入学,留校考研 4 200911079 test04 男 2009年入学,目前在四川成都实习 5 200911080 test05 女 2009年入学,留校考研 6 200911081 test06 男 2009年入学,目前在广东深圳实习 7 200911082 test07 男 2009年入学,目前在四川成都实习 8 200911083 test08 女 2009年入学,目前在上海实习 */ 总结: 为了能够在错误操作或者灾难发生后使数据尽快恢复,数据库就必须要满足一下前提: 1,数据库的恢复模式必须是完整恢复模式 2,灾难发生前或者错误删除数据之前必须做过一个完整数据库备份 3,在上次数据库完整备份之后,如果做过任何日志备份,这些备份现在都能找到 满足这些要求后,数据库就可以恢复到任何一个时间点了。 恢复的具体步骤: 1,灾难发生后备份活动事务日志(也称尾日志) 2,还原最新完整数据库备份,而不做事务恢复(WITH NORECOVERY) 3,如果存在差异备份 则还原差异备份,而不做事务恢复(WITH NORECOVERY) 4,从备份后创建的第一个事务日志开始,使用NORECOVERY一次还原事务日志 5,恢复数据库到某个时间点(WITH STOPAT = N'某个时间点')
相关文章推荐
- 干货分享丨如何恢复Linux下误删etc目录数据
- oracle误删磁盘数据后不能连接数据库 如何恢复
- Linux中如何恢复被误删的数据文件
- 如何从XenServer恢复误删的虚拟机数据 推荐
- 详解:如何恢复MySQL数据库下误删的数据
- 分区被误删,如何恢复数据
- 《oracle学习》-01-如何恢复误删的表记录数据
- 误删表数据,如何恢复过来 推荐
- 数据误删后如何使用Flashback恢复数据
- 记录如何把服务器误删数据的恢复过程
- 误删文件后如何恢复数据
- oracle如何恢复误删数据
- 数码相机照片误删如何恢复,相机sd卡数据怎么恢复
- 在项目中遇到误删表中数据,如何恢复oracle数据库表中数据的恢复问题
- Oracle数据被误删如何恢复?已解决
- 拍摄的视频数据丢失怎么办,如何恢复摄像机误删的视频
- 误删的数据 如何恢复
- Innodb ibdata数据文件误删,如何恢复
- oracle的数据文件全部丢失,但有归档和重做日志,如何恢复?
- svn如何恢复误删除的数据