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)這個方法要對數據庫獨占