天天看點

SQLSERVER 恢複指令restore總結

作者:雪竹頻道

一、概述

SQLSERVER的備份與恢複指令:BACKUP和RESTORE是一對孿生兄弟,在前一篇文章中我們介紹了BACKUP指令及其選項的使用,

就像 BACKUP 指令一樣,RESTORE 指令也有很多的選項,了解和掌握這些選項的含義是SQLSERVER成功恢複所必需的。

二、指令

2.1 RESTORE指令

2.1.1 RESTORE HEADERONLY

RESTORE HEADERONLY 選項允許您檢視特定備份裝置的所有備份的備份頭資訊。在大多數情況下,您建立的每個備份隻有一個備份存儲在實體檔案中,是以您可能隻會看到一個标題記錄,但如果您在一個檔案中有多個備份,您會看到每個備份的資訊。

T-SQL

RESTORE HEADERONLY FROM DISK = 'C:\AdventureWorks.BAK'
GO           

結果集如下所示,使用 HEADERONLY 時會傳回很多重要資訊。

SQLSERVER 恢複指令restore總結
SQLSERVER 恢複指令restore總結

SQL Server Management Studio

  • 右鍵單擊資料庫
  • 選擇“恢複資料庫...”
  • 選擇“從裝置:”,然後單擊“...”
  • 單擊“添加”并選擇後備檔案,在本例中為“C:\AdventureWorks.BAK”并單擊“确定”
  • 再次點選“确定”可以看到備份檔案的内容,下圖可以看到這個檔案有兩個備份
SQLSERVER 恢複指令restore總結

2.1.2 RESTORE LABELONLY

RESTORE LABELONLY允許您檢視備份裝置的備份媒體資訊。是以,如果備份裝置(例如備份檔案)有多個備份,您将隻能獲得一條記錄,該記錄會為您提供有關媒體集的資訊,例如用于建立備份的軟體、媒體的建立日期等。

T-SQL

RESTORE LABELONLY FROM DISK = 'C:\AdventureWorks.BAK'
GO           

結果集如下所示,使用 LABELONLY 時會傳回很多重要資訊。

SQLSERVER 恢複指令restore總結

2.1.3 RESTORE FILELISTONLY

RESTORE FILELISTONLY 選項允許您檢視已備份檔案的清單。是以,例如,如果您有完整備份,您将看到所有資料檔案 (mdf) 和日志檔案 (ldf)。此資訊隻能使用 T-SQL 傳回,無法從 SQL Server Management Studio 擷取此資訊。RESTORE FILELISTONLY 選項可以簡單列出備份中包含的檔案,如果一個檔案中有多個備份并且您沒有指定“WITH FILE = X”,您将隻能獲得檔案中第一個備份的資訊。要擷取檔案編号,請使用 RESTORE HEADERONLY。

T-SQL

RESTORE FILELISTONLY FROM DISK = 'C:\AdventureWorks.BAK' WITH FILE = 1
GO           

結果集如下所示。這裡有用的東西包括LogicalName 和PhysicalName。

SQLSERVER 恢複指令restore總結
SQLSERVER 恢複指令restore總結

2.1.4 RESTORE DATABASE

RESTORE DATABASE 選項允許您恢複完整、差異、檔案或檔案組備份。恢複資料庫時需要對資料庫進行獨占通路,這意味着沒有其他使用者連接配接可以使用該資料庫。可以使用 T-SQL 或使用 SQL Server Management Studio 完成 RESTORE DATABASE 選項。

T-SQL

恢複完整備份

這将使用指定檔案恢複資料庫。如果資料庫已經存在,它将覆寫檔案。如果資料庫不存在,它将建立資料庫并将檔案恢複到備份中指定的相同位置。可以使用RESTORE FILELISTONLY檢查原始位置。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
GO           

恢複完整備份允許額外的恢複,例如差異或事務日志備份 (NORECOVERY)

NORECOVERY 選項在恢複完成後使資料庫處于恢複狀态。這允許您恢複其他檔案以使資料庫更新。預設情況下,此選項處于關閉狀态。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK' WITH NORECOVERY
GO           

