找回密码
 立即注册
首页 业界区 安全 暂停和恢复(Suspend and Resume)Always On数据库副本 ...

暂停和恢复(Suspend and Resume)Always On数据库副本之间的数据同步(译)

趣侮 5 小时前
原文地址:https://www.sqlshack.com/suspend-and-resume-data-movement-in-sql-server-always-on-availability-groups/  在关于SQLServer 2016 Always On的第26篇文章中,我们将会讨论Always On数据库副本之间的挂起和恢复流程 要求

我们可以配置SQLServer的Always On Group为同步或者异步模式,取决于应用程序的重要程度,是否可接受数据丢失,灾备恢复性,网络带宽等等因素。假设我们需要重启服务器来应用OS层面的补丁,SQL补丁,计划内的重启,OS相关的异常,通常,我们需要按照如下顺序来避免任何的自动故障转移。1,首先重启从节点2,AG故障转移(从节点接替主节点提供读写服务)3,重启原主节点 在同步提交模式 下,主副本在提交之前会等待辅助副本的确认。如果在辅助副本上停止了 SQL 服务,SQL Server 会立即将同步方式切换为异步模式。一旦辅助副本重新建立连接,数据同步又会恢复为同步提交。在按照顺序重启服务器的过程中,可能会导致数据同步的中断。假设另一种情况:你实现了双副本同步数据提交,并且两台服务器位于不同的机房。此时,网络团队通知你两个站点之间将出现网络中断或连接变慢的情况。一种缓解数据同步的方法是将模式切换为异步模式。在这种模式下,主副本在提交时不再等待辅助副本的确认。然而,在网络波动的情况下,可能会出现 数据包丢失,这可能会对辅助副本的数据同步造成问题。 在本文中,我们将寻找以下问题的答案:1,我们是否可以暂停主副本到辅助副本的数据传输?2,如果存在多个辅助副本,是否可以仅暂停某个特定辅助副本的数据传输?3,在暂停数据传输的情况下,对主副本会有什么影响?4,如何恢复主副本到辅助副本的数据传输? 环境:

你需要先阅读前面几篇文章(文末的目录 ToC),并配置两个或多个节点的 SQL Server Always On可用性组(来作为测试环境)。在本文中,我们使用以下 双节点 AG 副本环境:主副本:SQLNode2\INST1辅助副本:SQLNode1\INST1AG 数据库:SQLShackDemo SQL Server Always On Availability Groups中暂停数据传输

SQL Server Always On 有两种副本:主副本和辅助副本。主副本既支持只读事务,也支持写事务。辅助副本可以配置为允许只读连接,但在它发生故障转移并接管为主副本之前,不能对其写入数据。数据传输是从主副本到辅助副本的,我们可以在主副本或辅助副本上暂停这种数据传输。可以使用SSMS图形界面、T-SQL或PowerShell脚本来暂停数据传输。 从主副本上执行暂停数据传输

如果我们连接到主 SQL 实例并停止数据传输,那么它会停止所有已连接的辅助副本的数据传输。SQL Server允许最多5个同步副本(1个主副本和4个辅助副本)。我们无法在主SQ 实例上仅停止某一个特定辅助副本的数据传输。一旦我们停止了数据传输,主副本仍能正常工作,并且可供客户端连接使用。如果你使用可读的辅助副本,那么现有连接和新的连接都能正常工作。 从辅助副本上执行暂停数据传输

我们也可以仅暂停某一个特定辅助副本的数据传输。为此,你需要连接到对应的SQL实例并停止数据传输。如果在多个辅助副本的场景下仅暂停某个辅助副本的数据传输,不会影响其他副本,其他辅助副本仍会正常接收数据。被暂停的本地辅助副本数据库会显示状态 NOT SYNCHRONIZING。在可读辅助副本的情况下,它将不允许建立新的连接,但已有的连接仍然可以继续工作。 SQL Server Always On Availability Groups中如何暂停数据传输

从主副本和辅助副本暂停数据传输的过程是相同的,但你需要连接到合适的实例。在 SSMS 中连接到SQL实例,导航到Always On可用性组 -> 可用性组 -> 可用性数据库。
1.png
右键点击要暂停数据传输的数据库
2.png
相应地,可以使用如下脚本来完成该操
  1. ALTER DATABASE [SQLShackdemo] SET HADR SUSPEND
  2. GO
