將資料庫復原至特定復原點的最佳作法
這個主題僅與使用完整模式或大量記錄復原模式的 SQL Server 資料庫有關。它為資料庫還原至特定復原點 (時間點、標示的交易或記錄序號 (LSN)) 提出一些最佳作法。
使用 STANDBY 尋找未知的時間點
有時候,您會想要將資料庫還原到特定的時間點,但是不確定哪個時間點最符合復原目標 (即最佳復原點)。若要尋找此復原點,您可以使用 RESTORE ... WITH STANDBY **=**standby_file_name 搭配 STOPAT 子句,在您要尋找的復原點之前設定目標時間。STANDBY 還原作業會復原資料庫供唯讀存取,讓您檢查資料庫,以尋找最佳復原點。
透過使用一系列的 STANDBY 還原作業,您可以累加地向前復原主要資料檔以及 (選擇性) 其他資料檔,直到找到最佳復原點。識別出最佳復原點之後,您可以再次向前復原資料庫,並使用 WITH STOPAT 將該最佳復原點指定為目標時間點。到達此目標時間點時,請使用 WITH RECOVERY 選項還原部分資料庫。
接著可以還原及復原其餘檔案 (若有的話),以便與資料庫保持一致。在還原最後一個完整記錄備份之後,請還原目標復原點之後建立的第一個記錄備份。
如需有關 STANDBY 選項的詳細資訊,請參閱<RESTORE 引數 (Transact-SQL)>。
指定還原順序中的較早時間點
還原順序包含一個或多個還原作業,會在一個或多個還原階段中移動資料。如果您在順序這方面提供更詳細的資訊,就比較不可能遭遇到需要從頭開始的錯誤。對於時間點還原,SQL Server Database Engine 會使用在還原順序開頭 (和期間) 所指定的資訊,來識別還原的時間點目標。如果您在順序中等待太久,順序就會失敗。您必須及早在還原順序中提供停止時間資訊,以確保還原不會超過時間點目標。
如果要在特定復原點停止,您應該在每個 RESTORE LOG 陳述式上傳達這個意圖 (使用 STOPAT、STOPBEFOREMARK 或 STOPATMARK),同時還要指定 RECOVERY 選項。一併使用 RECOVERY 和 STOPAT 選項時,如果交易記錄備份沒有包含所要求的時間 (例如,指定的時間超出交易記錄涵蓋的結束時間),則會產生警告訊息,而且資料庫停留在未復原狀態。到達復原點時,會復原資料庫,如果嘗試還原另一個記錄備份,將會失敗。在還原記錄備份時一併使用 RECOVERY 和 STOPAT 選項,可確保不會有任何記錄還原超過停止時間。
重要事項 |
---|
如果部分還原順序排除任何 FILESTREAM 檔案群組,則不支援時間點還原。您可以強制還原順序,以繼續進行。但是,絕對無法還原 RESTORE 陳述式中省略的 FILESTREAM 檔案群組。若要強制時間點還原,請指定 CONTINUE_AFTER_ERROR 選項,連同 STOPAT、STOPATMARK 或 STOPBEFOREMARK 選項,而且您也必須在後續的 RESTORE LOG 陳述式中指定這些項目。如果您指定 CONTINUE_AFTER_ERROR,則部分還原順序會成功,而 FILESTREAM 檔案群組則會變成無法復原。 |
範例:時間點還原
在下列範例中,還原順序會在套用第一個記錄備份時,開始宣告要在特定時間停止的意圖。在此範例中,停止時間落在差異備份之後的第一個記錄備份上。
RESTORE DATABASE database_name FROM full_backup
WITH NORECOVERY;
RESTORE DATABASE database_name FROM full_differential_backup
WITH NORECOVERY;
RESTORE LOG database_name FROM log_backup
WITH STOPAT = time, RECOVERY;
RESTORE LOG database_name FROM log_backup
WITH STOPAT = time, RECOVERY;
指定的記錄還原成功與否取決於 <time> 是否在記錄備份所擷取的間隔內,如下表所述:
time 與記錄備份所擷取之間隔的關聯性: |
作用 |
---|---|
<time> 在間隔之前 |
還原失敗,未發生向前復原。 |
<time> 在間隔之內 |
順利完成最後一個還原,且已復原資料庫。 |
<time> 在間隔之後 |
順利完成向前復原,但是未復原資料庫 (因為尚未到達 <time>)。 |
在每個後續的 RESTORE 陳述式上宣告停止點
停止點是指定 STOPAT、STOPBEFOREMARK 或 STOPATMARK 選項的陳述式所專用。如果在 RESTORE 陳述式中省略該選項,就會還原完整備份。
隨著時間點還原順序的進行,您可以為 <time> 指定新值來變更復原點 (假設資料庫尚未復原到超過新的 <time>)。
[!附註]
STOPBEFOREMARK 和 STOPATMARK 選項有 mark_name 和 lsn_number 兩個參數。mark_name 參數會識別記錄備份中的交易標示,但只有 RESTORE LOG 陳述式支援此參數。lsn_number 參數會指定記錄序號,而且 RESTORE DATABASE 陳述式和 RESTORE LOG 陳述式中都支援此參數。
變更記錄
更新的內容 |
---|
更正<使用 STANDBY 尋找未知的時間點>一節,釐清 WITH STANDBY 只能將復原處理序的結果恢復舊狀。 |