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

相关推荐
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G1 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备1 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远1 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren1 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安1 天前
MySQL-触发器
数据库·mysql
白远山1 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro1 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理
2603_965148111 天前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