SqlServer2008误删表数据如何恢复

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

/*
真实案例:在执行语句的时候错误的把系统中的一个表的数据全部删除
在删除之前,我做过一次完整的数据库备份,再删除之后,我第一时
间做了尾日志备份
也就是说 我手上现在有一份最新的完整备份 和删除数据之后的尾
日志备份
*/
-->>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
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
BACKUP LOG
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
FROM DISK = N'E:\MSSQL2008\MSSQL10.MSSQLSERVER\MSSQL\Backup\TestDb.bak' WITH FILE = 1,
NORECOVERY, NOUNLOAD, STATS = 10
GO

--接下来根据日志备份来恢复数据库:

RESTORE LOG 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
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'某个时间点')
已邀请:
0

梁勇 - 天道酬勤、上善若水。爱好商业智能 2013-07-09 回答

/*
功能说明:数据库的还原
修改说明: Created BY LY 2013-2-28
*/

/*
场景一: 1. 至少有一个误删除之前的数据库完全备份。

2. 数据库的恢复模式(Recovery mode)是“完整(Full)”。

情况一、如果这两个前提条件都存在,通过SQL语句只需三步就能恢复,无需借助第三方工具。

a) 备份当前数据库的事务日志:BACKUP LOG TO disk= N'备份文件名' WITH NORECOVERY

  b) 恢复一个误删除之前的完全备份:RESTORE DATABASE FROM DISK = N'完全备份文件名' WITH NORECOVERY, REPLACE

  c) 将数据库恢复至误删除之前的时间点:RESTORE LOG FROM DISK = N'第一步的日志备份文件名' WITH STOPAT = N'误删除之前的时间点' , RECOVERY

*/
---删除语句
DELETE FROM dbo.BBBBB



--第一步备份当前数据库的事务日志
BACKUP LOG TO disk= N'D:\ARestoreLog.bak' WITH NORECOVERY

---第二步恢复一个误删除之前的完全备份
RESTORE DATABASE FROM DISK = N'D:\ARestore.bak' WITH NORECOVERY, REPLACE


---第三步将数据库恢复至误删除之前的时间点
RESTORE LOG FROM DISK = N'D:\ARestoreLog.bak' WITH STOPAT = N'2013-02-28 11:50:10' , RECOVERY
0

fanchaoyun - 从事SQL SERVER和BI 2015-08-04 回答

可惜这块没有好的工具能够知道什么时间点删除了数据和修改了数据

要回复问题请先登录注册