修正后的完整查询
bash
SELECT
ar.replica_server_name AS [副本名称],
ar.availability_mode_desc AS [同步模式],
DB_NAME(dbr.database_id) AS [数据库名称],
dbr.database_state_desc AS [数据库状态],
dbr.synchronization_state_desc AS [同步状态],
dbr.synchronization_health_desc AS [同步健康状态],
ISNULL(
CASE dbr.redo_rate
WHEN 0 THEN -1
ELSE CAST(dbr.redo_queue_size AS FLOAT) / dbr.redo_rate
END,
-1
) AS [Redo延迟(秒)],
ISNULL(
CASE dbr.log_send_rate
WHEN 0 THEN -1
ELSE CAST(dbr.log_send_queue_size AS FLOAT) / dbr.log_send_rate
END,
-1
) AS [Log传送延迟(秒)],
dbr.redo_queue_size AS [Redo等待队列(KB)],
dbr.redo_rate AS [Redo速率(KB/S)],
dbr.log_send_queue_size AS [Log传送等待队列(KB)],
dbr.log_send_rate AS [Log传送速率(KB/S)] -- 修正反斜杠为斜杠
FROM
master.sys.availability_replicas AS ar
INNER JOIN
master.sys.dm_hadr_database_replica_states AS dbr -- 补全表名
ON ar.replica_id = dbr.replica_id -- 添加关联条件
AND ar.group_id = dbr.group_id; -- 按可用性组关联
SQL 查询数据详解及监控用途
以下 SQL 查询用于获取 SQL Server AlwaysOn 可用性组中数据库副本的详细状态和性能指标。这些数据非常适合用于实时监控和高可用性环境的健康检查。
可查询的关键数据及监控用途
字段名 | 数据来源 | 监控用途 |
---|---|---|
副本名称 | sys.availability_replicas |
标识每个副本的服务器名称,用于区分主副本和辅助副本。 |
同步模式 | sys.availability_replicas |
显示副本的同步模式: ✅ SYNCHRONOUS_COMMIT (同步提交) ⏳ ASYNCHRONOUS_COMMIT (异步提交)。 |
数据库名称 | sys.dm_hadr_database_replica_states |
标识可用性组中的具体数据库,用于定位问题数据库。 |
数据库状态 | sys.dm_hadr_database_replica_states |
监控数据库是否在线(ONLINE )或处于恢复中(RESTORING )。 |
同步状态 | sys.dm_hadr_database_replica_states |
判断数据同步是否正常: ✅ SYNCHRONIZED (已同步) ⚠️ SYNCHRONIZING (同步中) ❌ NOT SYNCHRONIZING (未同步)。 |
同步健康状态 | sys.dm_hadr_database_replica_states |
健康状态分级: ✅ HEALTHY (健康) ⚠️ PARTIALLY_HEALTHY (部分健康) ❌ NOT_HEALTHY (异常)。 |
Redo延迟(秒) | 计算字段(redo_queue_size / redo_rate ) |
辅助副本应用日志的预计耗时。 阈值建议:>30 秒需检查辅助副本性能。 |
Log传送延迟(秒) | 计算字段(log_send_queue_size / log_send_rate ) |
主副本发送日志到辅助副本的耗时。 阈值建议:>10 秒需优化网络带宽。 |
Redo等待队列(KB) | sys.dm_hadr_database_replica_states |
辅助副本待应用的日志量。 阈值建议:>100,000 KB 需排查磁盘 I/O。 |
Redo速率(KB/S) | sys.dm_hadr_database_replica_states |
辅助副本每秒应用的日志量。 阈值建议:<500 KB/S 表示性能不足。 |
Log传送等待队列(KB) | sys.dm_hadr_database_replica_states |
主副本待发送的日志量。 阈值建议:>50,000 KB 需检查主副本负载或网络。 |
Log传送速率(KB/S) | sys.dm_hadr_database_replica_states |
主副本每秒发送的日志量。 阈值建议:<1,000 KB/S 需优化网络或启用压缩。 |
监控场景示例
1. 实时同步状态仪表盘
将查询结果集成到 Grafana 或 Power BI 中,生成以下可视化图表:
• 同步健康状态 :用红/黄/绿颜色标记各副本状态。
• 延迟趋势图 :展示 Redo延迟
和 Log传送延迟
的历史变化。
• 队列积压热力图 :按数据库和副本显示 Redo等待队列
和 Log传送队列
。
2. 自动化告警
通过 Zabbix 或 Prometheus 设置警报规则:
yaml
# Prometheus 警报规则示例
- alert: HighRedoLatency
expr: redo_latency_seconds > 30
annotations:
summary: "高 Redo 延迟 ({{ $value }}秒)"
description: "副本 {{ $labels.replica }} 的数据库 {{ $labels.database }} Redo 延迟过高!"
- alert: LogSendQueueOverflow
expr: log_send_queue_kb > 50000
annotations:
summary: "Log 传送队列积压"
description: "主副本的 Log 传送队列积压 {{ $value }} KB,需立即处理!"
3. 日常巡检报告
使用 PowerShell 或 Python 定时运行查询并生成 CSV/Excel 报告:
powershell
# PowerShell 脚本示例
$query = @"
SELECT [副本名称], [同步模式], [数据库名称], [同步健康状态], [Redo延迟(秒)]
FROM (...完整查询...)
"@
Invoke-SqlCmd -Query $query -ServerInstance "YourServer" | Export-Csv -Path "AlwaysOn_Report_$(Get-Date -Format 'yyyyMMdd').csv"
权限要求
• 最低权限 :VIEW SERVER STATE
(允许查询动态管理视图)。
• 推荐权限 :CONTROL AVAILABILITY GROUP
(可结合故障转移操作)。
总结
通过这些 SQL 查询,您可以监控以下核心内容:
- 同步健康性 :快速发现
NOT_HEALTHY
状态并介入处理。 - 延迟与性能 :定位网络瓶颈(高
Log传送延迟
)或副本性能问题(低Redo速率
)。 - 队列积压:预警数据同步滞后风险,防止故障转移时数据丢失。
建议将查询集成到自动化监控系统中,并定期优化阈值规则,以保障 AlwaysOn 环境的稳定性和高可用性。