复制代码
操作完成后,它会在数据库前加上一个暂停符号,以表明数据传输已停止。(译者注:SQLServer 2019下暂停数据同步之后,数据库上是一个?的符号,不是暂停符号,主节点并不显示红叉的符号)
3.png
 如果你从主副本上暂停数据同步,然后在副本副本上查看的时候,将会看到一个红叉的标记
4.png
在AG的dashboard上,又会得到一个警告和错误信息,因为数据库没有处于同步状态。
5.png
 暂停数据同步对主副本数据库的影响

通常情况下,在单实例数据库中,SQL Server 会在日志备份后截断事务日志。对于同步可用性组,在执行日志备份时,它也会在checkpoint截断日志,因为它会先在辅助副本上提交数据。
现在,如果我们暂停了数据同步,主副本数据库会继续保留事务日志。即使你定期执行事务日志备份,它也不会截断日志。这可能会导致事务日志被填满,从而引发磁盘空间不足的问题。因此,不建议长时间暂停数据传输,尤其是在高并发 OLTP 环境下。
但是,如果仍然遇到事务日志已满的问题,你需要考虑增加磁盘空间、恢复数据传输,或者移除可用性组数据库。

 
 
恢复Always On Availability Groups 数据传输

要恢复从主副本到辅助副本的数据传输,请右键点击可用性组中的数据库,然后点击“恢复数据传输”。
6.png
相应地,您也可以运行以下的 T-SQL 脚本。
  1. ALTER DATABASE [SQLShackdemo] SET HADR RESUME;
  2. GO
复制代码
如果我们是从主副本暂停的数据传输,也应该从主副本恢复数据传输。这会恢复所有辅助副本的数据传输。
然而,如果我们是在辅助实例本地暂停的数据传输,则必须从该辅助实例恢复。恢复后,它会捕获所有待处理的事务日志,并根据配置将数据库状态更改为 Synchronized/ synchronizing。在与主副本完全同步之前,辅助数据库会以 异步数据提交 的方式工作。
这些操作也会记录在 SQL Server 错误日志中。下图中,我们可以看到一些关于暂停、恢复和恢复 LSN 的高亮日志。
7.png
  通过DMV动态管理视图来监控数据移动的暂停与恢复情况

我们可以利用动态管理视图来监控数据从主副本向从副本的转移情况。
  1. SELECT
  2.     ar.replica_server_name,
  3.     adc.database_name,
  4.     ag.name AS ag_name,
  5.     dhdrs.synchronization_state_desc,
  6.     dhdrs.is_commit_participant,
  7.     dhdrs.last_sent_lsn,
  8.     dhdrs.last_sent_time,
  9.     dhdrs.last_received_lsn,
  10.     dhdrs.last_hardened_lsn,
  11.     dhdrs.last_redone_time
  12. FROM sys.dm_hadr_database_replica_states AS dhdrs
  13. INNER JOIN sys.availability_databases_cluster AS adc
  14.     ON dhdrs.group_id = adc.group_id AND
  15.     dhdrs.group_database_id = adc.group_database_id
  16. INNER JOIN sys.availability_groups AS ag
  17.     ON ag.group_id = dhdrs.group_id
  18. INNER JOIN sys.availability_replicas AS ar
  19.     ON dhdrs.group_id = ar.group_id AND
  20.     dhdrs.replica_id = ar.replica_id
  21. where database_name='SQLShackDemo'
复制代码
在下面的输出中,我们捕获了 LSN 和 提交参与者 的详细信息,场景如下:
第一部分:数据库在两个副本中均处于同步状态
  is_commit_participant 列显示为 1,表示我们配置了 同步提交模式,且两个副本都参与数据提交。
  在主副本和辅助副本中,last_hardened_lsn 显示相同的值,同时它也等于 SQLNode\INST1 实例中的 last_sent_lsn。
第二部分:暂停主副本与辅助副本之间的数据传输后
  辅助副本 SQLNode\INST1 的 is_commit_participant 显示为 0,表示辅助副本不参与提交(暂停状态)。
  虽然配置了同步提交模式,此时 AG 实际上以 异步提交 方式工作。
  可以看到两个副本的 last_hardened_lsn 出现差异。
  在暂停状态下,辅助副本无法接收事务块,因此不会在辅助数据库上应用任何日志。
第三部分:恢复数据传输后
  is_commit_participant 再次标记为 1,辅助副本重新处于同步状态。
  两个副本的 last_hardened_lsn 再次匹配。
8.png
  总结

在本文中,我们探讨了 SQL Server 始终在线可用性组中的数据传输暂停与恢复问题。在工作完成后,您必须恢复数据传输,以便控制主副本数据库的事务日志增长情况。 
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册