对处于还原状态的可用性组数据库进行故障排除

本文可帮助你对处于还原状态的可用性组数据库进行故障排除。

什么是正在还原状态?

当辅助服务器必须撤消已应用的更改才能恢复与主服务器同步时,将发生还原状态。

可用性组主要和辅助副本 (replica) () 在正常操作期间保持连接状态,以便主副本 (replica) 中的更改与辅助副本 (replica) () 主动同步。

在故障转移期间,此连接状态被切断。 新的主副本 (replica) 联机后,主副本 (replica) 和辅助副本 (replica) () 之间建立连接。 在此初始连接状态期间,会协商一个公共恢复点,其中新的辅助数据库应开始恢复,以便它与主数据库同步。

如果在故障转移时正在运行大型事务,则新的辅助数据库日志将先于主数据库副本 (replica) 。 协商的新通用恢复点需要辅助副本 (replica) 从主副本 (replica) 接收页面,使其处于可以恢复同步的状态。 还原过程也称为“撤消重做”。

还原过程本质上是缓慢的,经常发生,通常很少注意到触发还原状态的小事务。 当故障转移中断大型事务时,通常会注意到还原状态,导致许多页从主事务发送到辅助数据库,以还原辅助副本 (replica) 数据库恢复为可恢复状态。

处于还原状态的可用性组数据库的症状和影响

当数据库在辅助副本 (replica) 上处于还原状态时,数据库不会同步,因此不会从主副本 (replica) 接收更改。 主副本 (replica) 上的数据库突然丢失可能会导致数据丢失。

Always On 仪表板报告主数据库上未同步

故障转移可用性组后,你可能会发现在故障转移成功时,辅助数据库报告为未同步。 Always On 仪表板报告主要数据库上的“未同步”和“正在辅助数据库上还原”。

Always On 仪表板报告主数据库上未同步 Always On 仪表板报告正在辅助数据库上还原
Always On 仪表板的屏幕截图,其中报告了主数据库上的“未同步”。 Always On 仪表板报告对辅助数据库还原的屏幕截图。

Always On DMV 报告主数据库未同步

在主数据库上查询以下Always On可用性组 (AG) 动态管理视图 (DMV) 时,数据库处于“未同步”状态。

SELECT DISTINCT ar.replica_server_name, drcs.database_name, drs.database_id, drs.synchronization_state_desc, drs.database_state_desc
FROM sys.availability_replicas ar 
JOIN sys.dm_hadr_database_replica_states drs 
ON ar.replica_id=drs.replica_id 
JOIN sys.dm_hadr_database_replica_cluster_states drcs
ON drs.group_database_id=drcs.group_database_id

报告在主数据库上未同步的Always On DMV 的屏幕截图。

在辅助数据库上查询 DMV 时,可用性组数据库处于 “正在还原” 状态。

Always On DMV 在辅助数据库上报告还原的屏幕截图。

只读和报告工作负荷无法访问辅助数据库

辅助数据库正在还原时,无法对其进行访问或查询。 这些只读工作负载处于脱机状态并中断。 根据数据库处于还原状态的时长,如果这些工作负载是业务关键型的,可能需要将这些工作负荷重新路由到另一个辅助副本 (replica) 或主副本 (replica) 。

如果具有只读工作负载(例如路由到辅助副本 (replica) 的报告工作负荷),这些批可能会失败并显示消息 922:

正在恢复消息 922,级别 14,状态 1,第 2 行数据库“agdb”。 等待恢复完成。

屏幕截图显示只读和报告工作负荷无法访问错误 922 的辅助数据库。

尝试以还原状态登录到辅助副本 (replica) 数据库的应用程序无法连接,并引发错误 18456:

2023-01-26 13:01:13.100 登录错误: 18456,严重性: 14,状态: 38。 2023-01-26 13:01:13.100 用户“UserName>”<登录失败。 原因:无法打开显式指定的数据库“agdb”。 [CLIENT: <本地计算机>]

如果审核失败的登录名,也可以在SQL Server错误日志中报告此错误。

