33

33. 還原及回復資料庫

還原方法

執行資料庫還原

規劃嚴重損壞的回復

本章總結

在 第 32 章 中，我們學到了系統備份的重要性，以及如何執行備份。本章將繼續上一章所提的資料庫保護與建立的說明。我們將學習如何還原資料庫、如何回復系統，還有資料庫回復的運作方式。正如您所見，備份執行的類型會影響到回復的進行。除了學習關於還原與回復資料庫，也會介紹 記錄檔傳送 （log shipping）。記錄檔傳送是 Microsoft SQL Server 2000 中的新功能，讓您用原始的伺服器交易紀錄在另一個伺服器上建立備用副本。

說明

有些 DBA 提到還原與回復資料庫的過程都稱作 recovering the database。然而，這些程序是大不相同的。 第 32 章 說明了從備份還原資料庫與 SQL Server 回復過程的差異。在任何情況下，將資料庫帶回系統失敗前的狀態，就是備份、還原和回復操作執行的主要目標。

還原方法

如前所提，執行備份的類型影響了還原操作的性質。在這個章節中我們將學習如何從完整備份、差異式備份、以及交易紀錄備份執行還原。

從完整備份還原

從完整備份還原是相當簡單直接的過程：只要用 SQL Server Enterprise Manager或 Transact-SQL (TSQL)命令還原備份檔案。本章稍後會有這兩種方法的使用說明。如果在完整備份後，打算從差異式備份還原，只要確定有最近的交易紀錄備份，如本章後面

< 從交易紀錄備份還原 > 章節所言，並在執行還原時指定 NORECOVERY 選項就行了。

說明

還原操作有個重要的特性，就是 RECOVERY 的選項。它命令 SQL Server 在還原完成後用連線交易紀錄來回復資料庫。如果想利用差異式備份檔或者交易紀錄檔，記得要確定已經指定 NORECOVERY 選項。

從差異式備份還原

要從差異式備份還原，必須先從完整備份還原，然後還原上次完整備份後的所有差異式備份檔案。記住，差異式備份是用來備份在最近一次完整備份或差異式備份後更改過的資訊。確定您使用的是 NORECOVERY 選項，除非您正在還原最後一個備份檔案，而還原最後一個備份檔案可以用 RECOVERY 選項。如果在差異式備份之外還從交易記錄檔執行還原，就必須同時備份目前的記錄檔並應用所有更改過的記錄檔，這將在下一節中提到。

從交易記錄檔備份還原

執行回復操作將使資料庫的狀態返回到失效前的那一點，先還原資料檔案，然後還原從開始備份以來對資料庫的更改內容。您可以儲存所有失效以來的交易記錄檔備份來還原這些變更。

為了確保在還原這些記錄檔的過程中沒有遺失任何最新交易，必須先保存目前的記錄檔。如果忘了保存目前的記錄檔，會因為還原操作覆寫交易記錄而遺失記錄在記錄檔中的大部分最新的更改。

要使用交易記錄檔將資料庫還原到失效前的狀態，請依下列步驟進行（這些是建立在

第 32 章 中所學到的技術基礎上）：

1. 使用 NO_TRUNCATE 選項備份目前使用中的交易記錄檔。
2. 還原最近的完整備份。
3. 還原所有的差異式備份，將資料庫還原到最後的備份狀態。
4. 還原所有從最後的差異式備份以來的交易記錄檔備份，以重置所有自最後備份以來所發生的交易。
5. 還原在步驟 1 中建立的交易記錄檔備份，讓資料庫回到失效前的狀態。

在 BULK_LOGGED 回復模式中還原資料庫

如果正在 BULK_LOGGED 回復模式中執行資料庫，需要還原時就必須再做一次記錄操作。這些操作包括 SELECT...INTO、BULK COPY、BCP 和一些 CREATE INDEX 操作，還有已在上一章談過的文字操作。如果覺得這裡所談的內容過於麻煩，可以不要在 BULK_LOGGED 回復模式中執行資料庫。

執行資料庫還原

使用 Enterprise Manager 或 T-SQL 命令可執行還原操作--這兩種方式得到的結果相同。與備份操作不同，SQL Server 沒有提供還原操作精靈。

