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

相关推荐
wmm_会飞的@鱼1 分钟前
FlexSim-汽车零部件仓库布局优化与仿真
服务器·前端·网络·数据库·数学建模·汽车
Antonio9154 分钟前
【Redis】Redis 数据存储原理和结构
数据库·redis·缓存
看天走路吃雪糕26 分钟前
墨者:SQL手工注入漏洞测试(MySQL数据库)
数据库·mysql·sql注入·墨者靶场
看天走路吃雪糕35 分钟前
墨者:通过手工解决SQL手工注入漏洞测试(PostgreSQL数据库)
数据库·sql·postgresql·sql注入·墨者靶场
看天走路吃雪糕1 小时前
墨者:SQL注入漏洞测试(布尔盲注)
数据库·sql·sqlmap·墨者学院·布尔盲注
*愿风载尘*1 小时前
ksql连接数据库免输入密码交互
数据库·后端
追风少年浪子彦1 小时前
mybatis-plus实体类主键生成策略
java·数据库·spring·mybatis·mybatis-plus
溟洵1 小时前
Qt 窗口 工具栏QToolBar、状态栏StatusBar
开发语言·前端·数据库·c++·后端·qt
problc2 小时前
大模型API和秘钥获取地址
数据库·redis·缓存
Antonio9152 小时前
【Redis】Linux 配置Redis
linux·数据库·redis