估计还原状态的剩余时间

使用以下方法之一来估计还原状态的剩余时间:

使用 AlwaysOn_health XEvent 会话

AlwaysOn_health扩展事件诊断日志具有hadr_trace_message事件,该事件每五分钟报告一次还原状态进度。

使用 SQL Server Management Studio (SSMS) 对象资源管理器 连接到辅助副本 (replica) ,并钻取到“管理”、“扩展事件”和“会话”。 右键单击 AlwaysOn_health 事件,然后选择“ 观看实时数据”。 应会出现一个新的选项卡式窗口,用于报告还原操作的当前状态。 状态每五分钟通过 hadr_trace_message 事件报告一次,并报告还原操作的完成百分比。

注意

扩展事件hadr_trace_message已添加到 SQL Server 2019 及更高版本中的最新累积更新。 必须运行最新的累积更新才能在扩展事件会话中 AlwaysOn_health 观察此扩展事件。

AlwaysOn_health扩展事件诊断日志的屏幕截图。

在估计还原完成情况时,辅助副本 (replica) 上的SQL Server错误日志没有太大帮助。 从下图中,可以观察到在 10:0811:03 期间处于还原状态,几乎没有报告。 从主副本 (replica) 接收所有页后,辅助数据库现在可以回滚在触发还原状态的原始主数据库上运行的事务。 恢复从 11:03 运行到 11:05。 恢复完成后不久,数据库应开始与主副本 (replica) 同步,并在辅助数据库处于还原状态时赶上主数据库所做的所有更改。

用于还原和恢复阶段的SQL Server错误日志的屏幕截图。

使用 性能监视器 监视还原完成时间

使用性能计数器监视还原状态进度SQL Server:D atabase Replica:Total Log 需要撤消SQL Server:D atabase Replica:Log Remaining for Undo,并为实例选择可用性组数据库。 在以下屏幕截图的示例中, 需要撤消的日志总数 报告为 56.3 mb,撤消 的日志剩余 量缓慢下降到 0 ,报告还原进度。

需要撤消的日志总数和撤消的剩余日志的性能计数器的屏幕截图。

除了等待之外,还有什么其他选择?

Microsoft 建议估计还原状态的完成时间。

将辅助副本 (replica) 添加到可用性组

如果可用性组中只有两个副本,请添加另一个辅助副本 (replica) ,该辅助副本 (replica) 可提供高可用性和冗余,并在另一个辅助副本完成还原时主动与主副本 (replica) 同步。

重要

不要故障转移到数据库 () 处于还原状态的副本 (replica) 。 这可能会导致数据库不可用,需要从备份还原。 不要重启辅助副本 (replica) 实例,它不会加速此过程,并且可能会破坏处于还原状态的辅助副本 (replica) 数据库的状态。

如何解决失败的只读工作负载

由于还原中的辅助副本 (replica) 数据库不可访问,只读工作负荷会失败。 更新读取意向路由表,以将流量路由回主副本 (replica) 或另一个辅助副本 (replica) ,直到受影响的辅助副本 (replica) 数据库完成还原过程。

避免还原状态 - 监视大型事务

如果在计划内故障转移期间经常观察到此状态,请实施在故障转移之前检查大型事务的过程。 以下查询报告系统上任何打开事务的事务开始时间和当前时间,并提供事务的输入缓冲区。

SELECT tat.transaction_begin_time, getdate() AS 'current time', es.program_name, es.login_time, es.session_id, tst.open_transaction_count, eib.event_info
FROM sys.dm_tran_active_transactions tat
JOIN sys.dm_tran_session_transactions tst ON tat.transaction_id=tst.transaction_id
JOIN sys.dm_exec_sessions es ON tst.session_id=es.session_id 
CROSS APPLY sys.dm_exec_input_buffer(es.session_id, NULL) eib WHERE es.is_user_process = 1
ORDER BY tat.transaction_begin_time ASC

屏幕截图显示任何已打开事务的开始时间和当前时间。