SQL Server 可用性组和备份

Sha*_*ham 2 sql-server backup availability-groups

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

\n

我们的 AG 有 3 个节点。

\n

我想在主数据库上进行完整备份和差异备份,在辅助数据库上进行日志备份。

\n

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

\n

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

\n

如何配置为仅在主数据库上进行完整/差异备份并仅在辅助数据库上进行日志备份?

\n

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

\n

我们当前的设置每 3 天进行一次完整处理,并在每天下班后进行比较,我们\xe2\x80\x99ve 每 15 分钟运行一次日志备份。它通过具有自定义 SP 的 SQL 代理作业\xe2\x80\x99s。

\n

Bre*_*rey 8

备份首选项

\n

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

\n

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

\n

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

\n
    \n
  1. 的结果sys.fn_hadr_backup_is_preferred_replica确保它不是完整/差异备份的首选回复
  2. \n
  3. backup_priority中当前副本的,sys.availability_replicas这样您就不会盲目地在所有辅助副本上进行日志备份。
  4. \n
\n

您希望将其创建为存储过程并在日志备份作业中引用它。下面是一个概念存储过程,您可以使用它来完成此任务。** 注意,我只是将其放在一起作为示例,尚未对其进行测试。使用风险自负!

\n
CREATE FUNCTION is_preferred_replica_for_log_backup (\n    @DatabaseName\n) RETURNS bit\nBEGIN\n    IF sys.fn_hadr_backup_is_preferred_replica (@DatabaseName) = 1\n    BEGIN /* Is preferred for Diff/Full, skip log backup */\n        RETURN 0\n    END\n\n    IF sys.fn_hadr_backup_is_preferred_replica (@DatabaseName) = 0\n    BEGIN\n        IF @@SERVERNAME = (\n            /*\n             If the replicase contains more than one Availability Group,\n             some additional code would be needed here to filter to\n             the correct one\n            */\n            SELECT TOP 1 replica_server_name\n            FROM sys.availability_replicas\n            ORDER BY backup_priority\n        )\n        BEGIN /* Replica is preferred for Log backups */\n            RETURN 1\n        END\n        ELSE\n        BEGIN\n            RETURN 0\n        END\n    END\n\n    /*\n    Failsafe: DB not in AG or status not be determinable, take log backup.\n    */\n\n    RETURN 1\nEND\n
Run Code Online (Sandbox Code Playgroud)\n

分割备份和首选项的风险

\n

日志备份可以在可用性组内的任何和所有副本上进行,无论完整备份在哪里进行。这是因为log chains它们在可用性组中的所有副本中持久存在。例如,\xe2\x80\x99s 假设您按此顺序执行以下备份。

\n
    \n
  1. 主副本上的完整备份 1
  2. \n
  3. 主副本上的日志备份 1
  4. \n
  5. 在辅助副本上记录备份 2
  6. \n
  7. 主副本上的日志备份 3
  8. \n
\n

辅助副本上的日志备份 2完成后,主副本将能够及时截断其事务日志。因此,当主副本运行日志备份 3 时,它将无法备份在辅助副本上的日志备份 2期间已备份的日志数据。

\n

要在这种情况下执行时间点还原,您需要还原在主数据库上进行的完整备份,以及在所有副本上进行的所有三个日志备份。

\n

出于这个原因,我不建议将备份分散到多个副本。事实上,I\xe2\x80\x99d 实际上建议在主副本上进行所有备份,以帮助避免潜在的数据丢失。我在最近的博客文章《将数据库备份卸载到辅助副本》中更详细地讨论了这些潜在的数据丢失问题。如果您真正的问题是高峰时段的性能,请考虑在 SQL Server 上添加额外的资源,以支持高峰时段在主副本上运行的所有备份类型。

\n