2025年11月28日 星期五

資料庫的piecemeal回復 - 2

 


作者:楊先民  
精誠資訊/恆逸教育訓練中心資深講師


※網路引用請註明完整出處


在上集《資料庫的piecemeal回復 - 1》中,我們提到了SQL Server的檔案型piecemeal回復功能,可以幫助各位知道目前回復資料庫的進度以方便了解還要多久資料庫才會回復完成,而本期將要介紹的是檔案群組型的piecemeal回復功能,使用部分備份以及還原的機制適用更大型的資料庫使用。

使用檔案群組類型的 piecemeal 回復資料庫

通常使用這一類型的資料庫回復是因為資料庫太過龐大無法使用一般的標準備份還原方式(或是稱為完整資料備份方式),必須要採用「部分」備份方能滿足我們的需求。

換句話說,當資料庫大到一定的程度時,您又分了很多檔案群組,如果還是完整備份資料的話,勢必會浪費很多的時間。

檔案群組的 piecemeal回復,最大的重點在於備份與還原都不一定要使用完整資料庫備份,可以採用部分備份的方式,這是其他方式的備份還原所沒有的。


環境準備

為了能夠方便做練習,我們需要先準備資料庫的建立,產生資料庫如下:

CREATE DATABASE [AdventureWorksTest] ON  PRIMARY
( NAME = N'AdventureWorksTest', FILENAME = N'C:\TSQLDB\AdventureWorksTest.mdf' , SIZE = 5072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [DYNAMIC_DATA]
( NAME = N'AW_DynamicData', FILENAME = N'C:\TSQLDB\AW_DynamicData.ndf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [STATIC_DATA]
( NAME = N'AW_StaticData', FILENAME = N'C:\TSQLDB\AW_StaticData.ndf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'AdventureWorksTest_log', FILENAME = N'C:\TSQLDB\AdventureWorksTest_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
 
GO

 

先建立一個資料庫 AdventureWorksTest,有三個檔案群組,分別是 PrimaryDyncmic_Dada以及 Static_Data三個,並且之後會將 Static_Data檔案群組設定成唯讀。

接下來,建立兩個資料表:

CREATE TABLE [dbo].[State](
[State] [nchar](2) NOT NULL,
CONSTRAINT [PK_State] PRIMARY KEY CLUSTERED
(       
[State] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [STATIC_DATA]
) ON [STATIC_DATA]
END
 
GO
 
INSERT [dbo].[State] ([State]) VALUES (N'IL')
INSERT [dbo].[State] ([State]) VALUES (N'WA')
GO
CREATE TABLE [dbo].[Customer](
         [CustomerID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
         [FirstName] [nvarchar](50) NULL,
         [LastName] [nvarchar](50) NULL,
         [City] [nvarchar](50) NULL,
         [State] [nchar](2) NULL,
 
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED
(


         [CustomerID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [DYNAMIC_DATA]
) ON [DYNAMIC_DATA]
END
GO
INSERT [dbo].[Customer] ([CustomerID], [FirstName], [LastName], [City], [State]) VALUES (N'92560639-5eb2-4719-9d33-0428f496d2fc', N'Billy D.', N'Williams', N'Chicago', N'IL')
INSERT [dbo].[Customer] ([CustomerID], [FirstName], [LastName], [City], [State]) VALUES (N'cef4f5e8-9a7a-4f15-b382-29002fc302ed', N'Bill', N'Gates', N'Seattle', N'WA')
 


這兩個資料表,一個是屬於 Dynamic_Data檔案群組,另一個則是 Static_Data檔案群組,之後不要忘記要把 Static_Data這個檔案群組設定成唯讀。

開始進行備份,首先,先做 read_write_filegroups檔案群組的備份,如下:

backup database AdventureworksTest read_write_filegroups to disk ='c:\AWBackups\AdventureWorksTest_Dynamic_Data.bak'
 


我們並沒有進行完整資料庫備份而是做所謂的「部分」備份,read_write_filegroups就是只備份讀寫的檔案群組,所以非常特殊,所以我們故意把 Static_Data這個檔案群組設定成唯讀就是這個意思,在此我們只備份了 Primary以及 Dynamic_Data這兩個檔案群組。

backup database AdventureworksTest filegroup='static_data' to disk ='c:\AWBackups\AdventureWorksTest_Static_Data.bak'

 

接下來,只備份 static_data檔案群組,所以這兩次備份可能是分開做的,這樣就不需要使用完整資料庫備份。

接下來,我們要把 SQL Server的服務停止,並且破壞 ndf的檔案,在此注意不能破壞 mdf的檔案,因為如果本次的設定破壞的 primary的檔案群組,就無法使用 piecemeal回復了,所以務必只能破壞非 primary的檔案群組(以本例而言是 ndf檔)。


重新啟動 SQL Server服務後,您會發現資料庫是無法使用的,這時您必須先進行 tail-log的備份:

backup log AdventureWorksTest to disk ='c:\AWBackups\AdventureWorksTest_Active_Log.bak' with no_truncate,norecovery

 

這個 tail-log檔案可以給多次檔案群組的 piecemeal回復使用,而不是像上一期檔案類型的piecemeal回復一樣,每次都要再備份一次 tail-log才行(這也是我懷疑為何檔案型的 piecemeal要重複備份 tail-log,實在讓人不解)。


接下來,重點的部分來了,如果要使用檔案群組的 piecemeal restore,備份完 tail-log之後,第一次回復檔案群組時需要加關鍵字 partial,如下:

restore database AdventureWorksTest filegroup='dynamic_data' from disk ='c:\AWBackups\AdventureWorksTest_Dynamic_Data.bak' with partial,norecovery
 


這時也宣告 piecemeal restore的開始,然後把 tail-log 回復,如下:

restore log AdventureWorksTest from disk ='c:\AWBackups\AdventureWorksTest_Active_log.bak' with recovery

 

這時您的資料庫就可以看了,但是壞掉的檔案群組依舊無法使用,不過就和前期所提到的檔案 piecemeal回復一樣,您可以一個個把檔案群組回復回來,這樣資料就一個個可以看見了。


不過,因為我們設定的 static_data這個檔案群組是唯讀的,所以我們只需要回復檔案群組即可,不需要再把 tail-log附加回去:

restore database AdventureWorksTest filegroup='STATIC_DATA' from disk='c:\AWBackups\AdventureWorksTest_Static_Data.bak' with recovery

 

整個大功告成,所以順序就是:

1.     Tail-log備份

2.     回復 A檔案群組(使用 with partial關鍵字)

3.     回復 1 tail-log

4.     回復 B檔案群組

5.     回復 1 tail-log

 

就這樣無限循環下去~~~

這就是檔案群組的 piecemeal的資料庫回復。


0 意見:

張貼留言