還原資料庫的前置作業
當我們使用下列TSQL敘述進行資料庫的完整備份時,假設在資料量不繼續增加的前提下,每執行一次備份檔幾乎是以第一次備份的大小不斷成長(如下圖)。
BACKUP DATABASE Northwind TO DISK = 'e:\bak\NW.bak'
原因在於不使用任何媒體集選項進行資料庫備份,會將備份檔附加至現有的備份組,也就是隱含的使用WITH NOINIT,這會造成以TSQL還原資料庫時,總是只還原到第一個備份檔的內容。本文分享了四個方法來協助各位在還原資料庫前,可以透過下列方式來了解備份檔的各項資訊。
-
Restore VerifyOnly:用來驗證備份檔是否可讀取,並不真正進行還原作業,常用來對資料進行額外的檢查,以提升資料庫還原作業的成功率。程式碼範例如下:
RESTORE verifyonly FROM DISK = 'e:\bak\NW.bak'
-
Restore LabelOnly:用來取得備份媒體的各項資訊。程式碼範例如下:
RESTORE labelonly FROM DISK = 'e:\bak\NW.bak'
-
Restore FileListOnly:用來取得備份組中所包含的資料庫檔案,常用在還原資料庫時,重新指定資料庫檔案位置之用。程式碼範例如下:
RESTORE filelistonly FROM DISK = 'e:\bak\NW.bak'
下圖使用RESTORE filelistonly敘述來找出備份組,接著將邏輯名稱為Northwind的資料庫檔案及Northwind_log的交易紀錄檔由【C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\ DATA\northwnd.mdf】和【C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\northwnd.ldf】搬到【E:\bak】,程式碼如下:
1: RESTORE DATABASE NW FROM DISK='e:\bak\NW.bak'2: WITH MOVE 'Northwind' TO 'E:\bak\NW.mdf'3: ,MOVE 'Northwind_log' TO 'E:\bak\NW.ldf'4: ,NORECOVERY
5: ,REPLACE
- Restore HeaderOnly:用來取的備份組中所有備份標頭資訊,以本文一開始所述的情境,預設使用WITH NOINIT進行備份,將會看到如下圖的多筆標頭資訊。程式碼範例如下:
RESTORE headeronly FROM DISK = 'e:\bak\NW_DIF.bak'
其中最常用到的就是螢光筆所標示的欄位(Position),透過Restore headeronly找出備份組後,就可以搭配FILE來還原特定的備份集。
下列程式碼示範將資料庫還原回Position為2的備份集:
1: RESTORE DATABASE NW FROM DISK='e:\bak\NW.bak'2: WITH MOVE 'Northwind' TO 'E:\bak\NW.mdf'3: ,MOVE 'Northwind_log' TO 'E:\bak\NW.ldf'4: ,FILE = 25: ,NORECOVERY
6: ,REPLACE
【參考資料】