天天看點

SQL Server中災難時備份結尾日志(Tail of log)的兩種方法

簡介

    在資料庫資料檔案因各種原因發生損壞時,如果日志檔案沒有損壞。可以通過備份結尾日志(Tail of log)使得資料庫可以恢複到災難發生時的狀态。

    例如:

     grid.ai

     上圖中。在DB_1中做了完整備份,在Log_1,Log_2處做了日志備份。在Log_2備份之後不久,發生了故障。從Log_2備份到災難發生時之間的日志。就是結尾日志(Tail of log)。如果不能備份尾端日志,則資料庫隻能恢複到Log_2備份的點。尾端日志期間所做的改動全部丢失。更詳細的概念可以檢視我之前關于日志的博文。

     下面我們分别來看在SQL Server執行個體運作良好和SQL Server執行個體崩潰狀态下,備份結尾日志方法。

SQL Server執行個體運作正常時,結尾日志的備份

    下面來模拟一次災難下結尾日志的備份:

    1

    現在資料庫TestBackUp有了一個完整備份和一個日志備份,而最後那條”日志備份後的測試資料”是在上次日志備份之後的,被結尾日志所包含。

    接下來模拟資料庫檔案所在磁盤損壞(日志檔案完好)

    1.停掉Server SQL服務

    2.删除資料庫檔案(MDF檔案)

     此時在SSMS中通路資料庫TestBackUp會出現不可用:

     2

     此時,因為SQL Server執行個體可用,通過在T-SQL語句指定NO_TRUNCATE選項(必須指定,否則無法備份尾端日志),備份尾端日志:

    3

     依次進行完整備份恢複,和兩次事務日志恢複,可以看到資料已經成功恢複到災難點:

    4

當SQL Server執行個體崩潰時,結尾日志的備份

    此時由于各種原因,所處的SQL Server執行個體也崩潰,無法通過T-SQL來備份結尾日志。此時資料庫檔案損壞,而事務日志檔案保持正确。

    假設情況和上面例子一樣,此時我手裡有一個完整備份(TestBackUp_FULL.bak)和一個日志備份(TestBackUp_log1.bak),還有一個日志檔案(ldf)。

    這時我将這幾個檔案拷貝到其他擁有SQL Server執行個體的機器上。

    建立一個和原資料庫名一樣的資料庫。設定為脫機:

    5

    删除建立資料庫的MDF檔案。

    将需要備份的資料庫的日志檔案替換掉原有的LDF檔案。

    此時直接備份結尾日志,成功:

    6

    原有Sql server執行個體恢複後一次恢複完整備份和兩個日志備份。成功恢複到災難發生點。

總結

    我相信看到這篇文章的人都不希望碰到用到上面兩種方法的情況。但是,墨菲定律(事情如果有變壞的可能,無論這種可能性有多小,它總會發生)是殘酷的,事先練習一下總是比真正遇到情況用生産資料練習惬意的多:-)

分類: SQL Server 日志

本文轉自CareySon部落格園部落格,原文連結:http://www.cnblogs.com/CareySon/archive/2012/02/23/2365006.html,如需轉載請自行聯系原作者