DBAtlas · Атлас эксплуатации баз данных

Мониторинг состояния и отставания группы доступности (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;

Что делает

Показывает состояние подключения и синхронизации реплик; для каждой базы — очередь отправки журнала, очередь redo, скорости отправки/redo, оценку времени догона redo и разрыв последней фиксации относительно первичной реплики (окно потенциальной потери данных); также возвращает состояние кворума WSFC.

Когда использовать

При оповещении NOT_HEALTHY / NOT SYNCHRONIZING на панели AG, при проверке RPO/RTO перед плановой отработкой отказа или когда пользователи видят устаревшие данные на читаемой вторичной реплике.

Внимание

Растущая log_send_queue — это объём журнала, теряемый при сбое первичной реплики (RPO); растущая redo_queue — сколько времени база будет переходить в онлайн после отработки отказа (RTO). На вторичной реплике видна только локальная реплика; для полной картины запускайте на первичной. data_loss_window_s имеет смысл только при наличии записи. Запрос только на чтение; безопасно.

Открыть в DBAtlas →

Связанные материалы