不少DBA對還原時制定RECOVERY 與 NORECOVERY選項都很熟悉,可是對於STANDBY就有點茫然了,今天一塊兒來學習下吧。sql
--===================================================================數據庫
MSDN以下說:服務器
STANDBY =standby_file_name
指定一個容許撤消恢復效果的備用文件。
備用文件用於爲 RESTORE WITH STANDBY 的撤消過程當中修改的頁面保留一個「寫入時副本」預映像。備用文件容許用戶在事務日誌還原期間以只讀方式訪問數據庫,並容許數據庫用於備用服務器情形,或用於須要在日誌還原操做之間檢查數據庫的特殊恢復情形。執行完 RESTORE WITH STANDBY 操做以後,下一個 RESTORE 操做會自動刪除撤消文件。若是在下一個 RESTORE 操做以前手動刪除了這個備用文件,則必須從新還原整個數據庫。當數據庫處於 STANDBY 狀態時,您應將這個備用文件視爲和任何其餘數據庫文件一樣重要。該文件與其餘數據庫文件不一樣,數據庫引擎僅在活動還原操做過程當中持續打開該文件。
給定備用文件的大小要求取決於由還原操做過程當中未提交的事務所致使的撤消操做數。學習
連接地址:http://msdn.microsoft.com/zh-cn/library/ms178615(v=sql.105).aspx測試
--===================================================================spa
按個人理解來說:就是在還原時,將未提交的事務寫入到一個「備用文件」中,而後回滾未提交事務,保證數據一致性,將數據庫設置爲「備用/只讀」狀態,使用戶能夠訪問數據庫,並能在後續繼續使用日誌備份來還原數據庫。操作系統
日誌傳送中備用節點可讀即是使用這種方式日誌
--==================================================================code
讓咱們實驗學習一下blog
--============================= --建立數據庫 CREATE DATABASE TestDB3 GO USE TestDB3 GO --============================= --建立測試表 SELECT * INTO TB01 FROM sys.all_columns WHERE 1<>1 GO --============================== --建立完整備份 BACKUP DATABASE TestDB3 TO DISK ='D:\TestDB3_F1.BAK' --============================== --向測試表中插入100條數據並提交事務 INSERT INTO TB01 SELECT TOP(100) * FROM sys.all_columns --================================ --新開向測試表插入1000條數據,暫時不提交 BEGIN TRAN DECLARE @ID INT SET @ID=10 WHILE(@ID>0) BEGIN INSERT INTO TB01 SELECT TOP(100) * FROM sys.all_columns SET @ID=@ID-1 END
咱們再開啓一個回話,作第一第二天志備份
--=========================================== --第一第二天志備份,包含一個100條插入的已提交事務 --和一個1000條插入的未提交事務 BACKUP LOG TestDB3 TO DISK ='D:\TestDB3_L1.BAK'
而後回到第一個回話,提交事務並作第二日誌備份
--=========================================== --提交事務並作第二第二天志備份,包含一個100條插入 --的已提交事務和一個1000條插入的已提交事務 BACKUP LOG TestDB3 TO DISK ='D:\TestDB3_L2.BAK'
此時咱們有一個完整備份和兩個日誌備份,讓咱們來還原數據庫
--======================================================== --使用完整備份來還原數據庫[TestDB4],並指定NORECOVERY來使得 --數據庫處於"正在還原"狀態 RESTORE DATABASE [TestDB4] FROM DISK = N'D:\TestDB3_F1.BAK' WITH FILE = 1, MOVE N'TestDB3' TO N'D:\DB\TestDB4.mdf', MOVE N'TestDB3_log' TO N'D:\DB\TestDB4_1.LDF', NORECOVERY, NOUNLOAD, STATS = 10 GO --====================================================== --使用日誌備份來還原,使用STANDBY選項來使得數據庫處於"備用/只讀" RESTORE LOG [TestDB4] FROM DISK = N'D:\TestDB3_L1.BAK' WITH STANDBY = N'D:\ROLLBACK_UNDO_TestDB4.BAK', NOUNLOAD, STATS = 10
此時數據庫能夠訪問,查詢表會發現表中有100條數據,剛好是第一個提交事務的數據,第二個未提交事務插入的1000條數據沒法查詢到。
再來查看STANDBY指定的文件
繼續還原日誌
--=============================================== --繼續還原日誌備份 BACKUP LOG TestDB3 TO DISK ='D:\TestDB3_L1.BAK'
會發現能夠正常還原!
咱們重作上面還原步驟,但在最後一次還原日誌以前,把STANDBY指定的文件刪除掉,會有如下錯誤提示:
消息 3441,級別 17,狀態 1,第 3 行 在啓動備用數據庫 'TestDB4' (數據庫 ID 爲 10)的過程當中,RESTORE 語句沒法訪問它的備用文件('D:\ROLLBACK_UNDO_TestDB4.BAK')。
操做系統錯誤爲 '2(系統找不到指定的文件。)'。診斷該操做系統錯誤,並更正此問題,而後重試啓動操做。
PS:在生產環境,不要輕易刪除STANDBY指定的文件哦,要不你就「哭吧哭吧不是罪啦」
--============================================================================================
讓咱們繼續試驗
對於「備用/只讀」的數據庫,咱們使用使用RESTORE方式來將其修改成「正在還原」狀態
--========================================= --使用 RESTORE 來將數據庫重置爲"正在還原狀態" RESTORE DATABASE TestDB4 WITH NORECOVERY
並且還能夠繼續使用後續日誌備份來還原,證實上面語句使用STANDBY指定的文件來還原了數據庫。
PS:當數據庫被還原到「正在還原」狀態後,STANDBY指定的文件會被默認刪除掉哦。
既然「備用/只讀」狀態能夠利用還原來轉變成「正在還原」狀態,那麼「正在還原」狀態是否是也可使用還原來轉變成「備用/只讀」呢?答案是確定滴
--============================================ --使用RESTORE 來將數據庫從"正在還原"狀態轉變成"備用/只讀"狀態 RESTORE DATABASE TestDB4 WITH STANDBY = N'D:\ROLLBACK_UNDO_TestDB4.BAK'
--============================================================================================
打完收工,妹子鎮貼
PS: 誰有奶茶妹高清大圖,給小弟我傳一份,我放到下個貼中。。
下班灰家,諸位週末快樂