文件組備份需要初始完整備份嗎?
我假設如果我要進行 FILEGROUP 備份並希望得到確認,則需要初始 FULL BACKUP。許多範例在一開始就顯示了一個,但不要注意它是明確要求的。
我有一個 TB 大小的數據庫,包含 12 個文件組,其中 4 個處於活動狀態並包含 50% 的整體數據。
如果我可以在初始備份中備份 12 個只讀集中的 8 個(加上 PRIMARY),然後單獨保留其他 4 個,那麼恢復速度會比恢復所有 12 個,然後需要恢復更新版本的4 個活動文件組。這是可能的,還是我正在查看整個數據庫的完整備份,然後為活動數據庫單獨備份 FILEGROUP 備份?
我認為您正在尋找的是PARTIAL備份,它備份讀/寫文件組(包括 PRIMARY)和任何指定的只讀文件組。根據您的要求,您可以執行 4 個讀/寫文件組加上 PRIMARY 的部分備份和8 個只讀文件組的文件備份。
您的文件備份不需要再次執行,除非 A)您將它們更改為讀/寫,或 B)您的文件備份損壞。除此之外,文件備份可用於根據需要進行任何恢復。
PRIMARY 和讀寫文件組的 PARTIAL 備份可以用作 PARTIAL 恢復的源或 DIFFERENTIAL PARTIAL 備份的差異基礎。
注意:PRIMARY 文件組包含系統表和數據庫元數據,包括有關其他數據庫文件/文件組狀態的元數據,因此您應該始終將其包含在正常備份過程中,它不能備份一次並保留以供將來參考,例如只讀文件組。如果您正確設計了數據庫,那麼理想情況下,PRIMARY 文件組中幾乎沒有使用者數據,因此將其包含在 PARTIAL 備份中不會對性能或空間消耗產生太大影響。
編輯:
根據彼得的評論,我想引用文件中的一句話:
當您想要排除只讀文件組時,部分備份很有用。部分備份類似於完整的數據庫備份,但部分備份不包含所有文件組。相反,對於讀寫數據庫,部分備份包含主文件組、每個讀寫文件組以及一個或多個只讀文件(可選)中的數據。只讀數據庫的部分備份僅包含主文件組。
因此,使用 PARTIAL 備份,您將無一例外地備份所有讀/寫文件組,包括 PRIMARY。也可以包括只讀文件或文件組,但所有讀/寫都自動包含在部分備份中。
我假設如果我要進行 FILEGROUP 備份並希望得到確認,則需要初始 FULL BACKUP。
回答
不,不需要初始 FULL BACKUP即可進行 FILEGROUP 備份。
在完整恢復模式下,一整套完整的文件備份,加上足夠多的日誌備份以跨越所有文件備份,就相當於完整的數據庫備份。
僅使用文件和日誌備份來恢復數據庫可能很複雜。因此,如果可能,最好在第一次文件備份之前執行完整的數據庫備份並啟動日誌備份。
試驗
下面是一個 FILEGROUP 備份和 LOG 備份(沒有 FULL 備份)足以恢復數據庫文件的場景範例:
CREATE DATABASE MyDB ON PRIMARY ( NAME = N'MyDB', FILENAME = N'D:\MyDB.mdf'), FILEGROUP [FILEGROUP_1] ( NAME = N'File_1', FILENAME = N'D:\File_1.ndf') LOG ON ( NAME = N'MyDB_log', FILENAME = N'D:\MyDB_log.ldf'); ALTER DATABASE [MyDB] SET RECOVERY FULL;
現在我們有了一個數據庫,讓我們開始更改。
USE MyDB; CREATE TABLE table_File_1(numbers int NOT NULL) ON FILEGROUP_1; INSERT INTO table_File_1(numbers) VALUES (1), (2), (3); BACKUP DATABASE MyDB FILEGROUP = 'FILEGROUP_1' TO DISK = 'D:\backups\MyDB_FILEGROUP_1.bck'; BACKUP LOG MyDB TO DISK = 'D:\backups\MyDB_LOG_1.trn'; DROP TABLE table_File_1; USE master; RESTORE DATABASE MyDB FILEGROUP = 'FILEGROUP_1' FROM DISK = 'D:\backups\MyDB_FILEGROUP_1.bck' WITH RECOVERY; RESTORE LOG MyDB FROM DISK = 'D:\backups\MyDB_LOG_1.trn' WITH RECOVERY;
請注意,此時 SQL Server 的還原尚未完成,要求事務日誌足以將 LSN 帶到數據庫所在的位置(在此模擬中,只有一個文件正在還原,而數據庫仍處於聯機狀態,並且其他文件正在修改),恢復此備份後,您會收到以下消息:
如果您查詢
sys.master_files
,您將看到File_1尚未線上。SELECT file_id, name, state_desc FROM sys.master_files WHERE database_id = DB_ID('MyDB');
這是該查詢的結果:
這意味著必須恢復更多的日誌備份才能使該文件以一致的狀態聯機。在這種情況下,我們可以進行新的日誌備份,並在備份後立即恢復。
BACKUP LOG MyDB TO DISK = 'D:\backups\MyDB_LOG_2.trn'; RESTORE LOG MyDB FROM DISK = 'D:\backups\MyDB_LOG_2.trn' WITH RECOVERY;
現在你完成了。恢復後
MyDB_LOG_2.trn
,您會收到以下消息:並查詢
sys.master_files
可以看到 File_1 現在線上評論
- 正如文件所述和範例所示,可以有一個帶有
FILEGROUP
和LOG BACKUPS
不帶有FULL BACKUP
;的備份策略。- 請注意,恢復這些備份並沒有恢復刪除的表,原因是我們的備份計劃不足以恢復 所有文件,以至於我可以在表仍然存在時停止恢復(所以要小心計劃備份策略時)。