问题现象:
配置 Always On 可用性组时,报错 “无法将数据库加入可用性组”(错误 41158
),或提示 “WSFC 群集资源无法联机”(错误 19471
)。
快速诊断
-
验证 WSFC 群集状态:
# 检查群集节点状态(需在故障转移群集管理器中运行) Get-ClusterNode | Select-Object Name, State # 检查群集网络通信 Test-Cluster -Node "Node1", "Node2" -Include "Network"
-
正常状态:所有节点状态为
Up
,网络延迟 < 1ms。
-
-
检查数据库同步条件:
-- 确保数据库处于完整恢复模式且已备份 SELECT name, recovery_model_desc, log_reuse_wait_desc FROM sys.databases WHERE name = 'MyDB';
-
排查端点配置:
-- 检查数据库镜像端点状态 SELECT name, role_desc, state_desc FROM sys.database_mirroring_endpoints;
解决方案
步骤 1:修复 WSFC 群集配置
-
重新验证群集配置:
# 运行群集验证工具 Test-Cluster -Node Node1, Node2 -Include "Storage", "Inventory", "Network"
-
修复所有验证报告中标记的警告或错误(如存储路径权限、网络隔离)。
-
-
重启群集服务:
Stop-Cluster -Cluster SQLCluster -Force Start-Cluster -Cluster SQLCluster
步骤 2:配置 Always On 可用性组
-
启用 Always On 功能:
-- 启用 Always On 可用性组 EXEC sys.sp_configure 'hadr enabled', 1; RECONFIGURE;
-
重启 SQL Server 实例以生效。
-
-
创建可用性组端点:
CREATE ENDPOINT HadrEndpoint STATE = STARTED AS TCP (LISTENER_PORT = 5022) FOR DATABASE_MIRRORING (ROLE = ALL);
-
初始化可用性组:
-- 通过向导或脚本创建可用性组 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:同步数据库并验证
-
备份与还原数据库:
-- 主节点执行完整备份 BACKUP DATABASE MyDB TO DISK = '\\SharedPath\MyDB.bak' WITH INIT; -- 辅助节点还原(需指定 NORECOVERY) RESTORE DATABASE MyDB FROM DISK = '\\SharedPath\MyDB.bak' WITH NORECOVERY;
-
将数据库加入可用性组:
ALTER AVAILABILITY GROUP AG_MyDB ADD DATABASE MyDB;
验证与日志分析
-
检查可用性组状态:
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;
-
分析错误日志:
-
群集日志路径:
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
-
解决方案:
-
调整可用性组超时设置:
ALTER AVAILABILITY GROUP AG_MyDB SET (HEALTH_CHECK_TIMEOUT = 60000); -- 单位:毫秒
-
配置多子网侦听器:
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') );
-
安全加固建议
-
启用传输加密:
ALTER ENDPOINT HadrEndpoint FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE DBMirrorCert);
-
限制端点访问:
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)通信,并配置适当的探测机制。生产环境中建议定期执行故障转移演练并监控同步延迟。