使用 Enterprise Manager 執行還原

要使用 Enterprise Manage r執行還原操作，請按照下列步驟操作：

1. 在 Enterprise Manager 中，在要還原的資料庫名稱上按滑鼠右鈕，在快顯功能表上選取 所有工作 ，然後選擇 還原資料庫 ，進入 還原資料庫 對話方塊，如圖33-1所示。

   圖33-1　「還原資料庫」對話方塊中的「一般」頁籤

- 在 一般 頁籤的頂端是 還原成資料庫 下拉式清單，這個清單可指定這個備份將被還原的資料庫型態。圖33-1顯示選擇了 Example 資料庫。

這裏並不要求直接用同樣的名稱來還原資料庫－實際上，應該要使用另一個資料庫名稱。例如，假定某個使用者意外地刪除了一個資料表，想要還原完整的資料庫，那麼就會將所有人的資料還原成較早的資料。但是，其實可以將資料還原到重新命名的資料庫中，取出被刪除的資料表，然後將這個資料表插入到仍在工作的資料庫中。

- 接著指定還原操作的類型： 資料庫 、 檔案群組或檔案 或者 來源裝置 。 資料庫 選項可指定還原資料庫。 檔案群組或檔案 選項可指定還原的檔案群組或檔案。 來源裝置 選項可指定還原的裝置，裝置的內容將決定還原的類型。圖33-1顯示選擇了資料庫選項。
- 參數 區域可以讓您設定是否要顯示其他資料庫的備份（從另一個資料庫的備份進行還原），應該要先還原哪個備份（如果設定了多個可用的備份），還有是否應該執行 還原時間點 。 還原時間點 能夠還原資料到特定時間的狀態。例如，如果在12：01時意外的刪除了資料表，可以用 還原時間點 還原12：00時的資料庫，剛好在刪除發生之前。因為有全部可用的備份清單，可以選擇需要使用的備份。如果沒有強制還原最新的備份，那麼資料庫的所有備份都可供選擇。

  在 還原資料庫 對話方塊中可選擇一組備份，然後選擇 屬性 按鈕檢視內容。 備份集屬性 視窗如圖33-2所示。

  圖33-2　備份集屬性視窗

- 選擇 確定 ，返回 還原資料庫 對話方塊的 一般 頁籤，並選擇 檔案群組或檔案 顯示一個不同的畫面，如圖33-3所示。圖33-3顯示 Example 資料庫中所有的檔案和檔案群組備份。要檢視這些檔案和檔案群組備份的屬性，請選取檔案或檔案群組然後選擇 屬性 。

  圖33-3　選取檔案群組或檔案選項後，還原資料庫對話方塊的一般頁籤

- 現在選擇 來源裝置 ，如圖33-4所示。當選取一個還原的特殊備份裝置時，會需要用到這個選項。必須以手動選取這組備份，然後指定 SQL Server 是否應該執行完全還原、差異還原、交易記錄還原或檔案和檔案群組還原。也可以讓 SQL Server 讀取備份資訊，並將這些資訊與其他備份歷史資訊一起儲存在 msdb 資料庫。如果要執行資料庫還原，這些關於備份的資訊就可派上用場了。
- 選取 還原資料庫 對話方塊的 選項 頁籤，如圖33-5所示。在這個頁籤頂端會看到3個核取方塊。 備份還原後，逐一退出已插入的磁帶 核取方塊可確保磁帶不會留在磁帶機中被覆寫。選擇 還原備份前，先提示我 選項提供改變執行備份的機會。而選擇 強制對現有的資料庫進行還原 核取方塊讓您用還原的資料庫覆寫現存的資料庫。在這個頁籤，可以在一個新的資料檔名之下還原資料庫，這對於保留原始資料庫是很有用的。

  圖33-4　選取來源裝置選項之後，還原資料庫對話方塊的一般頁籤

  圖33-5　還原資料庫對話方塊的選項頁籤

  頁籤中其他的選項可指定在回復完成後資料庫應該保持的狀態，如下：

  - 保持資料庫運作，不還原額外的新增交易記錄 這個選項不允許有進一步的差異還原或交易記錄還原的回復。實質上是在還原中設定了 RECOVERY 標記。如果選了這個選項，就不能還原交易記錄檔備份。
  - 使資料庫不運作，但還可以還原額外新增的交易記錄 這個選項在還原中設定了 NORECOVERY 標記。設定了這個標記，就能應用進一步的差異式備份還原和交易記錄檔備份還原。在還原進行過程中，資料庫處於無法操作狀態，這表示在完成整個還原之前，使用者無法存取這個資料庫。
  - 保持資料庫為唯讀的狀態，並可以還原額外新增的交易記錄 這個選項也在還原中設定 NORECOVERY 標記，可以執行差異式備份還原和交易記錄還原。和前面一個選項不同的是在執行還原操作時，使用者可以唯讀的存取這個資料庫。
