PostgreSQL Logical Decoding (WAL Decoding)

Rıdvan Korkmaz

Bu yazıda PostgreSQL’de WAL dosyalarından, veritabanında çalıştırılmış SQL’leri bind değerleri ile birlikte nasıl elde edebileceğimizi inceleyeceğiz. Veritabanında yapılan yanlış DELETE, UPDATE, INSERT işlemleri bu yöntem ile WAL dosyalarından çıkarılarak, hatalı işlemler geri alınabilirler. Logical Decoding özelliği PostgreSQL’e 11 sürümü ile gelmiştir.

WAL dosyalarını inceleyebilmek için öncelikle bir replikasyon slotu oluşturmamız gereklidir.

Slot ismi log_decode, çıktılar için test_decoding plug-in’i kullanıyoruz, false ile slot’un kalıcı olması gerektiğini belirtiyoruz. Bu fonksiyon bize slot’un başladığı LSN’i ve slot ismini geri döner.

Slot’a ait bilgileri görelim.

Aşağıdaki sorgu ile slot üzerinden okuma yapmaya başlayabiliriz. Birinci parametresi slot adı, ikinci parametre (NULL verilmiş) upto_lsn, üçüncü parametre (NULL) upto_nchanges değerlerini ifade eder. Ancak bu iki parametre için NULL verilirse slot oluştuğundan güncel ana kadar olan değişiklikleri görebiliriz. Özel bir zaman aralığı veya belli sayıda değişiklik istenirse bu parametrelere değer verilebilir.  Gerçek ortam veritabanında sorgu sonucunda veriler anında sorgudan döner. Ancak test ortamında DML yapılıncaya kadar sorgu boş sonuç döner.

Örnek bir tablo oluşturalım. DDL’ler replikasyona dahil olmadığından üstteki sorgu hala boş sonuç döner.

Şimdi tabloya kayıt ekleyip silelim ve durumu inceleyelim.

Yeniden slot’u sorgulayalım ve yaptığımız değişiklikleri görelim.

Sorguyu yeniden çalıştırdığımızda boş döndüğünü görürüz. Bunun nedeni, biz bu sorgu ile değişiklileri tüketen noktadayız (queue consumer). Son sorgumuzdan sonra değişiklik yoksa, sorgu sonucu boş gelir.

Eğer sorgulayınca sonuçların kalmasını istersek, farklı bir fonksiyonu aşağıdaki gibi kullanabiliriz. Şimdi bir kayıt daha ekleyelim ve sonuçlar kaybolmayacak şekilde sorgulayalım.

Yeniden sorgulayınca kayıtlar hala mevcut haldedir.

Fazla DML yapılan veritabanlarında çok fazla kayıt geleceği için sorgu sonucunu tabloya çıkarıp o tablo üzerinde işlemlere devam edilebilir. Çünkü her defasında WAL dosyalarından sonuçları çıkarıp göstermesi zaman alacaktır.

Yorum yapın