執行檔案還原 (完整復原模式)

這個主題僅與在完整或大量載入復原模式下,包含多個檔案或檔案群組的資料庫有關。

檔案還原的目的是還原一或多個損毀的檔案,而不還原整個資料庫。SQL Server 的所有版本全都支援在資料庫離線時還原檔案 (「離線分頁還原」)。SQL Server 2005 Standard、SQL Server 2005 Express Edition 和 SQL Server 2005 Workgroup 及更新版本僅支援離線還原,而且將檔案還原至主要檔案群組時,資料庫一定要離線。如果資料庫已經離線,SQL Server 2005 Enterprise Edition 及更新版本就會使用離線還原。

在 SQL Server 2005 Enterprise Edition 和更新的版本中,如果資料庫在檔案還原期間處於線上,則資料庫會保持在線上。當資料庫仍在線上時還原和復原檔案,就稱為「線上檔案還原」。

這些檔案還原實例如下:

  • 離線檔案還原

    在離線檔案還原中,還原損毀的檔案或檔案群組時,資料庫處於離線狀態。在還原順序結束後,資料庫會恢復上線。

  • 線上檔案還原

    在 SQL Server 2005 Enterprise Edition 及更新的版本中,檔案還原會在資料庫處於線上狀態時自動在線上執行。不過,包含正在還原之檔案的任何檔案群組都會離線。離線檔案群組中的所有檔案都復原後,檔案群組就會自動回到線上。如需有關線上還原的詳細資訊,請參閱<執行線上還原>。

    [!附註]

    只有線上檔案群組可以查詢或更新。嘗試存取處於離線狀態的檔案群組 (包括含有正在還原或復原之檔案的檔案群組) 會導致錯誤發生。

如果正在還原的檔案群組為可讀寫,則必須在還原最後一個資料或差異備份之後,套用無間斷的記錄備份鏈結。這會將檔案群組向前復原到位於記錄檔內目前使用中記錄檔記錄上的記錄檔記錄。復原點通常接近記錄的結尾,但不一定如此。

如果正在還原的檔案群組為唯讀,通常沒有必要套用記錄備份,所以會略過。如果是在檔案變成唯讀之後進行的備份,此備份就是要還原的最後一個備份。向前復原會在目標點停止。

還原檔案或檔案群組

從檔案備份和差異檔案備份還原損毀的一或多個檔案

  1. 建立使用中交易記錄的結尾記錄備份。

    如果因為記錄毀損而無法進行,就必須還原整個資料庫。如需有關如何備份交易記錄的詳細資訊,請參閱<建立交易記錄備份>。

    重要事項重要事項

    如果是離線檔案還原,一定要在檔案還原之前進行結尾記錄備份。如果是線上檔案還原,一定要在檔案還原之後進行記錄備份。為了讓檔案可以復原到與資料庫其餘部分一致的狀態,進行這個記錄備份有其必要。

  2. 從每個損毀檔案的最近一次檔案備份還原該檔案。

  3. 還原每個已還原檔案的最新差異檔案備份 (如果有的話)。

  4. 依序還原交易記錄備份,從包含最舊還原檔案的備份開始,到步驟 1 所建立的結尾記錄備份結束。

    您必須還原在檔案備份之後建立的交易記錄備份,才能讓資料庫恢復一致的狀態。交易記錄備份可以快速地向前復原,因為只需套用適用於還原檔案的變更。還原個別檔案比還原整個資料庫更為理想,因為不需複製未受損的檔案,便可接著向前復原。不過,仍然需要讀取記錄備份的整個鏈結。

  5. 復原資料庫。

[!附註]

檔案備份可以用來將資料庫還原至較早的時間點。若要這樣做,您必須還原整個檔案備份組,然後依序還原交易記錄備份,以回到上一次還原的檔案備份結尾之後的目標時間點。如需有關時間點復原的詳細資訊,請參閱<將資料庫還原到備份中的時間點>。

還原檔案與檔案群組

進階主題

離線檔案還原的 Transact-SQL 還原順序 (完整復原模式)

檔案還原實例包含複製、向前復原及復原適當資料的單一還原順序。

下列 Transact-SQL 程式碼顯示,檔案還原實例的還原順序中重要的 RESTORE 選項。與這個檔案還原無關的語法和詳細資料都會省略。

此範例示範如何利用 NORECOVERY 來離線還原兩個次要檔案 A 和 B。接下來,此範例會以 NORECOVERY 套用這兩個記錄備份,然後再以 RECOVERY 套用結尾記錄備份以進行還原。為了進行離線檔案還原,此範例一開始會讓檔案離線。

--Take the file offline.
ALTER DATABASE database_name MODIFY FILE SET OFFLINE
-- Back up the currently active transaction log.
BACKUP LOG database_name
   TO <tail_log_backup>
   WITH NORECOVERY
GO 
-- Restore the files.
RESTORE DATABASE database_name FILE=<name> 
   FROM <file_backup_of_file_A> 
   WITH NORECOVERY
RESTORE DATABASE database_name FILE=<name> ......
   FROM <file_backup_of_file_B> 
   WITH NORECOVERY
-- Restore the log backups.
RESTORE LOG database_name FROM <log_backup> 
   WITH NORECOVERY
RESTORE LOG database_name FROM <log_backup> 
   WITH NORECOVERY
RESTORE LOG database_name FROM <tail_log_backup> 
   WITH RECOVERY