- 在完成設定選項後，選擇 確定 來開啟還原操作。透過一個訊息方塊可以瞭解還原操作的過程，如圖33-6所示。當還原操作完成時，會看到一個狀態方塊，通知還原成功或失敗。

  圖33-6　「還原進度」訊息方塊

說明

SQL Server 備份裝置支援多個不同備份操作的輸出。反之亦然：單一備份可以分散到多個裝置當中。多個備份裝置群組的內容形成一個備份稱為備份集（backup set）。因此一個備份裝置（磁帶、磁碟檔案等）可以支援多個不同資料庫備份集或多個同一資料庫的備份集。

使用 T-SQL 執行還原

RESTORE T-SQL 命令和 BACKUP 命令類似（

第 32 章 中曾經討論過）。如同BACKUP 命令，第一次使用時可能相當困難，但是一些 DBA 還是喜歡將他們的管理程序放置到 SQL 命令檔中，以便於重複執行這些功能。和 BACKUP 命令一樣，RESTORE 命令提供了比 Enterprise Manager 更多的附加選項。

在本節中，我們將討論 RESTORE 命令的語法以及這個命令提供的多種選項。RESTORE 命令有兩種形式顯示如下：

- RESTORE DATABASE 還原完整的資料庫、檔案或檔案群組。
- RESTORE LOG 還原交易記錄檔。

如您所見，所用的命令要依照執行還原操作的類型而定。因為這些命令共用大部分的選項，所以我們稍候將在一個清單中討論這兩種還原類型（資料庫和記錄檔）的所有選項。

RESTORE 陳述式

執行完整資料庫還原時 RESTORE 陳述式的語法如下：

    RESTORE DATABASE database_name
    [   FROM backup_device  ]
    [   WITH options  ]

這個陳述式只要求資料庫的檔案名稱和備份所在的位置。

執行檔案和檔案群組還原時陳述式的語法如下：

    RESTORE DATABASE database_name
    [  FILE = file_name  ]
    [  FILEGROUP = filegroup_name  ]
    [   FROM backup_device  ]
    [   WITH options  ]

這個陳述式只要求資料庫名稱、檔案名稱或檔案群組名稱和備份所在的位置。

執行交易記錄還原時陳述式的語法如下：

    RESTORE LOG database_name
    [   FROM backup_device  ]
    [   WITH options  ]

就如同其他的命令，database_name 是還原將要執行的資料庫名稱。backup_device 參數可以是邏輯備份裝置名稱或實體裝置的名稱。如果要指定一個實體裝置，必須限定它的裝置類型－也就是說，裝置名稱前面必須加上 DISK=、TAPE= 或 PIPE=。可以指定一個或多個裝置，中間以逗號隔開。

說明

如果沒有提供 FORM 子句，還原將無法進行，而且仍然會執行回復（除非執行NORECOVERY 選項）。這項技術可以用來將資料庫設定為回復模式，而不還原其他附加資料。例如，可以執行多個差異還原操作，然後執行 RESTORE 陳述式，不需要 FORM 子句來將資料庫設定為回復模式，就能夠啟動回復過程。

選項

表33-1列出了 RESTORE 命令可用的選項。如您所見，在執行還原操作時，這些選項提供了很大的彈性空間（如果列出的選項只對交易記錄還原有用，將會標示其限制性）。

表33-1　RESTORE 命令選項

