DIFF được thăng cấp lên FULL
Chúng tôi sử dụng DatabaseBackupquy trình được lưu trữ của Ola Hallengren để sao lưu một lượng cơ sở dữ liệu SharePoint trên phiên bản SQL Server 2012 vào bộ lưu trữ Azure blob. Chúng tôi đã làm điều này trong một thời gian khá lâu mà không có bất kỳ vấn đề nào. Tuy nhiên, trong 6 tuần qua, chúng tôi DIFFsngẫu nhiên được thăng chức FULLvà chúng tôi không thể tìm ra lý do.
Đây là đầu ra từ bước đại lý
BACKUP DATABASE [Database] TO URL = N'https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak' WITH NO_CHECKSUM, COMPRESSION, CREDENTIAL = N'*storeageaccountname*'
Nếu bạn xem URL được định vị, bạn sẽ lưu ý rằng các thủ tục đang lưu trữ trong thư mục DIFF, nhưng tạo một tệp sao lưu ĐẦY ĐỦ.
https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak
--^ --^
DatabaseBackup (Ola proc) có từ 2019-06-14 vì vậy nó cần được nâng cấp để công bằng, nhưng nó đã hoạt động tốt trong hơn 18 tháng.
Chúng tôi không gọi mã Ola trực tiếp vì chúng tôi có một thủ tục trình bao bọc nhỏ tạo nên tên đường dẫn ảo cho Azure, nhưng về cơ bản đây là cách chúng tôi gọi mã của Ola.
Đây là một vấn đề vì một số lý do không xác định mà sao lưu DIFF đang được nâng cấp lên FULL, điều này gây ra petabyte bản sao lưu Azure blob thay vì gigabyte - mỗi ngày.
EXECUTE dbo.DatabaseBackup
@Database = @DatabaseName,
@URL = @BackupPath,
@Credential = @StorageAccount,
@BackupType = @backupType,
@Compress = @Compression,
@LogToTable = 'Y',
@ChangeBackupType = 'Y',
@Updateability = @DatabaseReadOnlyState,
@DirectoryStructure = NULL,
@AvailabilityGroupDirectoryStructure = NULL
Bạn có bất cứ suy nghĩ về điều đó?
Trả lời
Bạn nói rằng quảng cáo sao lưu DIFF thành ĐẦY ĐỦ này là "ngẫu nhiên" nhưng tôi cá rằng bạn có thể tìm thấy mối liên hệ giữa hoạt động này và dữ liệu churn (hoặc duy trì chỉ mục) trong chính cơ sở dữ liệu.
Bởi vì bạn đang sử dụng ChangeBackupType='Y', công việc sao lưu đang xem xét sys.dm_db_file_space_usage để xem cơ sở dữ liệu đã bị thay đổi bao nhiêu phần trăm và thực hiện sao lưu ĐẦY ĐỦ nếu nó vượt quá ngưỡng (Tôi gặp khó khăn khi xác định ngưỡng mặc định từ mã nguồn ). Bạn có thể thay đổi ngưỡng đó bằng cách điều chỉnh ModificationLevelthông số, là phần trăm. Từ tài liệu
ModificationLevel
Chỉ định tỷ lệ phần trăm khi một bản sao lưu khác biệt sẽ được thay đổi thành một bản sao lưu đầy đủ. Tùy chọn này chỉ có thể được sử dụng cùng với @ChangeBackupType = 'Y'. DatabaseBackup kiểm tra số tiền được cấp phát_extent_trang_cấp và số tiền được sửa đổi trong sys.dm_db_file_space_usage để tính toán lượng cơ sở dữ liệu đã được sửa đổi.
Giới thiệu
Nhìn vào mã của bạn, có vẻ như bạn đang sử dụng @ChangeBackupTypetham số mà Ola cung cấp trong Giải pháp bảo trì máy chủ SQL của anh ấy cho thủ tục lưu trữ DatabaseBackup . Tài liệu của tham số này cung cấp một số thông tin sau:
DatabaseBackup kiểm tra
differential_base_lsntrongsys.master_filesđể xác định xem một bản sao lưu khác biệt có thể được thực hiện. Nếu không thể sao lưu khác biệt, thì cơ sở dữ liệu bị bỏ qua theo mặc định. Ngoài ra, bạn có thể đặt ChangeBackupType thành Y để thực hiện sao lưu đầy đủ.
có liên quan ... và ...
DatabaseBackup kiểm tra
last_log_backup_lsntrongsys.database_recovery_statusđể xác định xem một bản sao lưu nhật ký giao dịch trong mô hình hồi phục hoàn toàn hoặc phần lớn-đăng nhập có thể được thực hiện. Nếu không thể sao lưu nhật ký giao dịch, thì cơ sở dữ liệu bị bỏ qua theo mặc định. Ngoài ra, bạn có thể đặt ChangeBackupType thành Y để thực hiện sao lưu khác biệt hoặc toàn bộ.
không liên quan
Tham khảo: DatabaseBackup (ola.hallengren.com)
Giả thiết
Khi bạn đang sử dụng tham số được đề cập và giả sử rằng cơ sở dữ liệu của bạn đều đang chạy trong mô hình khôi phục ĐẦY ĐỦ, thì tôi hy vọng các tập lệnh của Ola sẽ làm như chúng đã được nói và chỉ thực hiện sao lưu khác biệt, giống như bạn đã quan sát trước đây ... ..
Tuy nhiên
... một cái gì đó đang thay đổi cơ sở dữ liệu SharePoint theo cách như vậy, thủ tục của Ola đang giả định rằng cơ sở dữ liệu yêu cầu sao lưu ĐẦY ĐỦ. Ola kiểm tra các tình huống khác nhau, một trong số đó dựa trên tham số ....
ModificationLevel
Có tham số bổ sung @ModificationLevelsẽ chuyển đổi bản sao lưu DIFF thành bản sao lưu ĐẦY ĐỦ nếu tham số đầu tiên @ChangeBackupType = 'Y'được đặt. Nhìn vào mã của Ola cung cấp cho chúng tôi điều này:
IF @ModificationLevel IS NOT NULL AND @BackupType <> 'DIFF'
BEGIN
INSERT INTO @Errors ([Message], Severity, [State])
SELECT 'The value for the parameter @ModificationLevel is not supported.', 16, 3
END
Điều đó có nghĩa là nếu tham số @ModifcationLevelđược đặt thành giá trị và @ChangeBackupTypeđược đặt thành Y, thì quy trình sao lưu sẽ chuyển đổi bản sao lưu DIFF thành bản sao lưu ĐẦY ĐỦ Nếu số lượng trang thay đổi sẽ gây ra trường hợp này .
Bởi vì bạn chưa thiết lập @ModificationLevelnó vẫn còn NULLnhư có thể thấy trong mã của Ola:
@ModificationLevel int = NULL,
Điều này dường như không đúng trong trường hợp của bạn, trừ khi tất nhiên giá trị của tham số của bạn cho @ModificationLevellà không NULL.
Giải pháp 1
Trong trường hợp đó, chúng tôi đã tìm ra thủ phạm. Thay đổi giá trị cho @ModificationLeveltrở lại NULLvà tất cả đều ổn.
Các lý do khác để chuyển đổi
Một lý do khác mà bản sao lưu sẽ thay đổi từ DIFFthành FULLlà @ChangeBackupTypechính tham số .
Mô tả (từ trên) được viết là:
DatabaseBackup (thủ tục) kiểm tra
differential_base_lsntạisys.master_filesđể xác định xem một bản sao lưu khác biệt có thể được thực hiện. Nếu không thể sao lưu khác biệt, thì cơ sở dữ liệu bị bỏ qua theo mặc định. Ngoài ra, bạn có thể đặt ChangeBackupType thành Y để thực hiện sao lưu đầy đủ.
Chekcing mã
Ola đã viết điều này trong mã:
SELECT @CurrentDifferentialBaseLSN = differential_base_lsn FROM sys.master_files WHERE database_id = DB_ID(@CurrentDatabaseName) AND [type] = 0 AND [file_id] = 1
và phần này ở đây:
IF @CurrentBackupType = 'DIFF' BEGIN SELECT @CurrentDifferentialBaseIsSnapshot = is_snapshot FROM msdb.dbo.backupset WHERE database_name = @CurrentDatabaseName AND [type] = 'D' AND checkpoint_lsn = @CurrentDifferentialBaseLSN END IF @ChangeBackupType = 'Y' BEGIN IF @CurrentBackupType = 'DIFF' AND @CurrentDifferentialBaseIsSnapshot = 1 BEGIN SET @CurrentBackupType = 'FULL' END END;
Điều đó có nghĩa là gì?
Dịch mã của Ola
Nó đọc một chút như thế này:
Nhận giá trị của
differntial_base_lsncơ sở dữ liệu hiện tạiNếu kiểu sao lưu là DIFF thì ...
- Đọc
is_snapshotcột trongmsdb.dbo.backupsetbảng cho cơ sở dữ liệu hiện tại có@CurrentDifferentialBaseLSNvà bản sao lưutypelàD(Sao lưu cơ sở dữ liệu) - Nếu
@ChanageBackupType isY` và@CurrentBackupTypelà `DIFF và@CurrentDifferentialBaseIsSnapshotLà1
- Sau đó
- Đặt
@CurrentBackupTypethànhFULL
- Đặt
- Đọc
Ở đây bạn có một tình huống có thể xảy ra ...
Giải pháp 2
... nếu cơ sở dữ liệu của bạn được sao lưu bởi giải pháp của bên thứ ba (CommVault, NetApp, v.v.), thì giải pháp của bên thứ 3 sẽ tạo một bản sao lưu cơ sở dữ liệu hợp lệ và nhất quán bằng cách sử dụng dịch vụ SQL Server VSS Writer, sẽ ghi chú trong msdb.dbo.backupsetđó rằng một bản sao chụp nhanh của cơ sở dữ liệu đã được lấy, điều này đặt is_snapshottham số cho cơ sở dữ liệu đó cho giá trị differntial_base_lsnmà DIFF của bạn sẽ dựa trên.
Bởi vì điều này sao lưu DIFF bạn đang cố gắng để thực hiện có thể không còn được dựa trên các is_snapshotsao lưu và phải tạo một bản sao lưu đầy mới một lần nữa, để thiết lập lại is_snapshotvà các differntial_base_lsngiá trị, và để tạo ra một cơ sở mới để sao lưu tương lai DIFF.
Tìm bản sao lưu khác
Bạn sẽ phải xác định xem bên thứ 3 nào (hoặc giải pháp dự phòng khácb) đang can thiệp vào giải pháp đã triển khai của bạn và đảm bảo rằng họ đang ...
- sửa đổi để cùng tồn tại
- tối thiểu hóa thành một giải pháp sao lưu.