恢複差異備份

要恢複差異備份,必須首先使用 NORECOVERY 選項進行完全恢複。然後才可以恢複差異。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK' WITH NORECOVERY
GO
RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.DIF'
GO           

使用具有多個備份的備份檔案進行還原

假設我們使用同一個備份檔案 AdventureWorks.BAK 來存儲完整備份和差異備份。我們可以使用RESTORE HEADERONLY來檢視備份和備份檔案中的位置。假設恢複标頭隻告訴我們在位置 1 我們有完整備份,在位置 2 我們有差異備份。恢複指令将是。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK' WITH NORECOVERY, FILE = 1
GO
RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK' WITH FILE = 2
GO           

2.1.5 RESTORE LOG

RESTORE LOG 指令允許您恢複事務日志備份。這些選項包括恢複整個事務日志或恢複到某個時間點或某個事務标記。為了還原事務日志備份,資料庫必須處于還原狀态,這意味着首先使用 NORECOVERY 選項還原完整備份或完整備份和差異備份,以允許額外的備份,例如還原事務日志備份。

恢複事務日志時,您将需要對資料庫的獨占通路權限,這意味着沒有其他使用者連接配接可以使用該資料庫。如果資料庫處于恢複狀态,這不是問題,因為沒有人可以使用該資料庫。

可以使用 T-SQL 或使用 SQL Server Management Studio 完成 RESTORE LOG 選項。

T-SQL

恢複事務日志備份

要恢複事務日志備份,資料庫需要處于恢複狀态。這意味着您必須恢複完整備份,可能還需要恢複差異備份。

RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN'
GO           

還原多個事務日志檔案 (NORECOVERY)

NORECOVERY 選項在還原完成後使資料庫處于還原狀态。這允許您恢複其他檔案以使資料庫更新。預設情況下,此選項處于關閉狀态。例如需要恢複兩個事務日志備份,第一個使用 NORECOVERY 而第二個語句不使用,這意味着在恢複完成後可以通路資料庫。

RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks_1.TRN' WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks_2.TRN'
GO           

從同一個備份檔案恢複多個事務日志備份

假設我們使用同一個備份檔案 AdventureWorks.TRN 來寫入我們所有的事務日志備份。這不是最佳做法,因為如果檔案已損壞,則可能會損壞此檔案中的所有備份。我們可以使用RESTORE HEADERONLY來檢視備份和備份檔案中的位置。假設恢複标頭隻告訴我們這個檔案中有 3 個事務日志備份,我們想要恢複全部。

RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN' WITH NORECOVERY, FILE = 1
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN' WITH NORECOVERY, FILE = 2
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN' WITH FILE = 3
GO           

2.1.6 RESTORE VERIFYONLY

RESTORE VERIFYONLY 指令檢查備份以確定它是完整的并且整個備份是可讀的。不執行實際還原,而是讀取檔案以確定 SQL Server 在需要使用此備份進行還原時可以讀取它。RESTORE VERIFYONLY 選項是備份完成後檢查每個備份的不錯選擇。不幸的是,這需要額外的處理時間才能完成,但這是一個很好的實踐。以下是您可以使用 T-SQL 和 SSMS 執行此操作的方法。

T-SQL

檢查磁盤上的備份檔案

RESTORE VERIFYONLY 指令将檢查備份檔案并傳回檔案是否有效的消息。如果它無效,這意味着該檔案不能用于恢複,并且應該進行新的備份。需要注意的一點是,如果一個檔案中有多個備份,它隻檢查第一個檔案。

RESTORE VERIFYONLY FROM DISK = C:\AdventureWorks.BAK
GO           

檢查磁盤上的備份檔案是否有特定備份

此指令将檢查此備份檔案中的第二個備份。要檢查備份中的内容,您可以使用RESTORE HEADERONLY并使用 Position 列指定 FILE 編号。

RESTORE VERIFYONLY FROM DISK = C:\AdventureWorks.BAK WITH FILE = 2
GO           

