【问题标题】:SQL Server Availability group and BackupsSQL Server 可用性组和备份
【发布时间】:2022-01-24 17:50:05
【问题描述】:

SQL Server 可用性组备份首选项。

我们的 AG 有 3 个节点。

我想在主服务器上进行完整备份和差异备份,在辅助服务器上进行日志备份。

当我配置“任何副本”时,所有副本的备份优先级为 50,日志备份不在辅助副本上运行。

如果我更喜欢辅助完整备份,则不会在主数据库上运行。

如何配置仅在主服务器上获取完整/差异,并仅在辅助服务器上进行日志备份?

我们希望将备份卸载到辅助副本的原因是为了在高峰时段提高主副本的性能。

我们当前的设置每 3 天完成一次,并且每天下班后都会有差异,我们每 15 分钟运行一次日志备份。这是通过带有自定义 SP 的 SQL 代理作业。

【问题讨论】:

    标签: sql-server backup availability-groups


    【解决方案1】:

    备份偏好

    在可用性组属性中设置备份首选项只会影响sys.fn_hadr_backup_is_preferred_replica 函数的输出。如果您的备份作业没有引用该函数,那么无论您的偏好设置如何,它们都会在执行的任何地方进行备份。此设置也适用于调用此函数的任何备份类型。因此,您必须使用自定义代码来操作日志备份首选项,使其不同于您的完整和差异备份首选项。

    用于卸载日志备份的自定义存储过程

    要将日志备份卸载到执行完整和差异备份的首选副本之外的副本,您需要检查两个值以确定当前副本是否是日志备份的候选者。

    1. sys.fn_hadr_backup_is_preferred_replica 的结果,以确保它不是完整/差异备份的首选回复。
    2. 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. 在主副本上记录备份 1
    3. 次要副本上的日志备份 2
    4. 主副本上的日志备份 3

    次要副本上的日志备份 2 完成后,主要副本将能够截断其事务日志直到该时间点。因此,当主副本日志备份 3 运行时,它将无法备份在 次副本上的日志备份 2 期间已备份的日志数据。。 p>

    要在这种情况下执行时间点恢复,您需要恢复在主节点上进行的完整备份,以及跨所有副本进行的所有三个日志备份。

    因此,我不建议将备份分布在多个副本上。事实上,我实际上建议在主副本上进行所有备份,以帮助避免潜在的数据丢失。我最近在Offloading Database Backups to Secondary Replicas 上发表的博文中更详细地讨论了这些潜在的数据丢失问题。如果您的真正问题是高峰时段的性能,请考虑在 SQL Server 上添加额外资源,以支持高峰时段在主副本上运行的所有备份类型。

    【讨论】:

    • 谢谢,这就是我要找的。是定制的 SP 不允许我们进行日志备份而不是备份优先级。
    猜你喜欢
    • 2013-03-28
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多