一. 概述 文件備份是指備份一個或多個文件或文件組中的所有數據。使用文件備份能夠只還原損壞的文件,而不用還原資料庫的其餘部份,從而加快恢復速度。例如,如果資料庫由位於不同磁碟上的若幹文件組成,在其中一個磁碟發生故障時,只需還原這個故障磁碟上的文件,其它磁碟文件無須還原,這樣縮短還原時間。 在完整恢復 ...
一. 概述
文件備份是指備份一個或多個文件或文件組中的所有數據。使用文件備份能夠只還原損壞的文件,而不用還原資料庫的其餘部份,從而加快恢復速度。例如,如果資料庫由位於不同磁碟上的若幹文件組成,在其中一個磁碟發生故障時,只需還原這個故障磁碟上的文件,其它磁碟文件無須還原,這樣縮短還原時間。
在完整恢復模式下,一整套完整文件備份和涵蓋所有文件備份的日誌備份合起來,等同於一個完整資料庫備份。
1.1 文件備份具有如下優點:
(1)可以迅速還原損壞的文件。
(2)當超大型資料庫在完整備份下變得難以管理時,文件備份增加了計劃和媒體處理的靈活性。
1.2 文件備份具有不足:
(1) 與完整資料庫備份相比,文件備份的主要缺點是管理較為複雜。如果某個損壞的文件未備份,那麼媒體故障可能會導致無法恢復整個資料庫。因此必須維護一組完整的文件備份,還必須維護一個或多個日誌備份。
(2) 維護和跟蹤這些完整備份是一種耗時的任務,所需空間會超過完整資料庫備份所需的空間。
二. 文件備份策略
使用文件備份和日誌備份還原資料庫的操作可能比較複雜,因此最好先執行完整資料庫備份,併在第一個文件備份開始之前,進行日誌備份。下圖在t0創建資料庫後,立即執行完整資料庫備份t1,創建第一個完整資料庫備份後,便可以開始執行事務日誌備份。事務日誌備份按計劃的間隔時間執行,文件備份以最適合資料庫業務要求的間隔執行,下麵是先備份主文件組A,再是輔助文件組B。在完整恢復模式下,恢復一個文件組備份,不但需要恢覆文件組備份本身,還需要依次恢復從上一次完整資料庫備份後到恢復的目標時間點為止的所有日誌備份。如果日誌備份數量多,可以考慮再給合差異文件備份,但這樣備份計劃更加難於管理。
三.文件還原
當一個大資料庫有若幹個文件和文件組,如果損壞只是集中在其中一個文件或文件組上,sqlserver只要把壞掉的那個數據文件組重建,肯定可以節約時間。但是資料庫的事務修改是會分佈在各個數據文件上的,如果用備份只恢復其中一個文件,而其它文件不恢復,那麼它們的狀態一定會不一致,這樣資料庫是無法使用的,為了使新恢復的文件能夠自動恢復備份以後做的修改,就需要藉助事務日誌。使用文件備份還原一個或多個受損文件的步驟如下:
(1) 創建活動事務日誌的尾日誌備份。 對於離線文件還原,在文件還原之前必須始終先進行一次尾日誌備份。對於線上文件還原,在文件還原之後必須始終先進行一次日誌備份。因為日誌文件一日損壞,文件還原則無法進行。
(2) 從每個損壞的文件的最新文件備份還原相應文件。
(3) 針對每個還原的文件,還原最近的差異文件備份(如果有,因為這樣還原快)
(4) 按順序還原事務日誌備份,從時間上最早備份的日誌文件開始,到步驟1的尾日誌結束。
四 . 數據初始化
--第一步: 創建資料庫 CREATE DATABASE [FileGroupTest] go USE [FileGroupTest] --第二步:創建文件組 ALTER DATABASE [FileGroupTest] ADD FILEGROUP [FG_Test_Id_01] ALTER DATABASE [FileGroupTest] ADD FILEGROUP [FG_Test_Id_02] --第三步:創建文件添加到文件組 ALTER DATABASE [FileGroupTest] ADD FILE (NAME = N'FG_TestUnique_Id_01_data',FILENAME = N'D:\Data\FG_TestUnique_Id_01_data.ndf',SIZE = 1MB, FILEGROWTH = 1MB ) TO FILEGROUP [FG_Test_Id_01] ALTER DATABASE [FileGroupTest] ADD FILE (NAME = N'FG_TestUnique_Id_02_data',FILENAME = N'D:\Data\FG_TestUnique_Id_02_data.ndf',SIZE = 1MB, FILEGROWTH = 1MB ) TO FILEGROUP [FG_Test_Id_02] --第四步創建表存放在不同文件上 CREATE TABLE Student(ID INT,Name varchar(50),[Address] varchar(100)) ON [FG_Test_Id_01] CREATE TABLE Teacher(ID INT,Name varchar(50),[Address] varchar(100)) ON [FG_Test_Id_02]
CREATE TABLE School(ID INT,Name varchar(50),[Address] varchar(100)) ON [PRIMARY]
-- 養成好習慣先進行完整備份 backup database [FileGroupTest] to BackupTestDevice
五. 備份演示
-- 給二個表插入數據 insert into Student values(1,'張三','廣東深圳') insert into Teacher values(1,'李四','廣東佛山') -- 日誌備份 backup log [FileGroupTest] to BackupTestDevice -- 給二個表插入數據 insert into Student values(2,'張三2','廣東深圳') insert into Teacher values(2,'李四2','廣東佛山') -- 日誌備份 backup log [FileGroupTest] to BackupTestDevice -- 文件組FG_Test_Id_01備份 backup database [FileGroupTest] file='FG_TestUnique_Id_01_data' to BackupTestDevice -- 給二個表插入數據 insert into Student values(3,'張三3','廣東深圳') insert into Teacher values(3,'李四3','廣東佛山') -- 日誌備份 backup log [FileGroupTest] to BackupTestDevice -- 給二個表插入數據 insert into Student values(4,'張三4','廣東深圳') insert into Teacher values(4,'李四4','廣東佛山') -- 日誌備份 backup log [FileGroupTest] to BackupTestDevice -- 文件組FG_Test_Id_02備份 backup database [FileGroupTest] file='FG_TestUnique_Id_02_data' to BackupTestDevice
-- 給主文件組表插入數據 insert into School values(1,'深圳大學','廣東深圳南山') -- 主文件組備份 backup database [FileGroupTest] file='FileGroupTest' to BackupTestDevice
查看備份集如下圖所示:type=F 代表文件組備份類型
六. 還原演示
--步驟1:假設文件FG_TestUnique_Id_01_data已損壞,資料庫處於線上狀態來還原該文件 restore database [FileGroupTest] file='FG_TestUnique_Id_01_data' from BackupTestDevice with file=33, norecovery
--此時FileGroupTest庫還能用,但FG_Test_Id_01文件組上的Student表現不能用,此時處於離線狀態 select * from FileGroupTest.dbo.Student
--這兩個表在不同文件組上,可以使用 select * from FileGroupTest.dbo.School select * from FileGroupTest.dbo.Teacher
BACKUP LOG 與 COPY_ONLY 選項將創建僅複製日誌備份,該備份不會截斷事務日誌。 僅複製日誌備份對日誌鏈沒有任何影響,因此其他日誌備份的表現就像僅複製備份不存在一樣。
--步驟2:進行新的日誌備份,以確保捕獲到該文件離線時的點 backup log [FileGroupTest] to BackupTestDevice with copy_only
--步驟3: 線上還原日誌備份 restore log [FileGroupTest] from BackupTestDevice with file=34,norecovery restore log [FileGroupTest] from BackupTestDevice with file=35,norecovery restore log [FileGroupTest] from BackupTestDevice with file=38,recovery
--離線的文件組FG_Test_Id_01處於線上狀態,Student表可以使用,資料庫恢復完成 select * from FileGroupTest.dbo.Student