SQL Server Management Studio

使用維護計劃或通過 SSMS 建立備份時,您可以選擇打開 RESTORE VERIFYONLY 選項,如下所示。這可以對所有備份類型進行。

SQLSERVER 恢複指令restore總結
SQLSERVER 恢複指令restore總結

2.2 Restore 選項

除了我們前面已經讨論過的指令之外,Restore還有許多其他選項可以與這些指令一起使用。

  • RECOVERY
  • NORECOVERY
  • STATS
  • REPLACE
  • MOVE
  • STOPAT

2.2.1 RECOVERY

RESTORE ... WITH RECOVERY 選項将資料庫置于可用狀态,是以使用者可以通路已恢複的資料庫。 當您發出 RESTORE DATABASE 或 RESTORE LOG 指令時,預設使用 WITH RECOVERY 選項。無需指定此選項即可執行此操作。

如果您恢複“完整”備份,則預設設定為 RESTORE WITH RECOVERY,是以在資料庫恢複後,您的最終使用者可以使用它。

如果您正在使用多個備份檔案還原資料庫,您需要使用 WITH NORECOVERY 選項進行除最後一次之外的每個還原。

如果您的資料庫仍處于恢複狀态,并且您想在不恢複其他備份的情況下恢複它,您可以發出 RESTORE DATABASE .. WITH RECOVERY 使資料庫聯機供使用者使用。

T-SQL

恢複處于 RECOVERY狀态 如上所述,此選項是預設選項,但您可以按如下方式指定。此選項是預設選項,但您可以按如下方式指定。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH RECOVERY
GO           

對上次備份使用 WITH RECOVERY 恢複多個備份 第一次恢複使用 NORECOVERY 選項,是以可以進行額外的恢複。第二個指令恢複事務日志,然後使資料庫聯機以供最終使用者使用。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN'
WITH RECOVERY
GO           

SQL Server Management Studio

使用 SSMS 恢複時,預設使用 WITH RECOVERY 選項,是以無需設定任何内容,但可以在恢複時在選項頁面上設定或更改。

SQLSERVER 恢複指令restore總結

2.2.2 NORECOVERY

RESTORE ... WITH NORECOVERY 選項将資料庫置于“正在恢複”狀态,是以可以恢複其他備份。當資料庫處于“正在恢複”狀态時,沒有使用者可以通路資料庫或資料庫的内容。

當您發出 RESTORE DATABASE 或 RESTORE LOG 指令時,WITH NORECOVERY 選項允許您在恢複資料庫之前恢複其他備份檔案。是以,這允許您在讓最終使用者通路資料之前盡可能擷取最新的資料庫。

此選項預設不啟用,是以如果您需要通過恢複多個備份檔案來恢複資料庫而忘記使用此選項,則必須重新開始備份過程。

最常見的示例是恢複“完整”備份和一個或多個“事務日志”備份。

T-SQL

恢複完整備份和一個事務日志備份 第一個指令執行恢複并使資料庫處于恢複狀态,第二個指令恢複事務日志備份,然後使資料庫可用。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN'
WITH RECOVERY
GO           

還原完整備份和兩個事務日志備份

首先使用 NORECOVERY 還原前兩個備份,然後使用 RECOVERY 進行最後一次還原。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN'
WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks2.TRN'
WITH RECOVERY
GO           

還原完整備份、最新差異備份和兩個事務日志備份

使用 NORECOVERY 還原前三個備份,然後使用 RECOVERY 進行最後還原。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH NORECOVERY
GO
RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.DIF'
WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN'
WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks2.TRN'
WITH RECOVERY
GO           

SQL Server Management Studio

要使用 WITH NORECOVERY 選項恢複資料庫備份,請轉到選項頁面并選擇下面突出顯示的項目。

SQLSERVER 恢複指令restore總結

2.2.3 STATS