選項 | 說明
--- | ---
RESTRICTED_USER | 設定新還原資料庫的安全性，只有 db_owner、dbcreater 和 sysadmin 角色成員才能存取該資料庫。
FILE = file_number | 如果在儲存媒體中有多個備份集，可用來識別所使用的備份集。例如設定該數值為2，則使用磁帶上的第二個備份集。
PASSWORD = password | 指定儲存備份的密碼。
MEDIANAME =media_name | 指定媒體的名稱。
MEDIAPASSWORD = password | 指定儲存媒體的密碼。
MOVE 'logical_file_name' TO 'OS_file_name' | 更改還原檔案的位置，例如：MOVE 'Northwind' TO 'D:\data\Northwind.mdf'。如果舊的磁碟無法使用，而需要還原到新的磁碟上時，可以使用這個選項。
NORECOVERY |RECOVERY | STANDBY = undo_file | NORECOVERY 指定在還原後，交易將無法退回或重新進行。如果將還原其他的備份（差異式備份或交易記錄檔備份），則需要用到這個選項。REVOVERY 為預設選項，它指定執行回復操作，並退回每個沒有提交的變更。STANDBY 指定在還原需要還原情況下，建立還原（undo）檔案。
KEEP_REPLICATION | 指定當資料庫還原時複製設定要保存下來。
NOUNLOAD | UNLOAD | NOUNLOAD 指定在還原完成後不卸載儲存媒體（例如，覆寫備份磁帶並彈出）。UNLOAD 為預設選項，指定在還原完成後卸載儲存媒體。
REPLACE | 指出即使資料檔案已經存在，SQL Server 仍將還原這些檔案。現存的檔案將被刪除和覆寫。如果沒有指定 REPLACE，那麼 SQL Server 將會核對 database_name 是否已經存在。如果已經存在，那麼將終止還原操作。這個安全特性幫助避免無意地將還原覆寫正在工作的資料庫。
RESTART | 指定 SQL Server 在還原操作被中斷後重新啟動還原操作。
STATS [ = percentage ] | 在還原操作完成了指定的百分率後顯示訊息。如果需要監控操作的過程，這個選項將會很有用。
PARTIAL | 指定執行部份還原。
STOPAT = date_time (log restore only) | 指定資料庫回復到 data_time 指定時刻的資料狀態（只對記錄檔還原有效）。
STOPATMARK = 'mark' | 指定還原操作進行到標記處。
STOPBEFOREMARK = 'mark' | 指定還原操作進行到標記之前。

說明

命名交易（Named transactions）是 SQL Server 2000 中的新功能。它們是使用命令 BEGIN TRANSACTION ... WITH MARK 的 mark_name 選項建立的，特點是可以使用 RESTORE 命令中的 STOPATMARK 和 STOPBEFOREMARK 功能。

真實世界 使用RESTORE

這裏有幾個使用 RESTORE T-SQL 命令的例子。

這個陳述式還原 Example 資料庫的資料檔：

    RESTORE DATABASE Example
    FROM Backup_Dev_1, Backup_Dev_2
    WITH
    NORECOVERY,
    STATS = 5
    GO

這個陳述式還原 Example 資料庫的交易記錄檔：

    RESTORE LOG Example
    FROM Backup_Dev_3, Backup_Dev_4
    WITH
    NORECOVERY,
    STATS = 5,
    UNLOAD
    GO

和還原的結果一樣，輸出將顯示操作完成的百分率。將通知還原了多少頁面、還原花了多少時間，以及還原執行的速度（MB/sec）。

現在可用以下的命令回復資料庫：

    RESTORE LOG Example
    WITH RECOVERY
    GO

您將再次看到關於還原操作的統計。

規劃嚴重損壞的回復

只有簡單地叢集化伺服器（

第 12 章 所討論的）或使用 RAID（ 第 5 章 所討論的）來改善系統正常的工作時間是不夠的。您必須在嚴重損壞發生前做好回復的計劃。熟悉如何在必要時執行有效的資料庫的備份和還原是十分重要的，但是還是必須準備好在必要時從一無所有開始重建系統。準備工作包括檔案管理和計劃編制。此外還要使用新的 SQL Server 2000 中還原的功能來提供足夠的回復能力。這個功能讓交易記錄檔可以從主要系統移至備份系統中運作。

