SQL Server AlwaysOn (SQL 查询数据详解及监控用途)

修正后的完整查询

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. 实时同步状态仪表盘

将查询结果集成到 GrafanaPower BI 中,生成以下可视化图表:

同步健康状态 :用红/黄/绿颜色标记各副本状态。

延迟趋势图 :展示 Redo延迟Log传送延迟 的历史变化。

队列积压热力图 :按数据库和副本显示 Redo等待队列Log传送队列

2. 自动化告警

通过 ZabbixPrometheus 设置警报规则:

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. 日常巡检报告

使用 PowerShellPython 定时运行查询并生成 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 查询,您可以监控以下核心内容:

  1. 同步健康性 :快速发现 NOT_HEALTHY 状态并介入处理。
  2. 延迟与性能 :定位网络瓶颈(高 Log传送延迟)或副本性能问题(低 Redo速率)。
  3. 队列积压:预警数据同步滞后风险,防止故障转移时数据丢失。

建议将查询集成到自动化监控系统中,并定期优化阈值规则,以保障 AlwaysOn 环境的稳定性和高可用性。

相关推荐
陆少枫1 分钟前
MySQL基础关键_007_DQL 练习
数据库·mysql
千月落2 小时前
ClickHouse副本集群
服务器·数据库·clickhouse
jjkkzzzz2 小时前
Mysql常用语句汇总
数据库·mysql
找不到、了2 小时前
聊聊对Mysql的理解
数据库·mysql
kngines2 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.2 数据类型转换(CAST函数/自定义函数)
数据库·postgresql·数据分析·filter·自定义函数·cte
半桶水专家4 小时前
使用frpc链接内网的mysql
数据库·mysql·adb
264玫瑰资源库4 小时前
网狐旗舰大联盟组件源码私测笔记:结构分层、UI重构与本地实操全流程
java·前端·数据库·笔记·ui·重构
KaiwuDB5 小时前
KaiwuDB X 遨博智能 | 构建智能产线监测管理新系统
大数据·数据库·kaiwudb·分布式多模数据库
程序猿不脱发25 小时前
mysql中int(1) 和 int(10) 有什么区别?
数据库·mysql
Themberfue6 小时前
Redis ⑨-Jedis | Spring Redis
java·数据库·redis·sql·spring·缓存