天天看點

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'      
SQLSERVER拯救某個時間點被誤删除的資料

在建立完一個新資料庫之後,強烈建議做一次資料庫完整備份

-------------------------------------------------------------------華麗的分割線-----------------------------------------------------------------------

先建立測試表

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      
SQLSERVER拯救某個時間點被誤删除的資料

先來一個資料庫完整備份,在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      
SQLSERVER拯救某個時間點被誤删除的資料

斷開與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      
SQLSERVER拯救某個時間點被誤删除的資料
1 --查詢是否備份成功
2 SELECT TOP 10 * FROM    msdb..backupset ORDER BY [backup_set_id] DESC       
SQLSERVER拯救某個時間點被誤删除的資料

還原資料庫完整備份

1 --資料庫處于正在還原狀态
2 RESTORE DATABASE [GPOSDB] FROM DISK='D:\GPOSDB_FULLBACKUP2013-07-23.bak' WITH replace, NORECOVERY       
SQLSERVER拯救某個時間點被誤删除的資料

 還原事務日志

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界面

SQLSERVER拯救某個時間點被誤删除的資料
SQLSERVER拯救某個時間點被誤删除的資料

檢視表中的資料

1 USE [GPOSDB]
2 GO
3 SELECT * FROM dbo.testRestore      
SQLSERVER拯救某個時間點被誤删除的資料

 -----------------------------------------------------------華麗的分割線--------------------------------------------

要注意的兩個地方:

(1)如果你發現誤操作以後還有很多人做了操作,那麼你還原成功後,别人的操作就會沖掉,是以發生誤操作後,要馬上停止别人對資料庫的操作。

(2)這個方法要對資料庫獨占

繼續閱讀