日期:2014-05-16  浏览次数:20473 次

如何恢复误删数据
--误删表数据,如何恢复过来

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