誤區 #20:在破壞記錄備份鏈之後,需要一個完整備份來重新開始日誌鏈
錯誤
交易記錄備份會備份自前次交易記錄備份以來所有的交易記錄(如果從來沒有過記錄備份的話,那就從上一次完整備份開始)。有好幾種類型的操作會中斷交易記錄的連續性,也就是說除非重新開始新的日誌鏈,SQL Server無法再進行記錄備份。下面這幾種操作都有可能引起日誌鏈斷裂:
由完整復原模式或大容量交易記錄復原模式轉為簡單復原模式
從資料庫鏡像進行恢複
備份日誌時指定了NO_LOG 或 WITH TRUNCATE_ONLY(還好在SQL Server 2008中這個選項被取消了)
更多請看:post BACKUP LOG WITH NO_LOG - use, abuse, and undocumented trace flags to stop it
通過下面的例子對此進行闡述:
複製代碼 代碼如下:CREATE DATABASE LogChainTest;
GO
ALTER DATABASE LogChainTest SET RECOVERY FULL;
GO
BACKUP DATABASE LogChainTest TO DISK = 'C:\SQLskills\LogChainTest.bck' WITH INIT;
GO
BACKUP LOG LogChainTest TO DISK = 'C:\SQLskills\LogChainTest_log1.bck' WITH INIT;
GO
ALTER DATABASE LogChainTest SET RECOVERY SIMPLE;
GO
ALTER DATABASE LogChainTest SET RECOVERY FULL;
GO
結果是: 複製代碼 代碼如下:已為資料庫 'LogChainTest',檔案 'LogChainTest' (位於檔案 1 上)處理了 168 頁。
已為資料庫 'LogChainTest',檔案 'LogChainTest_log' (位於檔案 1 上)處理了 2 頁。
BACKUP DATABASE 成功處理了 170 頁,花費 0.224 秒(5.916 MB/秒)。
已為資料庫 'LogChainTest',檔案 'LogChainTest_log' (位於檔案 1 上)處理了 3 頁。
BACKUP LOG 成功處理了 3 頁,花費 0.121 秒(0.137 MB/秒)。
我首先建立了一個資料庫,將其設定為完整復原模式,這個是日誌鏈的起點,然後轉為簡單復原模式,再轉為完整復原模式。
下面我再嘗試進行記錄備份 複製代碼 代碼如下:BACKUP LOG LogChainTest TO DISK = 'C:\SQLskills\LogChainTest_log2.bck' WITH INIT;
GO
則會得到如下報錯資訊: 複製代碼 代碼如下:訊息 4214,層級 16,狀態 1,第 1 行
無法執行 BACKUP LOG,因為當前沒有Database Backup。
訊息 3013,層級 16,狀態 1,第 1 行
BACKUP LOG 正在異常終止。
SQL Server已經記錄了我破壞日誌鏈的操作以及與進行日誌 備份無法備份自上次記錄備份以來所有的日誌,所以SQL Server不允許我進行記錄備份。
這個誤區是說此時就需要完整備份才能恢複日誌鏈,但實際上,我只需要做一個差異備份(這個差異備份的跨度超過日誌鏈斷裂的間隙),代碼如下: 複製代碼 代碼如下:BACKUP DATABASE LogChainTest TO DISK = 'd:\Test_bak\LogChainTest_log1.bck' WITH INIT, DIFFERENTIAL;
GO
BACKUP LOG LogChainTest TO DISK = 'd:\Test_bak\LogChainTest_log1.bck' WITH INIT;
GO
得到的結果: 複製代碼 代碼如下:已為資料庫 'LogChainTest',檔案 'LogChainTest' (位於檔案 1 上)處理了 64 頁。
已為資料庫 'LogChainTest',檔案 'LogChainTest_log' (位於檔案 1 上)處理了 1 頁。
BACKUP DATABASE WITH DIFFERENTIAL 成功處理了 65 頁,花費 0.119 秒(4.267 MB/秒)。
已為資料庫 'LogChainTest',檔案 'LogChainTest_log' (位於檔案 1 上)處理了 1 頁。
BACKUP LOG 成功處理了 1 頁,花費 0.052 秒(0.150 MB/秒)。
不得不說這種方式更Cool一些,因為你不再需要一個完整備份才能繼續進行記錄備份。
如果你的備份策略中包含了檔案或是檔案組的備份,你甚至只需要單個檔案的差異備份就能繼續進行記錄備份。但前提是這個備份的跨度超過了斷裂LSN的長度,當然這是更深的話題了。
又揭穿了一個誤區!