总结
在 SQL Server AlwaysOn 可用性组中,当副本在时间段内SESSION_TIMEOUT未收到来自其伙伴副本的响应时,将发生连接超时。 SQL Server错误日志将这些间歇性超时报告为错误 35201、35206 和 35267。 这些超时可能会使可用性组处于 “未同步 ”状态。 常见原因包括应用程序问题,例如 CPU 使用率高或未生成计划程序,或网络问题,例如延迟或丢弃数据包。 本文可帮助你解释连接超时错误,并使用SQL Server错误日志、Always On 动态管理视图(DMV)、扩展事件和网络跟踪来诊断根本原因。 它还说明了如何减轻超时问题,包括如何调整可用性组副本 SESSION_TIMEOUT 设置。
间歇性连接超时的症状和影响
主要副本和次要副本返回不同的结果
查询次要副本的只读工作负荷可能会查询过时的数据。 如果发生间歇性副本连接超时,查询同一数据时,主副本数据库上的数据更改尚未反映在辅助数据库中。 有关详细信息,请参阅 次要副本 上的数据延迟部分。
诊断报告可用性组未同步
SQL Server Management Studio(SSMS)中的 Always On 仪表板可能会显示一个状态不正常的可用性组,其中包含处于未同步状态的副本。
查看这些副本的SQL Server错误日志时,可能会看到以下消息,这些消息指示可用性组中的副本之间的连接超时。
下面是主要副本的错误日志。
2023-02-15 07:10:55.500 spid43s Always On availability groups connection with secondary database terminated for primary database 'agdb' on the availability replica 'SQL19AGN2' with Replica ID: {<replicaid>}. This is an informational message only. No user action is required.
下面是辅助副本的错误日志。
2023-02-15 07:11:03.100 spid31s A connection time-out has occurred on a previously established connection to availability replica 'SQL19AGN1' with id [<replicaid>]. Either a networking or a firewall issue exists or the availability replica has transitioned to the resolving role.
2023-02-15 07:11:03.100 spid31s Always On Availability Groups connection with primary database terminated for secondary database 'agdb' on the availability replica 'SQL19AGN1' with Replica ID: {<replicaid>}. This is an informational message only. No user action is required.
间歇性连接问题可能会影响辅助副本的故障转移就绪状态
如果将可用性组配置为自动故障转移,并且同步提交故障转移伙伴间歇性地断开与主故障转移的连接,则自动故障转移可能会失败。
可以查询sys.dm_hadr_database_replica_cluster_states,以检查可用性组数据库是否已做好故障转移准备。 以下是停止次要副本上的镜像端点后得到的结果示例。
SELECT drcs.database_name, drcs.is_failover_ready, ar.replica_server_name, ars.role_desc, ars.connected_state_desc,
ars.last_connect_error_description, ars.last_connect_error_number, ar.endpoint_url
FROM sys.dm_hadr_availability_replica_states ars JOIN sys.availability_replicas ar ON ars.replica_id=ar.replica_id
JOIN sys.dm_hadr_database_replica_cluster_states drcs ON ar.replica_id=drcs.replica_id
WHERE ars.role_desc='SECONDARY'
如果故障转移恰逢副本连接超时,自动故障转移可能无法使可用性组在故障转移伙伴计算机上以主角色联机。
连接超时错误的含义
可用性组副本设置 SESSION_TIMEOUT 的默认值为 10 秒。 为每个副本配置此设置。 它确定副本在报告连接超时之前等待从其伙伴副本接收响应的时间。 如果副本未从伙伴副本获取响应,则会在Microsoft SQL Server错误日志和Windows应用程序日志中报告连接超时。 报告超时的副本会立即尝试重新连接,并继续每隔五秒尝试一次。
通常,只有一个副本会检测到并报告连接超时。 但两个副本可能会同时报告连接超时。 此消息的不同版本存在,具体取决于连接超时发生在以前建立的连接还是新连接上。
Message 35206 A connection timeout has occurred on a previously established connection to availability replica '<replicaname>' with id [<replicaid>]. Either a networking or a firewall issue exists or the availability replica has transitioned to the resolving role.
Message 35201 A connection timeout has occurred while attempting to establish a connection to availability replica '<replicaname>' with id [<replicaid>]. Either a networking or firewall issue exists, or the endpoint address provided for the replica is not the database mirroring endpoint of the host server instance.
伙伴副本可能无法检测到超时。 如果这样做,它可能会报告消息 35201 或 35206。 如果没有,它会向每个可用性组数据库报告连接丢失情况。
Message 35267 Always On Availability Groups connection with primary/secondary database terminated for primary/secondary database '<databasename>' on the availability replica '<replicaname>' with Replica ID: {<replicaid>}. This is an informational message only. No user action is required.
下面是SQL Server报告错误日志的示例。 如果停止主副本上的镜像终结点,次要副本将检测到连接超时,并在次要副本错误日志中报告消息 35206 和 35267。
2023-02-15 07:11:03.100 spid31s A connection timeout has occurred on a previously established connection to availability replica 'SQL19AGN1' with id [<replicaid>]. Either a networking or a firewall issue exists or the availability replica has transitioned to the resolving role.
2023-02-15 07:11:03.100 spid31s Always On Availability Groups connection with primary database terminated for secondary database 'agdb' on the availability replica 'SQL19AGN1' with Replica ID:[<replicaid>]. This is an informational message only. No user action is required.
在此示例中,主副本未检测到连接超时,因为它仍可与次要副本通信。 它针对可用性组中的每个数据库报告了消息 35267。 此处只有一个数据库“agdb”。
2023-02-15 07:10:55.500 spid43s Always On Availability Groups connection with secondary database terminated for primary database 'agdb' on the availability replica 'SQL19AGN2' with Replica ID: {<replicaid>}. This is an informational message only. No user action is required.
副本连接超时的原因
应用程序问题
SQL Server可能太忙,无法服务可用性组期间内的SESSION_TIMEOUT连接,这会导致连接超时。 下面是一些常见原因:
SQL Server 的 CPU 使用率为 100%。 此条件意味着SQL Server或其他应用程序一次消耗所有可用的 CPU 数秒。
SQL Server 发生无响应调度程序事件。 SQL Server线程负责将计划程序(CPU)传递给其他线程来完成其工作。 如果线程未能及时让出执行权,就可能延迟镜像端点连接并导致超时。
SQL Server 遇到工作线程耗尽、内存不足问题或影响其服务镜像终结点连接能力的应用程序问题。
网络问题
在错误发生时,收集主副本和辅助副本上的网络跟踪数据,然后检查其中是否存在网络延迟和丢包。
诊断副本连接超时
本节介绍如何分析 SQL Server 日志,以诊断导致 SQL Server 无法为与伙伴副本的连接提供服务的应用程序问题。 这些提示可帮助你确定副本连接超时的根本原因。 最后以更深入的指导作结:在发生连接超时时收集网络跟踪日志,以便检查网络状态。
评估副本连接超时的发生时间和位置
查看连接超时的历史记录、频率和趋势。 SQL Server错误日志中的消息是此评审的良好来源。 在何处报告连接超时? 它们是否始终在主副本或辅助副本上报告? 错误何时发生? 它们是否发生在某个月中的某一周、每周的某一天,或一天中的某个时间段? 其他计划维护或批处理是否与观察到连接超时的时间相对应? 此评估可帮助你确定连接超时的范围并关联,以确定根本原因。
查看 AlwaysOn_health 扩展事件会话
AlwaysOn_health扩展事件会话已得到增强,现包含ucs_connection_setup事件;该事件会在副本与其伙伴副本建立连接时触发。 对此连接超时问题进行故障排除时,此事件可提供帮助。
注意
扩展ucs_connection_setup事件从 SQL Server 2019 CU15 开始可用。 有关详细信息,请参阅 为可用性组配置扩展事件。
查询 AlwaysOn 动态管理视图 (DMV)
可以查询 Always On DMV,了解有关副本连接状态的详细信息。 此查询仅报告连接状态以及发生问题时与连接超时关联的任何错误。 如果连接问题间歇性,则查询可能无法轻松捕获断开连接的状态。
SELECT ar.replica_server_name, ars.role_desc, ars.connected_state_desc,
ars.last_connect_error_description, ars.last_connect_error_number, ar.endpoint_url
FROM sys.dm_hadr_availability_replica_states ars JOIN sys.availability_replicas ar ON ars.replica_id=ar.replica_id
下面的示例显示了持续处于断开连接状态,这是因为主副本上的镜像端点已停止。 查询主副本时,Always On DMV 可返回有关主副本和所有辅助副本的信息(主副本上的端点处于禁用状态)。
查询次要副本时,Always On DMV 仅报告有关该次要副本的信息。
查看 AlwaysOn 扩展事件会话
使用 SSMS 对象资源管理器连接到每个副本,并打开
AlwaysOn_health扩展事件文件。在 SSMS 中,转到“文件>打开”,然后选择“合并扩展事件文件”。
选择“添加”按钮。
在“文件打开”对话框中,转到 SQL Server \LOG 目录中的文件。
选择并按住 Ctrl,然后选择名称以 AlwaysOn_healthxxx.xel 开头的文件。
选择“打开”,然后选择“确定”。
新的选项卡式窗口显示在显示 AlwaysOn 事件的 SSMS 中。
以下屏幕截图显示了来自次要副本的
AlwaysOn_health数据。 第一个勾勒出的框显示了主副本上的端点停止后发生的连接丢失情况。 第二个带轮廓线的框显示了辅助副本下一次尝试连接到主副本时发生的连接失败。
检查未让出控制权的事件是否会导致连接超时
可用性副本无法为合作伙伴副本连接提供服务的最常见原因之一是非生成计划程序。 有关非让出调度程序的详细信息,请参阅 SQL Server 调度和让出疑难解答。
SQL Server 会跟踪短至 5 到 10 秒的非让出调度程序事件。 它在 sp_server_diagnostics query_processing 组件输出中的 TrackingNonYieldingScheduler 数据点中报告这些事件。
若要检查可能导致副本连接超时的非让出事件,请按照以下步骤操作。
创建一个 SQL Agent 作业,使其每五秒钟记录一次 sp_server_diagnostics。
在未报告连接超时的服务器上计划此作业。 也就是说,假设服务器 A 副本在其错误日志中报告连接超时。 在这种情况下,请在伙伴副本(服务器 B)上设置 SQL 代理作业。或者,如果在两个副本上看到连接超时,请在这两个副本上创建作业。
运行以下 T-SQL 脚本以创建每五秒运行
sp_server_diagnostics一次的作业,将输出追加到文本文件,然后启动该作业。 在以下示例中,该sp_server_diagnostics 5命令每五秒执行一次。 因此,没有必要将此作业设置为每五秒运行一次。 只需启动作业,它就会运行到停止为止,每 5 秒运行一次。USE [msdb] GO DECLARE @ReturnCode INT SELECT @ReturnCode = 0 DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Run sp_server_diagnostics', @owner_login_name=N'sa', @job_id = @jobId OUTPUT /****** Object: Step [Run SP_SERVER_DIAGNOSTICS] Script Date: 2/15/2023 4:20:41 PM ******/ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Run SP_SERVER_DIAGNOSTICS', @subsystem=N'TSQL', @command=N'sp_server_diagnostics 5', @database_name=N'master', @output_file_name=N'D:\cases\2423\sp_server_diagnostics_output.out', @flags=2 EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' EXEC sp_start_job 'Run sp_server_diagnostics'注意
在这些命令中,将
@output_file_name替换为有效路径,并提供文件名。
分析结果
发生连接超时时,请注意SQL Server错误日志中显示的超时事件的时间戳。 对于以下示例中的副本,SQL19AGN1 报告副本连接超时情况。 因此,你要在伙伴副本 SQL19AGN2 上创建一个 SQL Server 代理作业。 然后,错误日志中 SQL19AGN1 报告了 07:24:31 的连接超时。
接下来,检查在报告时间左右运行的 sp_server_diagnostics SQL 代理作业的输出。 具体而言,请查看 query_processing 组件输出中的 TrackingNonYieldingScheduler 数据点。 输出报告指出,在 SQL19AGN1 上报告副本连接超时(07:24:31)前后,在服务器 SQL19AGN2 上跟踪到了非让出调度程序(显示为非零十六进制值)(07:24:33)。
注意
以下 sp_server_diagnostics 输出被拼接在一起,以同时显示 create_time(时间戳)和 query_processing TrackingNonYieldingScheduler 结果。
调查未让出执行权的调度程序事件
如果您通过前面的诊断步骤确认是非让出事件导致了副本连接超时,请执行以下步骤。
确定在发生非让出事件时 SQL Server 中正在运行的工作负载。
与副本连接超时类似,查找这些事件在其发生的月份、日期或星期中的趋势。
在检测到非让出事件的系统上收集性能监视器跟踪数据。
收集系统资源的关键性能计数器,包括 Processor::% Processor Time、Memory::Available MBytes、Logical Disk::Avg Disk Queue Length 和 Logical Disk::Avg Disk sec/Transfer。
如有必要,请打开SQL Server支持事件,以进一步帮助查找这些非生成事件的根本原因。 共享收集的日志以供进一步分析。
在发生连接超时时抓取网络跟踪
如果之前对SQL Server应用程序的诊断没有产生根本原因,请检查网络。 若要成功分析网络,需要收集涵盖连接超时时间的网络跟踪。
以下过程在SQL Server错误日志中报告连接超时的副本上启动Windowsnetsh网络跟踪。 在应用程序日志中记录SQL Server连接错误之一时,将触发Windows计划任务。 计划任务会运行一条命令来停止 netsh 网络跟踪,以防关键的网络跟踪数据被覆盖。 这些步骤还假定批处理和跟踪日志的路径为 *F:* 。 根据你的环境调整此路径。
在发生连接超时的两个副本上启动网络跟踪,如以下代码片段所示。
netsh trace start capture=yes persistent=yes overwrite=yes maxsize=500 tracefile=f:\trace.etl创建 stoptrace.bat。 可以在管理命令提示符下创建此文件。
echo netsh trace stop > F:\stoptrace.bat创建 Windows 计划任务,以便在发生事件 35206 或 35267 时停止
netsh跟踪。 可以在管理命令提示符下创建这些任务。schtasks /Create /tn Event35206Task /tr F:\stoptrace.bat /SC ONEVENT /EC Application /MO *[System/EventID=35206] /f /RL HIGHEST schtasks /Create /tn Event35267Task /tr F:\stoptrace.bat /SC ONEVENT /EC Application /MO *[System/EventID=35267] /f /RL HIGHEST请在事件发生且网络跟踪已停止并已捕获后,删除
ONEVENT任务。schtasks /Delete /tn Event35206Task /F schtasks /Delete /tn Event35267Task /F
网络跟踪分析不在此疑难解答工具的范围内。 如果无法解释网络跟踪,请联系Microsoft SQL Server 支持团队,并与其他请求的日志文件一起提供跟踪,以便进行根本原因分析。
缓解连接超时问题
可以通过调整可用性组副本 SESSION_TIMEOUT 属性来缓解连接超时。 此设置按每个副本单独配置,因此需要分别对主副本和每个受影响的次要副本进行调整。 默认值为 10 秒,因此可以尝试 15 秒作为下一个值。 下面是语法的示例。
ALTER AVAILABILITY GROUP ag
MODIFY REPLICA ON 'SQL19AGN1' WITH (SESSION_TIMEOUT = 15);