Database, hourglass and a broken arrow to a disk, representing SQL Server delayed durability and log flush

SQL Server Delayed Durability: Daha Hızlı Commit, Gerçek Veri Kaybı Riski

SQL Server delayed durability’nin commit’i log diske yazılmadan nasıl döndürdüğü, nasıl açıldığı, veri kaybı riskinin ne zaman kabul edilebilir olduğu ve WRITELOG için önce neyin düzeltilmesi gerektiği.

Aralık 22, 2021

SQL Server’da bir transaction commit edildiğinde, istemciye “tamamlandı” yanıtı ancak transaction log kaydı diske yazıldıktan sonra döner. Bu bekleme, verinin sunucu çökse bile kaybolmamasını garanti eder; ama log diski yavaşsa ya da uygulama çok sayıda küçük transaction gönderiyorsa, her commit’in bu yazmayı beklemesi performansın darboğazı olur ve WRITELOG beklemeleri tavan yapar.

Delayed durability, SQL Server 2014 ile gelen ve bu bekleyişi atlayan bir seçenektir: commit, log diske yazılmadan önce başarılı döner. Kazanç gerçek olabilir; ama bedeli de gerçektir: sunucu çökerse son commit edilen transaction’lar kaybolabilir. Bu yazıda nasıl çalıştığını, ne zaman kabul edilebilir olduğunu ve önce denenmesi gereken alternatifleri anlatıyoruz.

SQL Server Performans Danışmanlığı

WRITELOG beklemeleri mi yaşıyorsunuz?

Aryasoft, log yazma darboğazının kaynağını disk, transaction tasarımı ve yapılandırma düzeyinde bulur; veri güvenliğinden ödün vermeden çözer.

Destek Alın

Nasıl Çalışır?

Delayed durable bir transaction commit edildiğinde log kayıtları önce bellekteki log buffer’da kalır. Buffer diske şu durumlarda yazılır:

  • Log buffer dolduğunda.
  • Aynı veritabanında tam dayanıklı (fully durable) bir transaction commit edildiğinde.
  • sys.sp_flush_log çağrıldığında.
  • SQL Server düzgün şekilde kapatıldığında.

Bu arada sunucu beklenmedik şekilde kapanırsa (güç kesintisi, işletim sistemi çökmesi, sürecin sonlandırılması), buffer’daki log kayıtları kaybolur ve uygulamanın “commit edildi” diye bildiği transaction’lar geri gelmez.

Kritik

Delayed durability açıkken, sunucunun beklenmedik kapanmasında son commit edilen transaction’lar kaybolabilir. Kayıp miktarı log buffer’daki veriyle sınırlıdır ama sıfır değildir. Finansal hareketler, sipariş, ödeme ve stok gibi kaybedilmesi kabul edilemeyecek veriler için kullanılmamalıdır.

Nasıl Açılır?

Ayar veritabanı düzeyinde üç değer alır:

-- DISABLED: varsayılan, tüm commit'ler tam dayanıklı
-- ALLOWED : her transaction kendi seçimini yapabilir
-- FORCED  : tüm commit'ler delayed durable
ALTER DATABASE StagingDB SET DELAYED_DURABILITY = ALLOWED;

-- ALLOWED iken transaction düzeyinde seçim
BEGIN TRAN;
    INSERT INTO dbo.YuklemeLog (Kaynak, Satir) VALUES (N'ERP', 1500);
COMMIT TRAN WITH (DELAYED_DURABILITY = ON);

-- Kritik bir noktada bekleyen log kayıtlarını diske yaz
EXEC sys.sp_flush_log;

Mevcut durumu kontrol etmek için:

SELECT name, delayed_durability_desc
FROM sys.databases
WHERE delayed_durability_desc <> N'DISABLED';

Ne Zaman Kabul Edilebilir?

  • Yeniden üretilebilir veriler: Kaynaktan yeniden yüklenebilen staging ve ETL ara tabloları.
  • Kaybı tolere edilebilen kayıtlar: Ayrıntılı uygulama logları, telemetri ya da tıklama verileri.
  • Toplu yüklemeler: Yarıda kalırsa baştan çalıştırılabilen yükleme işleri.

