排查 SQL Server Always On 问题

本文可帮助你解决 SQL Server 上的 AlwaysOn 配置常见问题。

注意

有关本文的引导性演练体验,请参阅 SQL Server Always On 问题疑难解答。

原始产品版本: SQL Server 2012 Enterprise、SQL Server 2014 Enterprise、SQL Server 2016 Enterprise
原始 KB 数: 10179

重要事项

我需要有关设置和配置 AlwaysOn 可用性组的指针

如果要查找有关设置 AlwaysOn 配置的文档,请参阅以下文档:

AlwaysOn 可用性组入门 (SQL Server) - 本文档提供了有关可用性组和设置的许多问题的解答。 遵循本文中的所有步骤并查看 AlwaysOn 可用性组(SQL Server) 的先决条件、限制和建议将有助于防止环境中设置和维护可用性组时可能会遇到的许多问题。

其他资源

如果此信息没有帮助,请参阅 有关 AlwaysOn 可用性组的详细信息。

配置 AlwaysOn 可用性组时遇到问题

典型的配置问题包括 AlwaysOn 可用性组被禁用、帐户配置不正确、数据库镜像终结点不存在、终结点不可访问(SQL Server 错误 1418)、网络访问不存在,联接数据库命令失败(SQL Server 错误 35250)。 请查看以下文档,获取有关排查这些问题的帮助:

AlwaysOn 可用性组配置疑难解答 (SQL Server)

其他链接: 修复:尝试创建多个可用性组时出现错误 41009

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

我遇到侦听器配置问题(19471、19476 和其他错误)

客户遇到的最常见配置问题之一是创建可用性组侦听器。 这些错误类似于以下内容:

  • Msg 19471,级别 16,状态 0,第 2 行 WSFC 群集无法将网络名称资源与 DNS 名称“联机”。 DNS 名称可能已使用或与现有名称服务发生冲突,或者 WSFC 群集服务可能未运行或无法访问。 使用不同的 DNS 名称来解决名称冲突,或检查 WSFC 群集日志以了解详细信息。

  • Msg 19476,级别 16,状态 4,第 2 行尝试为侦听器创建网络名称和 IP 地址失败。 WSFC 服务可能未运行或不可访问其当前状态,或者为网络名称和 IP 地址提供的值可能不正确。 检查 WSFC 群集的状态,并使用网络管理员验证网络名称和 IP 地址。

大多数时候,由于 Active Directory 中群集名称对象(CNO)缺少创建和读取侦听器计算机对象的权限,导致上述消息的侦听器创建失败。 若要解决此问题,请查看以下文章:

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

自动故障转移无法按预期工作

如果注意到在测试期间或生产环境中自动故障转移未按预期工作,请参阅: 排查 SQL Server 2012 Always On 环境中的自动故障转移问题。

指定时间段内最大失败的配置 不当是主要节点不自动故障转移到辅助数据库 的主要原因之一。 此设置的默认值为 N-1,其中 N 是副本数。 有关详细信息,请参阅 故障转移群集(组)最大故障限制

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

连接到 AlwaysOn 可用性组时遇到问题

在 SQL Server 2012 中为 AlwaysOn 可用性组配置可用性组侦听器后,可能无法 ping 侦听器或从应用程序连接到它。 可能会收到类似于以下内容的错误:

Sqlcmd:错误:Microsoft SQL Native Client:登录超时已过期。

若要排查此错误和类似错误,请查看以下内容:

详细信息链接:

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

我在 Azure VM 中配置 AlwaysOn 可用性组时遇到问题(IaaS)

  1. 由于侦听器配置不当,出现了与 AlwaysOn 相关的大量问题。 如果与侦听器的连接问题,

    1. 请确保阅读 ILB 侦听器的所有限制,并遵循以下文章中所述的所有步骤,特别注意 PowerShell 脚本中的依赖项配置、IP 地址和各种其他参数。

    2. 如果不确定,可能需要根据上述文档删除并重新创建侦听器。

  2. 如果最近将 VM 移动到其他服务或 IP 地址已更改,则需要更新 IP 地址资源的值以反映新地址,并且需要重新创建 AG 的负载均衡终结点。 可以使用以下命令Set更新 IP 地址Get,如下所示:

    Get-ClusterResource "IPResourceName" | Set-ClusterParameter -name Address -value "w.x.y.z"
    

建议的文档:

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

从主数据库故障转移到辅助数据库需要很长时间,反之亦然

