SQL Server備份事務日誌結尾(Tail)

隨夢而飛發表於2015-04-23

原文:http://blog.csdn.net/tjvictor/article/details/5256906

 

事務日誌結尾經常提交資料庫未備份的事務日誌內容。基本上,每一次你執行事務日誌備份時,你都在執行事務日誌結尾的備份。

那為什麼會這麼設計呢?因為也許由於介質的損壞,當資料庫已經不再可用時,麻煩就來了。如果下一個邏輯步驟正好就是要備份當前事務日誌的話,可以應用這個備份來使資料庫處於等待(Standby)狀態。你甚至可以在資料庫檔案不可用的狀態下使用NO_TRUNCATE來備份事務日誌,例如:

BACKUP LOG AdventureWorks TO DISK = 'G:/Backups/AdventureWorks_log_tail.bak' WITHNO_TRUNCATE

然後,你可以使用備份日誌的結果把處於等待狀態的資料"帶回"到發生錯誤之前的狀態。

注意:這也是另一個讓你把事務日誌檔案同資料檔案放在不同磁碟上的原因。如果它們在同一個磁碟上的話,磁碟損壞了,你就不能從磁碟上再取到事務日誌的備份了。

另一個問題是,當你的資料使用批量日誌恢復模型時,當前的事務日誌只包括最小化的日誌事務。在這種情況下,一個事務日誌備份需要儲存資料頁的修改。如果你的資料檔案不可用了,你也就不能備份事務了,甚至是帶NO_TRUNCATE選項也不行。

最後,如果你使用的是SQL Server 2005或以上版本,每次你要恢復的資料庫都是已經存在的資料庫,而且是完整或是批量日誌恢復模型,而且事務日誌包括活動事務的話,那會收到和下面類似的錯誤資訊:

Server: Msg 3159, Level 16, State 1, Line 1 
The tail of the log for the database "AdventureWorks" has not been backed up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose. Use the WITH REPLACE or WITH STOPAT clause of the RESTORE statement to just overwrite the contents of the log. 
Server: Msg 3013, Level 16, State 1, Line 1 
RESTORE DATABASE is terminating abnormally.

上面的資訊就是SQL Server在告訴你,事務日誌中有些日誌記錄還沒有被備份。假如當前事務日誌可以被丟棄的話,你可以使用REPLACE選項來讓SQL Server忽略當前的事務日誌。如下:

RESTORE DATABASE AdventureWorks FROM DISK = 'G:/Backups/AdventureWorks_full.bak' WITH REPLACE

   

本文翻譯自sqlbackuprestore,更多精彩內容請瀏覽http://www.sqlbackuprestore.com

相關文章