FULL로 승격 된 DIFF
Ola Hallengren의 DatabaseBackup저장 프로 시저를 사용 하여 SQL Server 2012 인스턴스의 SharePoint 데이터베이스 부하를 Azure Blob Storage로 백업합니다. 우리는 문제없이 꽤 오랫동안 이것을 해왔습니다. 그러나 지난 6 주 동안 우리 DIFFs는 무작위로 승진 FULL했고 그 이유를 알 수 없습니다.
에이전트 단계의 출력입니다.
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*'
생성 된 URL을 살펴보면 절차가 DIFF 디렉토리에 저장되지만 전체 백업 파일이 생성되고 있음을 알 수 있습니다.
https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak
--^ --^
DatabaseBackup (Ola proc)은 2019-06-14에 출시되었으므로 공정하게 업그레이드해야하지만 18 개월 이상 잘 작동했습니다.
Azure의 가상 경로 이름을 빌드하는 작은 래퍼 프로 시저가 있으므로 Ola 코드를 직접 호출하지 않지만 기본적으로 Ola 코드를 호출하는 방법입니다.
이것은 알 수없는 이유로 DIFF 백업이 FULL로 승격되는 문제로, 매일 기가 바이트 대신 페타 바이트의 Azure Blob 백업이 발생합니다.
EXECUTE dbo.DatabaseBackup
@Database = @DatabaseName,
@URL = @BackupPath,
@Credential = @StorageAccount,
@BackupType = @backupType,
@Compress = @Compression,
@LogToTable = 'Y',
@ChangeBackupType = 'Y',
@Updateability = @DatabaseReadOnlyState,
@DirectoryStructure = NULL,
@AvailabilityGroupDirectoryStructure = NULL
그것에 대해 어떤 생각이 있습니까?
답변
DIFF에서 FULL 백업으로의이 프로모션은 "무작위"라고 말씀 하셨지만 데이터베이스 자체에서이 활동과 데이터 변동 (또는 인덱스 유지 관리) 사이의 연관성을 찾을 수있을 것입니다.
을 사용하고 있기 때문에 ChangeBackupType='Y'백업 작업은 sys.dm_db_file_space_usage 에서 데이터베이스가 얼마나 변경되었는지 확인하고 임계 값을 초과하면 전체 백업을 수행합니다 (소스 코드에서 기본 임계 값을 식별하는 데 어려움이 있습니다. ). ModificationLevel백분율 인 매개 변수 를 조정하여 해당 임계 값을 변경할 수 있습니다 . 에서 문서
ModificationLevel
차등 백업이 전체 백업으로 변경되는 비율을 지정합니다. 이 옵션은 @ChangeBackupType = 'Y'와 함께 만 사용할 수 있습니다. DatabaseBackup은 sys.dm_db_file_space_usage에서 assigned_extent_page_count 및 modified_extent_page_count를 확인하여 수정 된 데이터베이스의 양을 계산합니다.
소개
코드를 살펴보면 DatabaseBackup 저장 프로 시저에 대해 SQL Server 유지 관리 솔루션 에 @ChangeBackupType제공된 매개 변수 Ola를 이미 사용하고있는 것 같습니다 . 이 매개 변수의 문서는 다음과 같은 정보를 제공합니다.
DatabaseBackup 검사
differential_base_lsn에서이sys.master_files차이 백업이 수행 될 수 있는지 여부를 결정한다. 차등 백업이 불가능하면 기본적으로 데이터베이스를 건너 뜁니다. 또는 전체 백업을 대신 수행하도록 ChangeBackupType을 Y로 설정할 수 있습니다.
관련 ... 그리고 ...
DatabaseBackup 검사
last_log_backup_lsn에서는sys.database_recovery_status전체 또는 대량 로그 복구 모델에서 트랜잭션 로그 백업을 수행 할 수 있는지 여부를 확인합니다. 트랜잭션 로그 백업이 불가능하면 기본적으로 데이터베이스를 건너 뜁니다. 또는 ChangeBackupType을 Y로 설정하여 차등 또는 전체 백업을 대신 수행 할 수 있습니다.
관련 없음
참조 : DatabaseBackup (ola.hallengren.com)
인수
문제의 매개 변수를 사용하고 데이터베이스가 모두 FULL 복구 모델에서 실행되고 있다고 가정하면 Ola의 스크립트가 말한대로 수행하고 이전에 관찰 한 것처럼 차등 백업을 수행하기를 기대합니다 ... ..
하나
... 무엇인가가 SharePoint 데이터베이스를 변경하는 것입니다. Ola의 절차에서는 데이터베이스에 전체 백업이 필요하다고 가정합니다. Ola는 다양한 상황을 확인하며, 그중 하나는 매개 변수를 기반으로합니다 ....
수정 수준
@ModificationLevel첫 번째 매개 변수 @ChangeBackupType = 'Y'가 설정된 경우 DIFF 백업을 FULL 백업으로 변환하는 추가 매개 변수 가 있습니다. Ola의 코드를 살펴보면 다음과 같은 이점이 있습니다.
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
즉, 매개 변수 @ModifcationLevel가 값 @ChangeBackupType으로 설정 되고 로 설정 Y되면 백업 절차는 변경된 페이지의 양이 케이스를 트리거하는 경우 DIFF 백업을 FULL 백업으로 변환합니다 .
설정하지 않았기 때문에 Ola의 코드에서 볼 수 있듯이 @ModificationLevel남아 NULL있습니다.
@ModificationLevel int = NULL,
물론 매개 변수의 값이 @ModificationLevel가 아닌 경우가 아니라면 상황에 해당하지 않는 것 같습니다 NULL.
해결책 1
어떤 경우에 우리는 범인을 찾았습니다. @ModificationLevel다시 값을 변경하면 NULL모든 것이 잘됩니다.
전환의 추가 이유
백업이에서 DIFF로 변경되는 또 다른 이유는 FULL매개 변수 @ChangeBackupType자체입니다.
위의 설명은 다음과 같이 작성되었습니다.
DatabaseBackup (절차) 검사
differential_base_lsn에서이sys.master_files차이 백업이 수행 될 수 있는지 여부를 결정한다. 차등 백업이 불가능하면 기본적으로 데이터베이스를 건너 뜁니다. 또는 전체 백업을 대신 수행하도록 ChangeBackupType을 Y로 설정할 수 있습니다.
코드 확인
Ola는 다음과 같은 코드를 작성했습니다.
SELECT @CurrentDifferentialBaseLSN = differential_base_lsn FROM sys.master_files WHERE database_id = DB_ID(@CurrentDatabaseName) AND [type] = 0 AND [file_id] = 1
이 부분은 다음과 같습니다.
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;
이것은 무엇을 의미 하는가?
Ola의 코드 번역
다음과 같이 약간 읽습니다.
differntial_base_lsn현재 데이터베이스 의 값 가져 오기백업 유형이 DIFF이면 ...
- 현재 데이터베이스
is_snapshot의msdb.dbo.backupset테이블 에서 열을 읽고@CurrentDifferentialBaseLSN백업type은D(데이터베이스 백업)입니다. - 만약
@ChanageBackupType isY` 및@CurrentBackupType`DIFF이고@CurrentDifferentialBaseIsSnapshot이다1
- 그때
- 설정
@CurrentBackupType에FULL
- 설정
- 현재 데이터베이스
여기에 가능한 상황이 있습니다 ...
해결책 2
... 데이터베이스가 타사 솔루션 (CommVault, NetApp 등)으로 백업 된 경우 타사 솔루션은 SQL Server VSS Writer 서비스를 사용하여 유효하고 일관된 데이터베이스 백업을 생성합니다. msdb.dbo.backupset데이터베이스의 스냅 샷 사본이 작성되었다는 메모 를 작성하여 DIFF의 기반이되는 is_snapshot해당 데이터베이스에 대한 매개 변수를 설정합니다 differntial_base_lsn.
때문에 이것을 DIFF 백업의 더 이상을 기준으로 할 수 없습니다 수행하려는 is_snapshot백업 및 재설정, 다시 새로운 전체 백업을 생성해야 is_snapshot하고, differntial_base_lsn값을, 미래의 DIFF 백업을위한 새로운 기반을 만들 수 있습니다.
다른 백업 찾기
구현 된 솔루션에 방해가되는 타사 (또는 기타 백업 솔루션 b)를 확인하고 다음 중 하나인지 확인해야합니다.
- 공존하도록 수정
- 하나의 백업 솔루션으로 최소화됩니다.