Sql-Server

文件組備份需要初始完整備份嗎?

  • November 27, 2019

我假設如果我要進行 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 現在線上

查詢結果2

評論

  • 正如文件所述和範例所示,可以有一個帶有FILEGROUPLOG BACKUPS不帶有FULL BACKUP;的備份策略。
  • 請注意,恢復這些備份並沒有恢復刪除的表,原因是我們的備份計劃不足以恢復 所有文件,以至於我可以在表仍然存在時停止恢復(所以要小心計劃備份策略時)。

引用自:https://dba.stackexchange.com/questions/254208