Write-Ahead Logging (WAL) ve Shadow Paging Nedir?

Veritabanlarının Atomicity ve Durability'yi nasıl sağladığını anlamak için bu iki temel tekniği detaylıca inceleyelim. Bu teknikler, bir transaction sırasında sistem çökerse verilerin nasıl kurtarılacağını belirleyen mekanizmalardır.


1. Write-Ahead Logging (WAL) - Önden Yazmalı Günlük

Mantık

WAL'ın temel prensibi şudur: Veri değişiklikleri asıl veritabanına yazılmadan ÖNCE, bir günlük (log) dosyasına kaydedilmelidir.

Düşünün ki bir defteriniz var (ana veritabanı) ve bir de not defteriniz (WAL log). Önce not defterine "Ali'nin hesabından 100 TL düşülecek" yazıyorsunuz, sonra asıl defterde işlemi yapıyorsunuz. Eğer işlem sırasında elektrik kesilirse, not defterine bakarak kaldığınız yerden devam edebilirsiniz.

Teknik Çalışma Prensibi

WAL şu adımlarla çalışır:

  1. Transaction Başlar: Bir UPDATE sorgusu çalıştırıldığında, veritabanı hemen asıl veri dosyasını değiştirmez.
  2. Log'a Yazılır: Değişiklikle ilgili bilgiler (hangi tablo, hangi satır, eski değer, yeni değer) WAL dosyasına yazılır.
  3. Log Diske Yazılır (Flush): Log kaydının fiziksel olarak diske yazıldığından emin olunur.
  4. Commit Onayı: Kullanıcıya "İşlem başarılı" mesajı döndürülür.
  5. Asıl Veritabanına Yazma (Arka planda): Daha sonra, uygun bir zamanda (checkpoint mekanizmasıyla), bu değişiklikler asıl veri dosyalarına işlenir.

WAL'ın Avantajları

  • Çökme Kurtarma (Crash Recovery): Sistem çökerse, başlatılırken WAL okunur. Commit edilmiş ama asıl veritabanına yazılmamış işlemler tekrar uygulanır (REDO). Commit edilmemiş işlemler geri alınır (UNDO).
  • Performans: Her küçük değişiklikte asıl veritabanı dosyasını güncellemek yerine, sadece hızlıca log'a yazmak daha verimlidir. Asıl güncellemeler toplu olarak yapılabilir.
  • Point-in-Time Recovery: WAL sayesinde veritabanını geçmişteki herhangi bir ana geri yükleyebilirsiniz.

Görselleştirme

Transaction Başlar
    ↓
