Sql-Server

恢復沒有 FORMAT 但使用 INIT 的加密數據庫的 copy_only 備份失敗

  • March 12, 2021

我的任務是定期複製數據庫,每天兩次,我不應該破壞任何備份鏈,也不應該積累這些臨時備份。因此,我嘗試進行copy_only備份init以覆蓋單個備份文件。

我的數據庫使用 TDE 加密

backup compression在伺服器級別使用,“備份壓縮預設值”在我的 sys.configurations 中為 1。我沒有with compression在我的命令中使用顯式選項。

這是我完整的@@version:

Microsoft SQL Server 2019 (RTM-CU8) (KB4577194) - 15.0.4073.23 (X64) Sep 23 2020 16:03:08 版權所有 (C) 2019 Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows Server 2016 Datacenter 10.0 (Build 14393) :)(管理程序)

我的問題是下面的這個錯誤:

消息 3241,級別 16,狀態 40,第 8 行設備“W:\SQL_backup\copy_only\billing_prod2_test.bak”上的媒體系列格式不正確。SQL Server 無法處理此媒體系列。消息 3013,級別 16,狀態 1,第 8 行 RESTORE DATABASE 異常終止。

這是我執行的完整程式碼:

backup database billing_prod2
to disk = 'W:\SQL_backup\copy_only\billing_prod2_test.bak'
with init, copy_only--, format;
go

restore database billing_1
from disk = 'W:\SQL_backup\copy_only\billing_prod2_test.bak'
with move 'billing_prod2' to 'E:\SQL_data\billing_1.mdf',
move 'billing_prod2_log' to 'E:\SQL_data\billing_1_log.ldf',
replace

第一次執行時沒有錯誤,完整備份的大小約為35Mb,並且可以完美恢復。

第二次備份執行沒有錯誤,但奇怪的是大小為 260Mb。這是我在磁碟上看到的大小,並且在輸出中寫入了相同的大小,restore headeronly它仍然可以毫無錯誤地執行。但是當我這樣做時restore database,就會出現上面提到的錯誤。

我嘗試使用另一個數據庫和另一個磁碟執行相同的程式碼來保存備份,但結果始終相同:第一次工作,第二次文件被覆蓋但大小不同,不僅僅是雙倍大小,它幾乎是初始大小的 10 倍。restore headeronly永遠不會失敗,並且總是只報告備份文件中的一個文件,但大小是多倍的並且restore database失敗了。

無格式

只有當我添加format選項時,備份的大小才變得正常並且恢復成功。

有格式

我的問題是:在這種情況下,為什麼我應該在備份中使用格式才能恢復?

這確實是 SQL Server 中的一個錯誤。我們(@sepupic 和我)進行了一些離線討論並設法縮小了範圍:錯誤發生在以下情況:

  • 您使用 TDE
  • 備份被壓縮
  • 您指定 COPY_ONLY
  • 您指定 INIT
  • 備份文件存在

揚聲器:

--The database has TDE
--Backupfile doesn't exist at this stage

BACKUP DATABASE db1Encrypted
TO DISK = 'R:\db1Encrypted.bak'
WITH INIT, COPY_ONLY, COMPRESSION, CHECKSUM

--backup file 660 kb

RESTORE VERIFYONLY FROM DISK = 'R:\db1Encrypted.bak' WITH CHECKSUM
--OK


--Backupfile now exists, below causes unreadable backup

BACKUP DATABASE db1Encrypted
TO DISK = 'R:\db1Encrypted.bak'
WITH INIT, COPY_ONLY, COMPRESSION, CHECKSUM

--backup file 3890 kb

RESTORE VERIFYONLY FROM DISK = 'R:\db1Encrypted.bak' WITH CHECKSUM
--Fails "The media family on device 'R:\db1Encrypted.bak' is incorrectly formed"

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