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 环境的稳定性和高可用性。

相关推荐
启明真纳40 分钟前
PostgreSQL 单库备份
数据库·postgresql
Amd7941 小时前
PostgreSQL备份不是复制文件?物理vs逻辑咋选?误删还能精准恢复到1分钟前?
数据库·postgresql
wzg20161 小时前
pyqt5 简易入门教程
开发语言·数据库·qt
你是狒狒吗4 小时前
为什么mysql要有主从复制,主库,从库这种东西
数据库·mysql
倔强的石头1067 小时前
【金仓数据库】ksql 指南(一) 连接本地 KingbaseES 数据库与基础交互
数据库·oracle·kingbasees·金仓数据库·ksql
卷Java11 小时前
违规通知功能修改说明
java·数据库·微信小程序·uni-app
养生技术人12 小时前
Oracle OCP认证考试题目详解082系列第54题
数据库·sql·oracle·运维开发·database·开闭原则·ocp
数据知道13 小时前
Go基础:用Go语言操作MongoDB详解
服务器·开发语言·数据库·后端·mongodb·golang·go语言
爱喝白开水a13 小时前
2025时序数据库选型,从架构基因到AI赋能来解析
开发语言·数据库·人工智能·架构·langchain·transformer·时序数据库