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

SQL Server Transaction Log Full (Error 9002): Find the Cause and Fix Safely

Uses log_reuse_wait_desc to find why the log cannot be truncated and fixes it by cause: log backup, open transaction, replica or replication. Avoids the "switch to SIMPLE and shrink" mistake.

Related Metrics:M30M33
Related Scripts:S59S49S46
#transaction-log#error-9002#log-reuse#backup

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

- `Error 9002: The transaction log for database 'X' is full due to 'LOG_BACKUP'` (veya başka neden).

- Yazma işlemleri başarısız; M30 %90 üzeri.

2. Business & Technical Impact

İlgili veritabanında **yazmalar durur**, okumalar sürer. Uygulama yazma hataları verir.

3. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. **Neden nedir?** (S59):
sql
SELECT name, recovery_model_desc, log_reuse_wait_desc FROM sys.databases WHERE name = 'X';
SELECT used_log_space_in_percent, total_log_size_in_bytes/1048576 AS log_mb
FROM sys.dm_db_log_space_usage;   -- ilgili veritabanı bağlamında
🟢 Read-Only2. `log_reuse_wait_desc` değerine göre:
DeğerAnlamıÇözüm
`LOG_BACKUP`FULL recovery'de log yedeği alınmıyorLog yedeği alın
`ACTIVE_TRANSACTION`Uzun/açık transactionTransaction'ı bulun (S49)
`AVAILABILITY_REPLICA`Always On replika gerideReplikayı kontrol edin
`REPLICATION`Log reader agent geride/durmuşReplikasyon agent'ını düzeltin
`DATABASE_MIRRORING`Mirror gerideMirror durumunu kontrol edin
`CHECKPOINT`Henüz checkpoint olmamış`CHECKPOINT;`
`NOTHING`Sorun yok / alan başka nedenle doluDisk dolu mu kontrol edin
🟢 Read-Only3. Disk dolu mu? Log dosyası otomatik büyüyemiyor olabilir (disk yok veya `MAXSIZE`).
🟢 Read-Only4. Son log yedeği ne zaman alındı (S46)? Yedek job'ı sessizce mi başarısız oldu?

4. Remediation & Action Plan

1. **`LOG_BACKUP` ise (en sık):** Log yedeği alın. Disk için yer gerekiyorsa yedeği başka bir sürücüye alın:

sql
BACKUP LOG [X] TO DISK = N'E:\Yedek\X_log.trn';

Yedek sonrası log kullanımı boşalır (dosya boyutu küçülmez, sadece içi boşalır).

2. **`ACTIVE_TRANSACTION` ise:** Transaction'ı bulun ve sonlandırın (rollback uzun sürebilir):

sql
DBCC OPENTRAN('X');
KILL <spid>;

3. **`AVAILABILITY_REPLICA` ise:** Replika bağlantısını/erişilebilirliğini düzeltin. Replika çok uzun süre kopuksa log şişer; dayanılmaz hale gelirse replikayı AG'den çıkarmayı değerlendirin.

🔴 HIGH RISK / IRREVERSIBLE4. **Disk tamamen dolduysa:** Logu başka bir sürücüye geçici ek dosya olarak ekleyin:
sql
ALTER DATABASE [X] ADD LOG FILE
 (NAME = X_log2, FILENAME = N'F:\Log\X_log2.ldf', SIZE = 8GB, FILEGROWTH = 1GB);
🔴 HIGH RISK / IRREVERSIBLE5. **Yapmayın (FULL recovery'de):** `SIMPLE` recovery'ye geçip `DBCC SHRINKFILE` yapmak **log zincirini kırar**, point-in-time recovery imkanını kaybettirir. Yalnızca veri kaybını göze alıyor ve yeni full yedek alacaksanız düşünün.

6. **Kalıcı çözüm:**

- Log yedek job'ını sık çalıştırın (RPO'ya göre 5-15 dk) ve başarısızlığını izleyin (M33).

- Log dosyasını doğru boyutlayın, sabit MB cinsinden `FILEGROWTH` verin (yüzde değil), VLF sayısını kontrol edin.

- Toplu işleri küçük batch'lere bölün.

5. Verification & Health Checks

- `log_reuse_wait_desc = NOTHING` ve `used_log_space_in_percent` normal.

- Yazmalar başarılı, uygulama hataları durdu.

- Log yedek zinciri sağlam (`msdb.dbo.backupset` ardışık LSN).

6. Rollback & Contingency Plan

- Geçici ek log dosyasını işiniz bitince kaldırın: önce `DBCC SHRINKFILE (X_log2, EMPTYFILE)` sonra `ALTER DATABASE ... REMOVE FILE X_log2`.

- `KILL` ve `SIMPLE` geçişi geri alınamaz (zincir kopar).

More SQLSERVER Runbooks