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'
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5CZ5YzM2IDZ4EGO2MDN3QWYmZjN0QmN4M2M0kDN2EzY00SO1MTNxIzMy8CX3AzMxAjMvwVO1EzN1IzLcd2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
在建立完一個新資料庫之後,強烈建議做一次資料庫完整備份
-------------------------------------------------------------------華麗的分割線-----------------------------------------------------------------------
先建立測試表
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)這個方法要對資料庫獨占