[技術探討]進階備份之 Piecemeal Restore 隨筆

Piecemeal Restore

資料庫的備份(Backup)與還原(Restore)是所有資料庫管理者(DBA)必需要會的操作。還原又可分成基礎還原與進階還原。實務上由於進階還原的回復步驟較繁雜,一般資料庫管理者多使用完整資料還原(Full Recovery),也就是基礎還原;但若是在資料量極龐大的狀況下,當發生緊急狀況需作還原操作時,由於資料庫在作完整還原時必須獨佔整個資料庫的存取權,資料庫將完全無法動作,若還原時間過久必會延長使用者的不便時間。因此若能善加運用進階還原- Piecemeal Restore,相信必能將不便的時間降至最低。

在介紹Piecemeal Restore之前,要先簡單介紹一下資料庫與檔案、檔案群組的關係。每一個資料庫實際上都是由一個或多個檔案所構成。而SQL Serve中會有一個名為「Primary」的預設檔案群組,若沒有特別指定,所有的資料皆會儲存在Primary的檔案群組下。當資料庫龐大時,建議可利用檔案群組與檔案的配置,來調整儲存空間,提升效能。以簡訊系統為例,因近來銀行對內部行員在簡訊平台上的操作行為愈來愈重視,每次的新增、修改、匯入聯絡人…等都希望能留下詳盡的操作記錄,勢必需將大量的Web記錄寫入資料庫中,供日後操作行為有爭議時備查。如此一來寫入的資料量必然增大,但又不希望因此影響簡訊的發送效能,若將記錄操作行為的「WebLog資料表」與簡訊發送的「SEND資料表」配置為不同的檔案(.NDF)與檔案群組,再針對檔案群組或檔案(.NDF)做分散磁碟機的存放,必能改善資料庫的效能。

Piecemeal Restore

回歸正題,所謂Piecemeal Restore就是指可針對檔案或是檔案群組作「逐步」的還原。DBA可以只針對毀損的檔案作還原,改善在完整還原時資料庫無法操作及還原時間過久缺點;當毀損的檔案不止一個時,也可針對毀損檔案的重要性作處理順序的規劃。

 

由於從SQL Server 2012開始,檔案型的Piecemeal Restore在操作上與先前的SQL Server版本是有差異的,因此在下段會有操作步驟的說明。

 

為模擬.NDF毀損的情況,我們將建立一個測試資料庫-SMS_DB作還原示範。首先先建立四個檔案群組(包含 Primary),及四個檔案(NDF檔)。

Piecemeal Restore

建立資料表同時指定不同的檔案群組,完成後INSERT資料。

Piecemeal Restore

進行完整備份(Full Backup)還是不可避免的!但這裡要介紹備份至「備份裝置」的方式,而非傳統的備份至檔案。它的好處是每一次的備份都可以透過備份裝置頁面來查看備份的類型、時間、大小、順序…等記錄,非常方便管理。

Piecemeal Restore

前置作業準備完成。接下來就要開始故意搞破壞…故意將SMS_B與Customer_C的NDF副檔名改成 .BAD。此步驟之前要記得先將SQL Server服務作停止。

Piecemeal Restore

檔案破壞完後,就可以將SQL Server服務啟動。啟動後會發現資料庫-SMS_DB現在是Recovery Pending的狀態而完全無法使用。

Piecemeal Restore

        現在要開始準備作 Piecemeal Restore 囉!

步驟一:在進行Piecemeal Restore之前,我們須下語法將壞掉的檔案(NDF檔)先作Offline,完成後再將整個資料庫作Online。

Piecemeal RestorePiecemeal Restore

步驟二:完成後會發現SMS_DB「看起來」恢復正常了!但實際上,歸屬於其他NDF的資料表可正常開啟,但與毀損的NDF相關聯的資料表仍然是無法開起的狀態。

Piecemeal Restore

步驟三:Piecemeal Restore的重頭戲來了,這也是文章前段提到的…SQL Server 2012之後,在針對「檔案型」Piecemeal Restore的Tail-Log 備份上有作重大改變。按照慣例,在還原作業中僅需對「結尾記錄( Tail-log )」作一次備份即可,但在「檔案型」Piecemeal Restore中,幾個NDF毀損就要做幾次Tail-log Backup。

資料庫管理者可視重要性來決定還原的先後。以此案例來說,由於「SEND資料表」的重要性遠高於記錄操作行為的「WebLog資料表」,因此這裡決定先還原「SEND資料表」所屬的SMS_B檔案,故先備份SMS_B檔的Tail-Log。語法如下:

-- Backup LOG --> tail-log backup
BACKUP LOG [SMS_DB] 
TO  [Backup_SMS] 
WITH  NO_TRUNCATE ,
NAME = N'LOG_backupset_01'
GO

此時可至「備份裝置」檢查備份情形。

Piecemeal Restore

步驟四:接下來就可以開始還原「SMS_B檔案」囉!語法如下:

-- RESTORE DATABASE -- File
RESTORE DATABASE SMS_DB
	FILE = N'SMS_B'
FROM DISK = N'C:\Backup Device\Backup_SMS.BAK'
WITH RECOVERY

RESTORE LOG SMS_DB
FROM DISK = N'C:\Backup Device\Backup_SMS.BAK'
WITH FILE = 2,
	RECOVERY

還原完成後,來試著檢查資料表的復原情況…

Piecemeal Restore

步驟五:接下來就可以繼續還原「WebLog資料表」所屬的Customer_C檔案。這裡需要注意,須再做一次Tail-Log的備份。語法如下:

-- Backup LOG --> tail-log backup
BACKUP LOG [SMS_DB] 
TO  [Backup_SMS] 
WITH  NO_TRUNCATE ,
NAME = N'LOG_backupset_02'
GO

完成後一樣可至「備份裝置」檢查備份情形。

Piecemeal Restore

步驟六:接著就開始還原「Customer_C檔案」囉!語法如下:

-- RESTORE DATABASE -- File
RESTORE DATABASE SMS_DB
	FILE = N'Customer_C'
FROM [Backup_SMS]
WITH RECOVERY

RESTORE LOG SMS_DB
FROM [Backup_SMS]
WITH FILE = 3,       --此編號為備份裝置中的備份組位置
	RECOVERY

試著檢查資料表的復原情況…大功告成囉!

Piecemeal Restore

文章到這裡你一定會問,實務上要怎麼知道SQL Server開不起來的原因是什麼啊?不用擔心,SQL Server的Log會告訴你!在C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log路徑下有個ERRORLOG,可協助你試著找出SQL發生問題的原因。文中介紹的Piecemeal Restore復原方式並不適用於.mdf檔毀損的狀況,若是牽扯到.mdf的毀損,也只好乖乖使用完整還原(Full Recovery);但如果你發現無法使用DB的原因是因為檔案時…賓果!那就恭喜你,快快試著使用Piecemeal Restore來作還原吧!

Piecemeal Restore

 


發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料