可用性グループの正常性と遅延を監視する (log send / redo キュー、RPO)
SQL ServerAlways On と HAコマンド
-- Replica health (run on the primary to see all replicas):
SELECT ag.name AS ag_name, ar.replica_server_name, ars.role_desc,
ar.availability_mode_desc, ar.failover_mode_desc,
ars.connected_state_desc, ars.synchronization_health_desc,
ars.operational_state_desc, ars.last_connect_error_description
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ar.group_id = ag.group_id
JOIN sys.dm_hadr_availability_replica_states ars ON ars.replica_id = ar.replica_id
ORDER BY ag.name, ars.role_desc;
-- Per-database lag: log send queue (RPO), redo queue (RTO):
SELECT ag.name AS ag_name, ar.replica_server_name, DB_NAME(drs.database_id) AS db,
drs.is_primary_replica, drs.synchronization_state_desc, drs.synchronization_health_desc,
drs.is_suspended, drs.suspend_reason_desc,
drs.log_send_queue_size AS log_send_queue_kb,
drs.log_send_rate AS log_send_kb_s,
drs.redo_queue_size AS redo_queue_kb,
drs.redo_rate AS redo_kb_s,
CAST(drs.redo_queue_size * 1.0 / NULLIF(drs.redo_rate, 0) AS DECIMAL(18,1)) AS est_redo_catchup_s,
drs.last_commit_time,
DATEDIFF(SECOND, drs.last_commit_time, pri.last_commit_time) AS data_loss_window_s,
drs.secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states drs
JOIN sys.availability_replicas ar ON ar.replica_id = drs.replica_id
JOIN sys.availability_groups ag ON ag.group_id = drs.group_id
LEFT JOIN sys.dm_hadr_database_replica_states pri
ON pri.group_database_id = drs.group_database_id AND pri.is_primary_replica = 1
ORDER BY ag.name, db, drs.is_primary_replica DESC;
-- WSFC quorum state:
SELECT cluster_name, quorum_type_desc, quorum_state_desc FROM sys.dm_hadr_cluster;
SELECT member_name, member_type_desc, member_state_desc, number_of_quorum_votes
FROM sys.dm_hadr_cluster_members;概要
レプリカの接続と同期の正常性を表示する。データベースごとに log send キュー、redo キュー、送信 / redo レート、redo の推定追いつき時間、プライマリとの最終コミットの差 (潜在的なデータ損失期間) を表示し、WSFC クォーラムの状態も返す。
使用する場面
AG ダッシュボードで NOT_HEALTHY / NOT SYNCHRONIZING アラートが出た場合、計画的フェイルオーバー前に RPO/RTO を確認する場合、または読み取り可能セカンダリでデータが古いとユーザーから報告された場合。
注意
log_send_queue の増加は、プライマリに障害が発生した場合に失われるログの量 (RPO) である。redo_queue の増加は、フェイルオーバー後にデータベースがオンラインになるまでの時間 (RTO) である。セカンダリではローカルレプリカのみが見えるため、全体像を把握するにはプライマリで実行する。data_loss_window_s は書き込みトラフィックがある間のみ意味を持つ。読み取り専用クエリのため安全。