RESTORE WITH STATS 選項允許您檢視還原過程的進度,這個選項也可用于 RESTORE DATABASE、RESTORE LOG、RESTORE VERIFYONLY。RESTORE WITH STATS 選項将讓您了解目前還原過程的進度。此資訊以完成百分比表示。預設是每 10% 後顯示,或者可以指定百分比值。

T-SQL

使用預設統計設定恢複完整資料庫 以下将顯示每個 10% 段後的完成百分比。

RESTORE DATABASE 'AdventureWorks' FROM DISK = 'C:\AdventureWorks.BAK'
GO           

恢複完整的資料庫,每完成 1% 就會顯示統計資訊 這将在每完成 1% 後顯示進度。

RESTORE DATABASE 'AdventureWorks' FROM DISK = 'C:\AdventureWorks.BAK' WITH STATS = 1
GO           

SQL Server Management Studio

使用 SSMS 還原資料庫時,此資訊将顯示在下面突出顯示的部分中。預設值為 10%, GUI 中不能更改。

SQLSERVER 恢複指令restore總結

2.2.4 REPLACE

RESTORE ... WITH REPLACE 選項允許您在進行還原時覆寫現有資料庫。在某些情況下,當您嘗試進行還原時,您可能會收到一條錯誤消息,提示“資料庫的日志尾部 .. 尚未備份”。

SQLSERVER 恢複指令restore總結

RESTORE ... WITH REPLACE 允許您在執行還原時覆寫現有資料庫,而無需先備份事務日志的尾部。WITH REPLACE 基本上告訴 SQL Server 丢棄事務日志中的所有活動内容并繼續進行還原。

T-SQL

使用 WITH REPLACE 恢複完整備份 下面的指令将恢複資料庫并忽略目前事務日志中的任何活動資料。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH REPLACE
GO           

SQL Server Management Studio

要使用 SSMS 進行還原,請執行以下操作,在還原的選項頁面上選擇“覆寫現有資料庫”。

SQLSERVER 恢複指令restore總結

2.2.5 MOVE

RESTORE ... WITH MOVE 選項允許您恢複資料庫,但也可以指定資料庫檔案(mdf 和 ldf)的新位置。如果您要從該資料庫的備份還原現有資料庫,則不需要這樣做,但如果您要從具有不同檔案位置的不同執行個體還原資料庫,則可能需要使用此選項。

RESTORE ... WITH MOVE 選項将讓您确定資料庫檔案的名稱以及建立這些檔案的位置。在使用此選項之前,您需要知道這些檔案的邏輯名稱以及 SQL Server 的位置。

如果已經存在另一個使用您嘗試還原的相同檔案名的資料庫并且該資料庫處于聯機狀态,則還原将失敗。但是如果資料庫由于某種原因不線上并且檔案沒有打開,如果你不使用 WITH MOVE 選項,恢複将覆寫這些檔案,是以要小心你不要意外覆寫好的資料庫檔案。

此外,當使用 WITH MOVE 選項時,您需要確定用于 SQL Server 引擎的帳戶有權在您指定的檔案夾中建立這些檔案。

T-SQL

1、确定備份的内容

您需要做的第一件事是确定檔案的邏輯名稱和實體位置。這可以通過使用RESTORE FILELISTONLY指令來完成。這将為您提供邏輯名稱和實體名稱。

例如:

RESTORE FILELISTONLY FROM DISK = 'C:\AdventureWorks.BAK'
GO           
ColumnName Value - Row 1 Value - Row2
LogicalName AdventureWorks_Data AdventureWorks_Log
PhysicalName C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Log.ldf
Type D L

2、使用 MOVE 恢複完整備份

假設我們要恢複這個資料庫,但我們希望将資料檔案放在“G:\SQLData”檔案夾中,将事務日志檔案放在“H:\SQLLog”檔案夾中。該指令如下所示:

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH MOVE 'AdventureWorks_Data' TO 'G:\SQLData\AdventureWorks_Data.mdf',
MOVE 'AdventureWorks_Log' TO 'H:\SQLLog\AdventureWorks_Log.ldf'
GO           

