日期:2014-05-16 浏览次数:20563 次
--误删表数据,如何恢复过来 /* 真实案例:在执行语句的时候错误的把系统中的一个表的数据全部删除 在删除之前,我做过一次完整的数据库备份,再删除之后,我第一时 间做了尾日志备份 也就是说 我手上现在有一份最新的完整备份 和删除数据之后的尾 日志备份 */
/*
版本信息:
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 男 20