对可用性组进行自动故障转移或计划的手动故障转移(无数据丢失)后,可能会发现故障转移时间超过恢复时间目标 (RTO)。 若要对原因和潜在解决方法进行故障排除,请参阅 故障排除:可用性组超出 RTO

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

主要副本上的更改未反映或复制到次要副本的速度缓慢

你可能会注意到,主要副本上的更改不会及时传播到辅助副本。 若要排查并解决这些问题,请尝试以下操作:

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

如何管理 AG 数据库的事务日志大小

可以通过在主服务器或辅助服务器上配置常规备份来减少事务日志大小。

有关其他信息,请查看以下主题:

如果此信息没有帮助,请参阅 有关 AlwaysOn 可用性组的详细信息。

主服务器或辅助服务器处于解析状态,或者遇到意外故障转移

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

无法使资源联机

通过查看 SQL ErrorLog 中的消息,检查数据库是否需要很长时间才能恢复。

如果问题仍然存在,请参阅 有关 AlwaysOn 可用性组的详细信息。

常见问题解答

  1. 是否可以为一个可用性组创建两个侦听器?

    是的,可以为同一可用性组设置多个侦听器。 请参阅 如何为同一可用性组(Goden Yao)创建多个侦听器。

  2. 是否可以在流量和客户端连接上始终使用单独的 NIC 卡?

    是的,可以为 AlwaysOn 流量使用专用 NIC 卡。 请参阅 配置可用性组以在专用网络上进行通信。

  3. 哪些版本支持 AlwaysOn 故障转移群集实例?

    SQL Server 联机丛书中的本主题包含详细信息: SQL Server 2016 的版本和支持的功能。

  4. 如何在群集的所有节点上发生故障时恢复?

    请参阅 通过强制仲裁(SQL Server)进行 WSFC 灾难恢复。

  5. 在哪里可以找到有关 AG 配置中分布式事务支持的信息?

    请参阅 事务 - 可用性组和数据库镜像

  6. 如何更新 AlwaysOn 配置?

    请参阅 升级 AlwaysOn 可用性组副本实例

  7. 如何将已启用 TDE(透明数据加密)的数据库添加到 AG 配置?

    若要将已启用 TDE 的数据库添加到 AG,请参阅 如何为 TDE 数据库配置 Always On。

  8. 如何配置警报以检查辅助数据库是否落后于主要副本?

    可以使用以下脚本:

    SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server,
    dr_state.database_id AS database_id,
    is_ag_replica_local = CASE
        WHEN ar_state.is_local = 1 THEN N'LOCAL'
        ELSE 'REMOTE'
        END,
    ag_replica_role = CASE
        WHEN ar_state.role_desc IS NULL THEN N'DISCONNECTED'
        ELSE ar_state.role_desc
        END,
    dr_state.last_hardened_lsn, dr_state.last_hardened_time,
    datediff(s,last_hardened_time, getdate()) AS 'seconds behind primary'
    FROM (( sys.availability_groups AS ag
    JOIN sys.availability_replicas AS ar
        ON ag.group_id = ar.group_id)
    JOIN sys.dm_hadr_availability_replica_states AS ar_state
        ON ar.replica_id = ar_state.replica_id)
    JOIN sys.dm_hadr_database_replica_states dr_state
        ON ag.group_id = dr_state.group_id AND dr_state.replica_id = ar_state.replica_id
    
  9. 如果数据库的状态不是同步的,如何收到警报?

    可以使用以下脚本:

    SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server,
    dr_state.database_id AS database_id,
    is_ag_replica_local = CASE
        WHEN ar_state.is_local = 1 THEN N'LOCAL'
        ELSE 'REMOTE'
        END,
    ag_replica_role = CASE
        WHEN ar_state.role_desc IS NULL THEN N'DISCONNECTED'
        ELSE ar_state.role_desc
        END,
    ar_state.connected_state_desc, ar.availability_mode_desc, dr_state.synchronization_state_desc
    FROM (( sys.availability_groups AS ag
    JOIN sys.availability_replicas AS ar
        ON ag.group_id = ar.group_id )
    JOIN sys.dm_hadr_availability_replica_states AS ar_state
        ON ar.replica_id = ar_state.replica_id)
    JOIN sys.dm_hadr_database_replica_states dr_state
        ON ag.group_id = dr_state.group_id AND dr_state.replica_id = ar_state.replica_id
    

    还可以查看以下链接,了解用于监视 AlwaysOn 组的其他方法:

有关 AlwaysOn 可用性组的详细信息