SQL ServerAlways On 可用性组配置失败

问题现象
配置 Always On 可用性组时,报错 “无法将数据库加入可用性组”(错误 41158),或提示 “WSFC 群集资源无法联机”(错误 19471)。


快速诊断
  1. 验证 WSFC 群集状态

    # 检查群集节点状态(需在故障转移群集管理器中运行)
    Get-ClusterNode | Select-Object Name, State
    # 检查群集网络通信
    Test-Cluster -Node "Node1", "Node2" -Include "Network"
    • 正常状态:所有节点状态为 Up,网络延迟 < 1ms。

  2. 检查数据库同步条件

    -- 确保数据库处于完整恢复模式且已备份
    SELECT name, recovery_model_desc, log_reuse_wait_desc 
    FROM sys.databases 
    WHERE name = 'MyDB';
  3. 排查端点配置

    -- 检查数据库镜像端点状态
    SELECT name, role_desc, state_desc 
    FROM sys.database_mirroring_endpoints;

解决方案
步骤 1:修复 WSFC 群集配置
  1. 重新验证群集配置

    # 运行群集验证工具
    Test-Cluster -Node Node1, Node2 -Include "Storage", "Inventory", "Network"
    • 修复所有验证报告中标记的警告或错误(如存储路径权限、网络隔离)。

  2. 重启群集服务

    Stop-Cluster -Cluster SQLCluster -Force
    Start-Cluster -Cluster SQLCluster
步骤 2:配置 Always On 可用性组
  1. 启用 Always On 功能

    -- 启用 Always On 可用性组
    EXEC sys.sp_configure 'hadr enabled', 1;
    RECONFIGURE;
    • 重启 SQL Server 实例以生效。

  2. 创建可用性组端点

    CREATE ENDPOINT HadrEndpoint 
    STATE = STARTED
    AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING (ROLE = ALL);
  3. 初始化可用性组

    -- 通过向导或脚本创建可用性组
    CREATE AVAILABILITY GROUP AG_MyDB
    WITH (
        AUTOMATED_BACKUP_PREFERENCE = PRIMARY,
        FAILURE_CONDITION_LEVEL = 3
    )
    FOR DATABASE MyDB
    REPLICA ON 
        'Node1' WITH (ENDPOINT_URL = 'TCP://Node1:5022', FAILOVER_MODE = AUTOMATIC),
        'Node2' WITH (ENDPOINT_URL = 'TCP://Node2:5022', FAILOVER_MODE = AUTOMATIC);
步骤 3:同步数据库并验证
  1. 备份与还原数据库

    -- 主节点执行完整备份
    BACKUP DATABASE MyDB TO DISK = '\\SharedPath\MyDB.bak' WITH INIT;
    -- 辅助节点还原(需指定 NORECOVERY)
    RESTORE DATABASE MyDB FROM DISK = '\\SharedPath\MyDB.bak' WITH NORECOVERY;
  2. 将数据库加入可用性组

    ALTER AVAILABILITY GROUP AG_MyDB ADD DATABASE MyDB;

验证与日志分析
  1. 检查可用性组状态

    SELECT 
        ag.name AS AGName,
        ar.replica_server_name AS Replica,
        drs.database_id,
        drs.synchronization_state_desc AS SyncState
    FROM sys.availability_groups ag
    JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
    JOIN sys.dm_hadr_database_replica_states drs ON ar.replica_id = drs.replica_id;
  2. 分析错误日志

    • 群集日志路径

      C:\Windows\Cluster\Reports\ValidationReport.html
    • SQL Server 错误日志

      C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Log\ERRORLOG
    • 搜索关键词 HadrTransportManager::HandleSecEnvError(安全通信失败)或 Failed to join the database


扩展场景:跨子网延迟问题
  • 错误示例The connection timeout period elapsed

  • 解决方案

    1. 调整可用性组超时设置

      ALTER AVAILABILITY GROUP AG_MyDB 
      SET (HEALTH_CHECK_TIMEOUT = 60000);  -- 单位:毫秒
    2. 配置多子网侦听器

      ALTER AVAILABILITY GROUP AG_MyDB 
      MODIFY LISTENER 'AG_Listener' (
          ADD IP ('192.168.1.100/24', '255.255.255.0'),
          ADD IP ('10.0.0.100/24', '255.255.255.0')
      );

安全加固建议
  1. 启用传输加密

    ALTER ENDPOINT HadrEndpoint 
    FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE DBMirrorCert);
  2. 限制端点访问

    New-NetFirewallRule -DisplayName "HADR-Port" -Direction Inbound -Protocol TCP -LocalPort 5022 -RemoteAddress 192.168.1.0/24 -Action Allow

通过以上步骤,可解决 Always On 可用性组配置中的典型问题。若部署在云环境(如 Azure VM),需确保负载均衡器规则允许 HADR 端口(5022)通信,并配置适当的探测机制。生产环境中建议定期执行故障转移演练并监控同步延迟。

猜你喜欢

转载自blog.csdn.net/u012263104/article/details/146987981
今日推荐