Kısıtlar: delayed durability, çapraz veritabanı ve dağıtık (distributed) transaction’larda geçerli değildir; bunlar her zaman tam dayanıklıdır. Always On ortamında, primary’nin beklenmedik kapanmasında henüz secondary’ye gönderilmemiş delayed durable transaction’lar kaybolabilir.

Önce Bunları Deneyin

Delayed durability’ye geçmeden önce log yazma darboğazının nedenini bulun:

  • Log diskinin gecikmesi: Log yazmaları için birkaç milisaniyenin üzerindeki gecikmeler doğrudan commit süresine yansır. Log dosyasını hızlı ve ayrı bir diske taşımak çoğu zaman sorunu kökten çözer.
  • Çok küçük transaction’lar: Döngü içinde satır satır insert ve her satırda commit, binlerce ayrı log yazması demektir. İşlemleri makul büyüklükte gruplara toplayıp tek commit ile yapmak, aynı kazancı veri kaybı riski olmadan sağlar.
  • Gereksiz log üretimi: Büyük güncellemelerde değişmeyen kolonları güncellemek ya da gereksiz index’ler log hacmini artırır.
-- Log yazma gecikmesi (ms) ve WRITELOG beklemeleri
SELECT DB_NAME(vfs.database_id) AS database_name,
       vfs.io_stall_write_ms / NULLIF(vfs.num_of_writes, 0) AS avg_write_ms
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs
JOIN sys.master_files AS mf ON mf.database_id = vfs.database_id AND mf.file_id = vfs.file_id
WHERE mf.type_desc = N'LOG'
ORDER BY avg_write_ms DESC;

SELECT wait_type, waiting_tasks_count, wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type = N'WRITELOG';

İpucu

Satır satır commit eden bir yükleme işini 1.000’er satırlık transaction’lara bölmek, delayed durability ile elde edilecek kazancın büyük kısmını hiçbir veri kaybı riski olmadan sağlar. Disk ve transaction tasarımını düzelttikten sonra hâlâ ihtiyaç varsa, delayed durability’yi yalnızca kaybı kabul edilebilir veritabanlarında ve ALLOWED modunda, hedefli transaction’lar için kullanın.

Kontrol Listesi

  • WRITELOG beklemeleri ve log diski gecikmesi ölçüldü.
  • Log dosyası hızlı ve ayrı bir diskte.
  • Küçük transaction’lar mümkün olduğunca gruplandı.
  • Delayed durability yalnızca kaybı kabul edilebilir verilerde ve iş birimi onayıyla kullanılıyor.
  • FORCED mod kritik veritabanlarında kullanılmıyor.
Commit’in, log kaydı diske yazılmadan önce başarılı dönmesini sağlayan bir veritabanı seçeneğidir. Log yazma beklemesini azaltır ama sunucu beklenmedik şekilde kapanırsa son transaction’lar kaybolabilir.
Evet, sunucunun beklenmedik kapanmasında log buffer’da bekleyen ve henüz diske yazılmamış commit’ler kaybolabilir.
Yeniden üretilebilir staging ve ETL verilerinde, kaybı tolere edilebilen log ve telemetri kayıtlarında. Finansal ve kritik iş verilerinde kullanılmamalıdır.
Önce log diskinin gecikmesini düşürün ve küçük transaction’ları gruplandırın. Delayed durability ancak bunlardan sonra ve yalnızca uygun verilerde değerlendirilmelidir.

SQL Server Performans Danışmanlığı

Hızı veri güvenliğinden ödün vermeden kazanın

Aryasoft’un kıdemli DBA ekibi log yazma darboğazının kaynağını disk, transaction tasarımı ve yapılandırma düzeyinde bulur; önce güvenli iyileştirmeleri uygular, gerekiyorsa delayed durability’yi yalnızca uygun verilerde kontrollü şekilde devreye alır.

4.7/5