备份偏好
在可用性组属性中设置备份首选项只会影响sys.fn_hadr_backup_is_preferred_replica 函数的输出。如果您的备份作业没有引用该函数,那么无论您的偏好设置如何,它们都会在执行的任何地方进行备份。此设置也适用于调用此函数的任何备份类型。因此,您必须使用自定义代码来操作日志备份首选项,使其不同于您的完整和差异备份首选项。
用于卸载日志备份的自定义存储过程
要将日志备份卸载到执行完整和差异备份的首选副本之外的副本,您需要检查两个值以确定当前副本是否是日志备份的候选者。
-
sys.fn_hadr_backup_is_preferred_replica 的结果,以确保它不是完整/差异备份的首选回复。
-
sys.availability_replicas 中当前副本的backup_priority,这样您就不会盲目地对所有次副本进行日志备份。
您希望将其创建为存储过程并在日志备份作业中引用它。下面是一个概念存储过程,您可以使用它来完成此操作。 ** 注意,我只是把它作为一个例子放在一起,并没有测试它。使用风险自负!
CREATE FUNCTION is_preferred_replica_for_log_backup (
@DatabaseName
) RETURNS bit
BEGIN
IF sys.fn_hadr_backup_is_preferred_replica (@DatabaseName) = 1
BEGIN /* Is preferred for Diff/Full, skip log backup */
RETURN 0
END
IF sys.fn_hadr_backup_is_preferred_replica (@DatabaseName) = 0
BEGIN
IF @@SERVERNAME = (
/*
If the replicase contains more than one Availability Group,
some additional code would be needed here to filter to
the correct one
*/
SELECT TOP 1 replica_server_name
FROM sys.availability_replicas
ORDER BY backup_priority
)
BEGIN /* Replica is preferred for Log backups */
RETURN 1
END
ELSE
BEGIN
RETURN 0
END
END
/*
Failsafe: DB not in AG or status not be determinable, take log backup.
*/
RETURN 1
END
拆分备份和偏好的风险
可以在可用性组中的任何和所有副本上进行日志备份,无论在哪里进行完整备份。这是因为log chains 保留在可用性组中的所有副本中。例如,假设您按此顺序执行以下备份。
- 主副本上的完整备份 1
- 在主副本上记录备份 1
- 次要副本上的日志备份 2
- 主副本上的日志备份 3
次要副本上的日志备份 2 完成后,主要副本将能够截断其事务日志直到该时间点。因此,当主副本日志备份 3 运行时,它将无法备份在 次副本上的日志备份 2 期间已备份的日志数据。。 p>
要在这种情况下执行时间点恢复,您需要恢复在主节点上进行的完整备份,以及跨所有副本进行的所有三个日志备份。
因此,我不建议将备份分布在多个副本上。事实上,我实际上建议在主副本上进行所有备份,以帮助避免潜在的数据丢失。我最近在Offloading Database Backups to Secondary Replicas 上发表的博文中更详细地讨论了这些潜在的数据丢失问题。如果您的真正问题是高峰时段的性能,请考虑在 SQL Server 上添加额外资源,以支持高峰时段在主副本上运行的所有备份类型。