還原完整和事務日志備份 WITH MOVE 隻需為第一次還原指定 WITH MOVE,因為此後資料庫将處于“還原”狀态。第二次還原隻會将内容寫入正在使用的這個新位置。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH MOVE 'AdventureWorks_Data' TO 'G:\SQLData\AdventureWorks_Data.mdf',
MOVE 'AdventureWorks_Log' TO 'H:\SQLLog\AdventureWorks_Log.ldf',
NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN'
GO           

SQL Server Management Studio

要使用 SSMS 進行還原,請執行以下操作,在還原的選項頁面上,更改每個檔案的“還原為:”值,如下所示。下面将還原到根檔案夾,但您可以根據需要将它們更改為 G:\SQLData\ 和 H:\SQLLog\。

SQLSERVER 恢複指令restore總結

2.2.6 STOPAT

RESTORE ... WITH STOPAT 選項允許您将資料庫恢複到某個時間點。為了使此選項起作用,資料庫需要處于 FULL 或 Bulk-Logged 恢複模式,并且您需要進行事務日志備份。

當資料寫入資料庫時,它首先寫入事務日志,然後在事務完成後寫入資料檔案。還原事務日志時,SQL Server 将重播事務日志中的所有事務,并在将資料庫置于可用狀态之前前滾或復原它需要的事務。

這些事務每一個都有一個 LSN(邏輯序列号)和一個時間戳,是以在還原事務日志時,您可以告訴 SQL Server 在哪裡停止讀取需要還原的事務。

需要注意的一點是,如果您的資料庫使用 Bulk-Logged 恢複模型,并且事務日志中存在最小記錄操作(例如批量插入),則您無法使用該事務日志進行時間點恢複。

T-SQL

使用 STOPAT 還原資料庫 這會将 AdventureWorks 資料庫還原到等于“2022 年 10 月 23 日下午 5:31”的時間點。

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK' 
WITH NORECOVERY
GO 
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN' 
WITH RECOVERY, 
STOPAT = 'Oct 23, 2022 05:31:00 PM' 
GO           

使用 STOPAT 恢複資料庫,其中恢複模式為 Bulk-Logged 并且存在最低限度記錄的操作

在此示例中,我們有一個完整備份并且事務日志具有最低限度記錄的操作。我們可以嘗試使用以下指令進行時間點恢複:

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK' 
WITH NORECOVERY
GO 
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks.TRN' 
WITH RECOVERY, 
STOPAT = 'Oct 23, 2022 05:31:00 PM' 
GO           

但是如果有批量操作我們會得到這個錯誤。

SQLSERVER 恢複指令restore總結

恢複操作将完成,但它會恢複整個事務日志備份并使資料庫處于“正在恢複”狀态。然後,您可以恢複其他事務日志或使用RESTORE .. WITH RECOVERY選項使資料庫重新聯機。

2.2.7 獨占資料庫通路權限

還原資料庫時,您需要做的一件事是確定您擁有對資料庫的獨占通路權限。如果資料庫中有任何其他使用者,則還原将失敗。

SQLSERVER 恢複指令restore總結

獲得獨家通路權

要獲得獨占通路權限,需要删除所有其他連接配接或更改它們所在的資料庫,以便它們不使用您嘗試恢複的資料庫。您可以使用sp_who2或SSMS檢視哪些連接配接正在使用您嘗試恢複的資料庫。

使用 KILL 獲得獨占通路權的一個選項是使用 KILL 指令來終止正在使用資料庫的每個連接配接。但要注意您要終止的連接配接以及可能需要發生的復原問題。

使用 ALTER DATABASE 另一種選擇是将資料庫置于單使用者模式,然後進行恢複。這也會根據您使用的選項進行復原,但會一次完成所有連接配接。

ALTER DATABASE AdventureWorks SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK' 
GO           

三、小結

本文詳解了SQLSERVER資料庫恢複指令restore的使用方法和常見選項,結合具體的例子,簡單明了,對于資料庫恢複原理和實戰有一個令人深刻的認識。

繼續閱讀