dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbooks Library/sqlserver/#31
Runbook #31
sqlserver
ReplicationSEV1 · CRITICAL OUTAGE15-30 dakika / 15-30 minssysadmin / CONTROL SERVER / VIEW SERVER STATE

SQL Server Always On Lag: Log Send and Redo Queues

Diagnoses log-send and redo queues separately and distinguishes network failures, suspended data movement and slow secondaries.

Related Metrics:M32
Related Scripts:S51
#always-on#availability-group#redo#rpo

Operational Safety & Risk Notice

This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Symptom & Signals

- M32'de `log_send_queue_size` veya `redo_queue_size` (KB) sürekli büyüyor; `NOT SYNCHRONIZING`, `NOT SYNCHRONIZED`, `SUSPENDED` veya bağlantı hatası görülüyor.

- Secondary okuma verisi eski, failover hazırlığı bozulmuş; senkron modda commit gecikebilir.

2. Business & Technical Impact

- **Asenkron modda:** Gönderilmemiş log birikimi failover sırasında veri kaybı (RPO) riski yaratır.

- **Senkron modda:** Bağlı/senkron secondary ack bekleme uygulama gecikmesi yaratabilir; senkron değilse otomatik failover beklentisi karşılanmaz. Redo kuyruğu okunabilir secondary'de eski veri ve uzun kurtarma süresi doğurabilir.

3. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. Primary üzerinde S51 ile replika ve veritabanı durumunu kontrol edin (SQL Server 2012+; AG altyapısı gerektirir):
sql
SELECT ag.name AS ag_name, ar.replica_server_name,
       ar.availability_mode_desc, ars.connected_state_desc,
       DB_NAME(drs.database_id) AS db_name,
       drs.is_local,
       drs.synchronization_state_desc, drs.synchronization_health_desc,
       drs.is_suspended, drs.suspend_reason_desc,
       drs.log_send_queue_size AS send_kb, drs.log_send_rate AS send_kb_per_sec,
       drs.redo_queue_size AS redo_kb, drs.redo_rate AS redo_kb_per_sec,
       drs.last_commit_time
FROM sys.dm_hadr_database_replica_states AS drs
JOIN sys.availability_replicas AS ar ON ar.replica_id = drs.replica_id
JOIN sys.availability_groups AS ag ON ag.group_id = drs.group_id
LEFT JOIN sys.dm_hadr_availability_replica_states AS ars ON ars.replica_id = ar.replica_id
ORDER BY ag.name, ar.replica_server_name, db_name;

`DB_NAME(drs.database_id)` yerel instance bağlamında gösterilir; remote satırların database_id eşleşmesini ve görünürlüğünü karşı tarafta doğrulayın. Sürüm/yetki farklarında alanlar değişebilir.

🟢 Read-Only2. **Send kuyruğu yüksek:** Primary → secondary ağ, endpoint/auth, secondary erişilebilirliği ve log gönderim hızını inceleyin. **Redo kuyruğu yüksek:** Secondary disk I/O, CPU ve ağır read-only sorguları inceleyin.
🟢 Read-Only3. `is_suspended = 1` ise `suspend_reason_desc` nedenini kaydedin; SQL Server error log ve Windows cluster olaylarına bakın. Kuyruk *baytları* tek başına gecikme süresi değildir; `queue_kb / NULLIF(rate_kb_per_sec,0)` yalnızca değişken hızlarda kaba tahmindir.

4. Remediation & Action Plan

🟡 Reversible1. Ağ/endpoint veya secondary disk baskısını giderin; ikincil sunucudaki yoğun raporlama sorgularını başka yere yönlendirin.
🟡 Reversible2. Neden giderildi ve veri hareketi askıya alınmışsa **yalnızca ilgili secondary/veritabanında** resume edin (yer tutucuyu değiştirin):
sql
ALTER DATABASE [OrnekDb] SET HADR RESUME;

Önce durumun gerçekten `SUSPENDED` olduğunu ve uygulanacak replika/DB'yi doğrulayın.

🔴 HIGH RISK / IRREVERSIBLE3. Replika senkronize değilken sırf alarmı susturmak için **zorunlu failover** yapmayın; veri kaybı olabilir. Otomatik failover yalnızca uygun senkron sağlık/cluster koşullarında beklenir. Gerekirse ayrı, onaylı DR/failover planını işletin.

4. **Kalıcı çözüm:** Send/redo kuyruklarını ve senkronizasyon sağlığını ayrı alarmlayın; secondary depolamasını primary yazma hızına uygun tutun.

5. Verification & Health Checks

- `is_suspended = 0`, `connected_state_desc = CONNECTED`; uygun modda durum `SYNCHRONIZED`/`SYNCHRONIZING`.

- Kuyrukların eğilimi düşüyor, M32 normale dönüyor; secondary okuma gecikmesi ve (varsa) senkron commit süreleri iyileşti.

6. Rollback & Contingency Plan

- `SET HADR RESUME` sonrasında veri hareketini tekrar askıya almak (`SET HADR SUSPEND`) gecikmeyi artırır; yalnızca güvenlik/kurtarma nedeni varsa ayrı karar verin.

- Altyapı/yönlendirme değişikliklerini önceki ayarlara döndürün; **olası veri kaybı yaşanmış failover geri alınabilir bir ayar değildir.**

More SQLSERVER Runbooks