现在位置:
首页 > SQL Server > 正文
如何恢复误删数据(二)
版权声明:本文为博主原创文章,未经博主允许不得转载。
- --误删表数据,如何恢复过来
- /*
- 真实案例:在执行语句的时候错误的把系统中的一个表的数据全部删除
- 在删除之前,我做过一次完整的数据库备份,再删除之后,我第一时
- 间做了尾日志备份
- 也就是说 我手上现在有一份最新的完整备份 和删除数据之后的尾
- 日志备份
- */
- /*
- 版本信息:
- 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'某个时间点')