[WAL'a yaz] ---> "Ali: 100TL çekildi, Veli: 100TL eklendi" (Commit kaydı)
    ↓
Disk'e yazma onayı alınır
    ↓
Kullanıcıya "Başarılı" mesajı
    ↓
--- Zaman geçer ---
    ↓
(Arka planda) Asıl veritabanı dosyaları güncellenir

PostgreSQL'de WAL

PostgreSQL'de WAL dosyaları genellikle pg_wal dizininde bulunur. Aşağıdaki komutla WAL durumunu görebilirsiniz:

-- WAL durumunu kontrol et
SELECT * FROM pg_stat_wal;

-- Checkpoint bilgilerini gör
SHOW checkpoint_completion_target;

2. Shadow Paging (Gölge Sayfalama)

Mantık

Shadow Paging, WAL'dan tamamen farklı bir yaklaşımdır. Değişiklikleri log'a yazmak yerine, veritabanının bir "gölge kopyasını" oluşturur.

Düşünün ki bir kitabınız var. Bir sayfayı değiştirmek istiyorsunuz. O sayfanın fotokopisini çekiyorsunuz (gölge sayfa), fotokopi üzerinde değişiklikleri yapıyorsunuz. İşlem tamamlandığında, eski sayfayı yırtıp yeni fotokopiyi kitaba ekliyorsunuz (pointer'ı güncelliyorsunuz).

Teknik Çalışma Prensibi

Shadow Paging şu adımlarla çalışır:

  1. Veritabanı Sayfalara Bölünür: Veritabanı sabit boyutlu "sayfalar" (pages) olarak düzenlenir. Bir dizin (page table) hangi sayfanın nerede olduğunu gösterir.
  2. Gölge Sayfa Oluşturulur: Bir transaction başladığında, mevcut sayfa tablosunun bir kopyası (shadow page table) oluşturulur.
  3. Değişiklikler Gölge Sayfada Yapılır: Güncellenecek sayfaların kopyaları alınır ve değişiklikler bu kopyalar üzerinde yapılır. Shadow page table, bu yeni sayfaları gösterir.
  4. Commit Anı: Transaction başarılı olursa, shadow page table aniden "aktif" hale getirilir. Bu genellikle disk üzerinde tek bir işlemle (pointer'ı güncellemek) yapılır.
  5. Eski Sayfalar: Eski sayfalar artık kullanılmaz ve zamanla silinir (garbage collection).

Shadow Paging'in Avantajları ve Dezavantajları

Avantajlar:

  • Basit Kurtarma: Commit edilmemiş bir transaction varsa, sadece shadow page table'ı silersiniz, eski haline dönersiniz. UNDO log'una gerek yoktur.
  • Log Tutmaz: WAL'daki gibi ayrı bir log dosyası yönetimi gerektirmez.

Dezavantajlar:

  • Sayfa Parçalanması: Sık güncellemeler veritabanının parçalanmasına yol açar.
  • Garbage Collection: Eski sayfaların temizlenmesi ek yük getirir.
  • Concurrency: Birden fazla transaction aynı anda çalıştığında yönetimi zordur.

Hangi Veritabanları Kullanır?

  • WAL: PostgreSQL, MySQL (InnoDB), Oracle, SQL Server (Transaction Log olarak)
  • Shadow Paging: İlk SQLite sürümleri, bazı embedded veritabanları. Modern büyük ölçekli veritabanları genellikle WAL'ı tercih eder.

WAL vs Shadow Paging - Karşılaştırma

Özellik Write-Ahead Logging (WAL) Shadow Paging
Çalışma Prensibi Değişiklikleri log'a yaz, sonra asıl veriye uygula Değişiklikleri kopya sayfalarda yap, commit'te pointer'ı değiştir
Disk Yazma Her transaction'da log'a yaz, asıl veriye toplu yazma Değiştirilen her sayfa için yeni sayfa yaz
Kurtarma Hızı Log okunarak REDO/UNDO yapılır (orta) Anlık (sadece pointer değişir)
Concurrency Yönetimi Kolay (çoğu modern DB burada iyi) Zor
Veri Bütünlüğü Çok yüksek Yüksek
Kullanım PostgreSQL, MySQL, Oracle, SQL Server SQLite (eski), CouchDB

Pratik Örnek: PostgreSQL'de WAL'i Gözlemlemek

PostgreSQL'de WAL'in nasıl çalıştığını basit bir örnekle görelim:

-- 1. WAL hakkında bilgi alalım
SELECT name, setting, unit 
FROM pg_settings 
WHERE name LIKE '%wal%';

-- 2. Mevcut WAL durumu
SELECT * FROM pg_stat_wal;

-- 3. Bir transaction çalıştıralım
BEGIN;
UPDATE hesaplar SET bakiye = bakiye - 100 WHERE id = 1;
-- Bu noktada değişiklik sadece WAL'da ve buffer'da, asıl dosyada değil!

-- 4. Commit yapalım
COMMIT;
-- Şimdi WAL'a "bu transaction başarıyla tamamlandı" yazıldı
-- Ama asıl veri dosyası hala güncellenmemiş olabilir!

-- 5. Checkpoint bekleyelim veya zorla checkpoint yapalım
CHECKPOINT;
-- Bu noktada WAL'daki değişiklikler asıl veri dosyasına yazıldı

Sonuç

WAL, modern veritabanlarının kalbidir. Hem Atomicity (ROLLBACK için UNDO bilgisi) hem de Durability (COMMIT sonrası REDO bilgisi) sağlar. Bir veritabanı seçerken veya performans ayarları yaparken, WAL mekanizmasının nasıl çalıştığını anlamak kritik öneme sahiptir.

Shadow Paging ise daha çok akademik bir ilgi alanıdır ve belirli niş durumlarda (örneğin, çok hızlı recovery gereken embedded sistemler) tercih edilir.

Her iki teknik de aynı amaca hizmet eder: Sistem çökse bile verinizin güvende olduğundan emin olmak.