SQLSERVER拯救某个时间点被误删除的数据
SQLSERVER拯救某个时间点被误删除的数据
转载自:http://blog.csdn.net/dba_huangzj/article/details/8491327
要拯救某个时间点被误删除的数据,需要你在那个时间点之前有一个完整数据库备份。
而且,需要你的数据库恢复模式为:“完整恢复模式”
如何查看你的数据库恢复模式为完整恢复模式,运行下面SQL
1 SELECT recovery_model, recovery_model_desc 2 FROM sys.databases 3 WHERE name = 'GPOSDB'
在创建完一个新数据库之后,强烈建议做一次数据库完整备份
-------------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------
先创建测试表
1 /* 2 由于tempdb永远为简单恢复模式,所以不适合做案例。 3 这里使用我的测试机器里的数据库GPOSDB 4 */ 5 USE [GPOSDB] 6 GO 7 IF OBJECT_ID('testRestore') IS NOT NULL 8 DROP TABLE testRestore 9 GO 10 CREATE TABLE testRestore 11 ( 12 id INT IDENTITY(1, 1) , 13 NAME VARCHAR(50) 14 );
插入测试数据
1 --插入测试数据: 2 INSERT INTO testRestore(Name) 3 SELECT 'test1' 4 UNION ALL 5 SELECT 'test2' 6 UNION ALL 7 SELECT 'test3' 8 UNION ALL 9 SELECT 'test4' 10 UNION ALL 11 SELECT 'test5' 12 UNION ALL 13 SELECT 'test6' 14 UNION ALL 15 SELECT 'test7' 16 UNION ALL 17 SELECT 'test8'
1 SELECT * FROM testRestore
先来一个数据库完整备份,在22:32的时候完整备份数据库
1 BACKUP DATABASE [GPOSDB] 2 TO DISK='D:\GPOSDB_FULLBACKUP2013-07-23.bak' 3 WITH INIT 4 go
模拟删除表数据,这里使用waitfor time,目的是使删除数据的时间准确一点,这里选择22:34的时候删除数据方便后面还原某个时间点之前的数据
1 USE [GPOSDB] 2 GO 3 WAITFOR TIME '22:34' 4 DELETE FROM dbo.testRestore
查询一下数据是否删除
1 USE [GPOSDB] 2 GO 3 SELECT * FROM dbo.testRestore
断开与GPOSDB数据库的连接,如果还有连接就kill掉连接,然后执行事务日志备份,在22:36的时候执行事务日志备份
1 --删除了表中的数据之后最少要等3分钟才执行下面SQL语句,不然的话等一下还原事务日志的时候会报错 2 --必须断开所有与GPOSDB数据库的连接 3 USE master 4 GO 5 BACKUP LOG [GPOSDB] TO DISK = N'D:\GPOSDB_LOGBACKUP2013-07-23.bak' WITH NO_TRUNCATE , NOFORMAT, NAME = N'GPOSDB-事务日志备份', SKIP, NORECOVERY , STATS = 10, CHECKSUM 6 GO 7 DECLARE @backupSetId AS INT 8 SELECT @backupSetId = position 9 FROM msdb..backupset 10 WHERE database_name = N'GPOSDB' AND backup_set_id = ( SELECT 11 MAX(backup_set_id) 12 FROM msdb..backupset 13 WHERE database_name = N'GPOSDB' 14 ) 15 IF @backupSetId IS NULL --这里是验证事务日志备份是否成功,如果没有断开与GPOSDB数据库的连接备份事务日志可能会失败 16 BEGIN 17 RAISERROR(N'验证失败。找不到数据库“GPOSDB”的备份信息。', 16, 1) 18 END 19 RESTORE VERIFYONLY FROM DISK = N'D:\GPOSDB_LOGBACKUP2013-07-23.bak' WITH FILE = @backupSetId 20 GO
1 --查询是否备份成功 2 SELECT TOP 10 * FROM msdb..backupset ORDER BY [backup_set_id] DESC
还原数据库完整备份
1 --数据库处于正在还原状态 2 RESTORE DATABASE [GPOSDB] FROM DISK='D:\GPOSDB_FULLBACKUP2013-07-23.bak' WITH replace, NORECOVERY
还原事务日志
1 --因为删除数据是在'22:34' 所以还原到22:33 2 RESTORE LOG [GPOSDB] FROM DISK='D:\GPOSDB_LOGBACKUP2013-07-23.bak' WITH RECOVERY ,STOPAT='2013-7-23 22:33'
如果事务日志还原失败的话,可以使用GUI界面
查看表中的数据
1 USE [GPOSDB] 2 GO 3 SELECT * FROM dbo.testRestore
-----------------------------------------------------------华丽的分割线--------------------------------------------
要注意的两个地方:
(1)如果你发现误操作以后还有很多人做了操作,那么你还原成功后,别人的操作就会冲掉,所以发生误操作后,要马上停止别人对数据库的操作。
(2)这个方法要对数据库独占