還原資料庫的前置作業

還原資料庫的前置作業

當我們使用下列TSQL敘述進行資料庫的完整備份時,假設在資料量不繼續增加的前提下,每執行一次備份檔幾乎是以第一次備份的大小不斷成長(如下圖)。


BACKUP DATABASE Northwind TO DISK = 'e:\bak\NW.bak'

image

原因在於不使用任何媒體集選項進行資料庫備份,會將備份檔附加至現有的備份組,也就是隱含的使用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】,程式碼如下:
image

   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'
    

image

其中最常用到的就是螢光筆所標示的欄位(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 = 2
   5:  ,NORECOVERY
   6:  ,REPLACE

 

【參考資料】