作為一個 DBA，應該規劃一個最大工作時間的計劃。這個計劃應該包括下列元件：

- 記錄當前組態檔案
- 建立容錯環境
- 準備即時回復
- 記錄資料庫回復計劃檔案

  大部分的步驟都涉及到計劃編制和檔案管理。通常回復計劃並沒有記錄，並且只有計劃的開發者才能執行這個計劃，一旦這個特定成員未能出現，就會出現嚴重損壞。

  說明

  確認記錄的嚴重損壞回復計劃檔案，並指派候補人員在嚴重損壞發生時，您無法在場時的執行計劃。

  記錄當前組態檔案

  如果建立當前組態的步驟沒有很好的記錄成檔案，那麼可能在系統需要重新建構或者在系統中增加新的硬體時會出現問題。記錄當前組態檔案能夠更快速的重建、重新安裝和重新設定系統。確定已經包括了下列資訊：

- 硬體配置 包括硬體的類型和數量、RAID組態和其他選項。
- 安裝的軟體產品 包括安裝在伺服器上所有軟體的完整資訊。

  建立容錯環境

  就像 第 5 章 看到的，容錯 RAID 磁碟區的使用可以大大的降低系統失效的可能性。磁碟是機械元件，跟物件一樣會有磨損。使用容錯磁碟區，就能在重新安裝作業系統、SQL Server 和重建來自備份的資料庫時減少許多麻煩，重建過程是一個耗時又耗力的過程（耗費主要在勞動和系統故障期間損失的收入方面）。

  如果容錯磁碟損毀了，請盡可能快的將它更換。總會有磁碟可能損毀，而一些容錯的形式可以在只損毀一個磁碟的情況下繼續工作。可準備磁碟隨時備用。

  準備即時回復

  準備好在必要時回復資料庫。備份應該儲藏在其他地方，防止如火災或洪水的災難，但您還是應該在手邊保存有最近的備份，因為您可能無法很快速的從其他地方取到備份。備份階段區域（backup staging area）是一種最受歡迎的方式，用這種方式可以在工作站保存最新的備份，還可以提高備份和還原的效能。備份階段區域在網路上某處磁碟中儲存最新的資料庫和交易記錄檔備份。在需要還原時，不需要使用磁帶或從遠離工作站的儲藏處取得備份─還原可以立即進行。如果需要立即執行還原，這種技術就很有用了，但是由於必須佔用硬體資源來儲存備份，因此它的硬體需求很高。必須考量預算和需求來決定是否需要。

  記錄資料庫回復計劃檔案

  因為在資料庫必須回復的情況發生時，您也許不在現場，所以應該謹慎記錄資料庫回復計劃，並和其他成員共用這些資訊，這樣在必要時他們就可以回復系統。如果自最後一次資料庫還原之後過了很長的時間，資料庫回復計劃檔案也會是一個有效的備忘手冊。在任何事件中，保有資料庫回復計劃的手寫拷貝都能使還原過程執行的更加平穩。

  記錄檔傳送

  SQL Server 2000 中的記錄檔傳送功能讓您將最新交易記錄檔應用在備用系統中，以建立備用系統並隨時更新。備用系統保持參數回復模式，持續地讓交易記錄檔應用其上。即使系統在回復模式仍可以進行唯讀查詢，因此可以讓您使用備用系統來卸除報告任務。

  在主要伺服器的失效事件中，備用伺服器可以簡單而快速地到新的伺服器上。這個功能已經有很多人在 SQL Server 7 中使用過，在 Microsoft 中也可支援，還加進一些好用的功能。這些功能包括透過 資料庫維護計劃精靈 和 SQL Server 代理程式啟動與維護備用系統的能力。

  本章總結

  關於資料庫備份、還原和回復操作的討論到此結束。在這兩章中，您已經學到了如何有效的進行系統的備份和還原，以及 SQL Server 回復是如何運作的，您也看到了如何使用 Enterprise Manager 和 T-SQL 命令執行這些操作。本章著重在討論回復操作和準備嚴重損壞回復計劃。記住，系統的安全性是 DBA 的主要職責之一。