很多DBA對還原時制定RECOVERY 與 NORECOVERY選項都很熟悉,但是對於STANDBY就有點茫然了,今天一起來學習下吧。
--===================================================================
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
--===================================================================
按我的理解來講:就是在還原時,將未提交的事務寫入到一個“備用文件”中,然后回滾未提交事務,保證數據一致性,將數據庫設置為“備用/只讀”狀態,使用戶可以訪問數據庫,並能在后續繼續使用日志備份來還原數據庫。
日志傳送中備用節點可讀便是使用這種方式
--==================================================================
讓我們實驗學習一下
--============================= --創建數據庫 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: 誰有奶茶妹高清大圖,給小弟我傳一份,我放到下個貼中。。
下班灰家,諸位周末快樂