dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/sqlserver-9002-transaction-log-full
SQL Server
MSSQL 2017 - 2022Depolama & Log
6 dk okuma
Msg 9002: The transaction log for database is full

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.

İnceleyen:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: SQL Server 2017 / 2019 / 2022
İlk 60 Saniye Teşhis Protokolü:

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

plaintext
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

sql
SELECT name, log_reuse_wait_desc, recovery_model_desc FROM sys.databases WHERE name = 'uygulama_db';
log_reuse_wait_descAnlamıDoğru Çözüm
LOG_BACKUPFULL modelde log yedeği alınmıyorLog yedeği al + SQL Agent ile zamanla
ACTIVE_TRANSACTIONUzun süren açık transaction varİşlemi bul, bitir veya sonlandır (KILL)
AVAILABILITY_REPLICAAlways On ikincili log'u almıyorReplica ağını ve redo kuyruğunu düzelt
REPLICATIONDağıtım ajanı (Transactional Rep) gerideLog Reader ajanını kontrol et
OLDEST_PAGEDolaylı checkpoint / AG beklemesiCheckpoint ve I/O hızını kontrol et
NOTHINGLog truncate edilebilir durumdaDosya sisteminde yer yok; DBCC SQLPERF kontrolü

▸Adım adım çözüm

1. Doluluk oranını ölçün.

sql
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.

sql
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:

sql
ALTER DATABASE uygulama_db SET RECOVERY SIMPLE;

3. `ACTIVE_TRANSACTION` ise: Log'u tutan açık işlemi bulun.

sql
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.

sql
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:

sql
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.

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (20)