如何让distribution数据库纳入Ola Hallengren的USER_DATABASES差异备份?
升级Ola Hallengren备份脚本后遇到异常:此前distribution数据库可被纳入DatabaseBackup - USER_DATABASES - DIFF差异备份任务,但新版本中该数据库仅能在DatabaseBackup - SYSTEM_DATABASES - FULL全量备份任务中执行,需要将其重新加入用户数据库的差异备份流程。
当前差异备份任务的核心脚本片段:
INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02) SELECT 'DatabaseBackup - USER_DATABASES - DIFF', 'EXECUTE [dbo].[DatabaseBackup]' + CHAR(13) + CHAR(10) + '@Databases = ''USER_DATABASES'',' + CHAR(13) + CHAR(10) + CASE WHEN @BackupURL IS NOT NULL THEN '@URL = N''' + REPLACE(@BackupURL,'''','''''') + '''' ELSE '@Directory = ' + ISNULL('N''' + REPLACE(@BackupDirectory,'''','''''') + '''','NULL') END + ',' + CHAR(13) + CHAR(10) + '@BackupType = ''DIFF'',' + CHAR(13) + CHAR(10) + '@Verify = ''Y'',' + CHAR(13) + CHAR(10) + '@CleanupTime = ' + ISNULL(CAST(@CleanupTime AS nvarchar),'NULL') + ',' + CHAR(13) + CHAR(10) + '@Checksum = ''Y'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''', @DatabaseName, 'DatabaseBackup', 'DIFF'
已尝试无效操作:
- 修改参数为
@Databases = ''USER_DATABASES, distribution'' - 声明自定义变量引入
distribution数据库
方法1:显式指定包含distribution的数据库列表
放弃USER_DATABASES关键字,直接列出所有需要备份的用户数据库和distribution,示例:
@Databases = 'UserDB01, UserDB02, distribution'
注意:后续新增用户数据库时需手动更新该列表,否则会遗漏备份。
方法2:使用ALL_DATABASES并排除无关系统库
用ALL_DATABASES覆盖所有数据库,再通过@ExcludeDatabases排除不需要做差异备份的系统库(master、model、msdb),自动包含所有用户库和distribution。修改后的核心命令片段:
'EXECUTE [dbo].[DatabaseBackup]' + CHAR(13) + CHAR(10) + '@Databases = ''ALL_DATABASES'',' + CHAR(13) + CHAR(10) + '@ExcludeDatabases = ''master, model, msdb'',' + CHAR(13) + CHAR(10) + CASE WHEN @BackupURL IS NOT NULL THEN '@URL = N''' + REPLACE(@BackupURL,'''','''''') + '''' ELSE '@Directory = ' + ISNULL('N''' + REPLACE(@BackupDirectory,'''','''''') + '''','NULL') END + ',' + CHAR(13) + CHAR(10) + '@BackupType = ''DIFF'',' + CHAR(13) + CHAR(10) + '@Verify = ''Y'',' + CHAR(13) + CHAR(10) + '@CleanupTime = ' + ISNULL(CAST(@CleanupTime AS nvarchar),'NULL') + ',' + CHAR(13) + CHAR(10) + '@Checksum = ''Y'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + ''''
该方法优势是新增用户数据库无需手动修改脚本,会自动纳入备份。
方法3:修改存储过程的系统数据库判定(不推荐)
Ola的DatabaseBackup存储过程默认将distribution归类为系统数据库,可找到存储过程中判定系统库的逻辑,移除distribution条目。但不建议此操作,后续升级Ola脚本时会覆盖修改,需重复调整。
新版本Ola脚本中,distribution被默认标记为系统数据库,使用USER_DATABASES关键字时,存储过程会自动排除所有系统库,因此直接追加distribution无效,必须通过显式指定、反向排除或修改判定逻辑绕过限制。
内容的提问来源于stack exchange,提问作者Somebody_Data_Science

