DBAtlas · 데이터베이스 운영 아틀라스

Availability Group 상태와 지연 모니터링 (log send / redo queue, 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;

하는 일

replica 연결 및 동기화 상태를 보여 준다. 데이터베이스별로 log send queue, redo queue, 전송/redo 속도, 예상 redo 따라잡기 시간, primary와의 마지막 커밋 차이(잠재적 데이터 손실 구간)를 보여 주며 WSFC quorum 상태도 반환한다.

사용 시점

AG 대시보드에 NOT_HEALTHY / NOT SYNCHRONIZING 알림이 뜰 때, 계획된 페일오버 전 RPO/RTO를 확인할 때, 또는 사용자가 읽기 가능 secondary에서 오래된 데이터를 보고할 때.

주의

증가하는 log_send_queue는 primary 장애 시 손실되는 로그 양(RPO)이고, 증가하는 redo_queue는 페일오버 후 데이터베이스가 온라인이 되기까지 걸리는 시간(RTO)이다. secondary에서는 로컬 replica만 보이므로 전체 상황은 primary에서 실행한다. data_loss_window_s는 쓰기 트래픽이 있을 때만 의미가 있다. 읽기 전용 쿼리이며 안전함.

DBAtlas에서 열기 →

관련 항목