SQL Server "Transaction log is full" — Hangi Nedenle Doldu?
9002 hatasında log_reuse_wait_desc çıktısını okumak, LOG_BACKUP / ACTIVE_TRANSACTION / AVAILABILITY_REPLICA nedenlerine göre ayrı çözümler ve VLF yönetimi.
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
The transaction log for database 'uygulama_db' is full due to 'LOG_BACKUP'.Tırnak içindeki ifade tanının kendisidir. Aynı hata yedi farklı nedenle oluşur ve her birinin çözümü farklıdır. Log'u rastgele büyütmek genellikle yanlış cevaptır; asıl soru "log neden truncate edilemiyor" sorusudur.
▸Nedeni ayırt eden tek sorgu
SELECT name, log_reuse_wait_desc, recovery_model_desc
FROM sys.databases
WHERE name = 'uygulama_db';log_reuse_wait_desc | Anlamı | Doğru Çözüm |
|---|---|---|
LOG_BACKUP | FULL modelde log yedeği alınmıyor | Log yedeği al + SQL Agent ile zamanla |
ACTIVE_TRANSACTION | Uzun süren açık transaction var | İşlemi bul, bitir veya sonlandır (KILL) |
AVAILABILITY_REPLICA | Always On ikincili log'u almıyor | Replica ağını ve redo kuyruğunu düzelt |
REPLICATION | Dağıtım ajanı (Transactional Rep) geride | Log Reader ajanını kontrol et |
OLDEST_PAGE | Dolaylı checkpoint / AG beklemesi | Checkpoint ve I/O hızını kontrol et |
NOTHING | Log truncate edilebilir durumda | Dosya sisteminde yer yok; DBCC SQLPERF kontrolü |
▸Adım adım çözüm
1. Doluluk oranını ölçün.
DBCC SQLPERF(LOGSPACE);
SELECT name, size / 128.0 AS boyut_mb, physical_name
FROM sys.database_files
WHERE type = 1;2. `LOG_BACKUP` ise: Acil log yedeği alın.
BACKUP LOG uygulama_db TO DISK = N'D:\Backup\uygulama_log.trn' WITH COMPRESSION, CHECKSUM;Bu komut log'u derhal truncate edilebilir hale getirir. Kalıcı çözüm: 5–15 dakikada bir çalışan bir log yedekleme işi (SQL Server Agent Job). Point-in-Time Recovery ihtiyacı yoksa FULL modelde kalmak gereksizdir:
ALTER DATABASE uygulama_db SET RECOVERY SIMPLE;3. `ACTIVE_TRANSACTION` ise: Log'u tutan açık işlemi bulun.
SELECT t.session_id,
t.transaction_begin_time,
DATEDIFF(MINUTE, t.transaction_begin_time, GETDATE()) AS dakika,
dt.database_transaction_log_bytes_used / 1048576 AS log_mb,
txt.text
FROM sys.dm_tran_active_transactions t
JOIN sys.dm_tran_database_transactions dt
ON dt.transaction_id = t.transaction_id
JOIN sys.dm_tran_session_transactions st
ON st.transaction_id = t.transaction_id
OUTER APPLY sys.dm_exec_sql_text(
(SELECT sql_handle FROM sys.dm_exec_requests WHERE session_id = st.session_id)
) txt
WHERE dt.database_id = DB_ID('uygulama_db')
ORDER BY log_mb DESC;transaction_begin_time dakikalar öncesini gösteriyorsa, uygulama BEGIN TRAN açıp COMMIT etmiyordur. Oturum tespit edilip sonlandırılmalıdır.
4. `AVAILABILITY_REPLICA` ise: Always On ikincilin log kuyruğuna bakın.
SELECT ag.name, drs.database_id,
drs.log_send_queue_size / 1024 AS gonderim_kuyrugu_mb,
drs.redo_queue_size / 1024 AS redo_kuyrugu_mb,
drs.synchronization_state_desc
FROM sys.dm_hadr_database_replica_states drs
JOIN sys.availability_groups ag ON ag.group_id = drs.group_id;log_send_queue_size sürekli büyüyorsa ağ bant genişliği veya ikincil diski yetmiyordur.
5. VLF sayısını kontrol edin. Log çok sayıda küçük sanal log dosyasına (VLF) bölünmüşse hem log büyümesi hem de crash recovery felç olur:
SELECT COUNT(*) AS vlf_sayisi
FROM sys.dm_db_log_info(DB_ID('uygulama_db')); -- SQL Server 2016 SP2+1000'in üzeri sorun işaretidir. Çözüm: log'u bir kez yeterli boyuta sabit büyütmek (ör. 8 GB, FILEGROWTH = 512MB), sonra sürekli küçültmemektir.
▸Bunu bir daha yaşamamak için
log_reuse_wait_desc değerini saatlik olarak toplayıp NOTHING dışındaki durumlar için alarm kurun. Bu metrik, log dolmadan saatler önce yaklaşan krizi haber verir.
- •İlgili Hata: SQL Server 1205 Deadlock Kurbanı
- •İlgili Hata: SQL Server Bağlantı Havuzu Zaman Aşımı
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
SQL Server Error 18456: State Kodlarına Göre Gerçek Neden
18456 hatasında State numarası gerçek nedeni söyler. State 5, 8, 11, 18, 38 ve 40 için ayrı çözümler, ERRORLOG okuma komutları.
SQL Server Error 1205 Deadlock: Grafiği Bulma ve Önleme
SQL Server 1205 hatasında deadlock grafiğini system_health oturumundan çıkarma, kurban seçimini anlama ve kalıcı önleme yöntemleri.
SQL Server Pool Timeout: Bağlantı Havuzu Tükenmesi Çözümü
"Timeout expired prior to obtaining a connection from the pool" hatasının komut zaman aşımından farkı, sızıntı tespiti ve .NET tarafında kalıcı düzeltme.