MS SQL 如何將 DB 回復至某個時間點

透過 full backup, differential backup, transaciton log 將資料還原至某個時間點

假設目前 db 裡有一個 Movie 資料庫

在此之前我們需先針對 db 做 full backup,並將 recovery mode 設為 full

並先於 15:23的時候做了一次 trasacntion log backup

接著我們在 20:06 的時候做了 insert 的動作

insert into movie (MovieEngName, MovieLocalName, ReleaseYear, imdbID, MovieType, Poster, t)
values ('test', 'test', '2019', 'noid2', 'movie', '', getdate())

然後在 20:08 馬上把資料全部刪掉

delete from movie 

接著我們想把資料回復到 20:06 新增一筆資料的狀態,該怎麼做呢?

首先我們先看備份的歷程


SELECT 
	a.[database_name] as '資料庫名稱',
	CASE a.[type]
	WHEN 'D' THEN N'資料庫'
	WHEN 'I' THEN N'差異資料庫'
	WHEN 'L' THEN N'紀錄'
	WHEN 'F' THEN N'檔案或檔案群組'
	WHEN 'G' THEN N'差異檔案'
	WHEN 'P' THEN N'部分'
	WHEN 'Q' THEN N'差異部分'
	ELSE N'NULL'
	END as '備份類型',
	a.[first_lsn] as '備份組中第一個LSN',
	a.[last_lsn]  as '備份組之後下一個LSN',
	a.[database_backup_lsn] as '最近的完整資料庫備份之LSN',
	a.[differential_base_lsn] as '差異備份的基底 LSN',
	a.[backup_finish_date] as '備份完成的日期和時間'
FROM
	msdb..backupset a INNER JOIN master..sysdatabases b ON 
	a.database_name COLLATE DATABASE_DEFAULT 
       = b.name COLLATE DATABASE_DEFAULT 
where a.[database_name] = 'movie'
ORDER BY
	a.database_name, a.backup_finish_date

 

首先我們需要先將 fullbackup 的 db 先還原回去,如果有差異備份的再依序拉進來,需以時間順序去做還原

於databases 右鍵 Restore Database => General tab 選擇 source 從 device 還原, DataBase 還原於同一台 server ,改為 Movie_bak

並於 options tab 選擇 recovery state 為 no recovery

會出現 movie_bak 會呈現 restoring 狀態

接著我們再把 transaction log 還原至 movie_bak 上去即可

restore log movie_bak
from disk = 'your transacion log .bak here'
WITH RECOVERY, STOPAT = '2019-05-02 20:07:00.000'

接著重整 database 即可發現 movie_bak 已經好了

select count(1) From movie
select * From movie where t>= '2019-05-02 20:06:00'

接著可以看到資料筆數與資料都已還原至 20:06 時的狀態了

 

參考資料

https://blog.miniasp.com/post/2010/04/21/SQL-Server-Full-Differential-Transaction-Backup

https://dotblogs.com.tw/ricochen/archive/2010/05/30/15495.aspx