Database Checkpoint Nedir

Bu makaleyi okumadan önce transaction log dosyasının önemini kavramanız gerekir. “SQL Server Transaction Log Nedir” isimli makalemi okumanızı tavsiye ederim. Bu makaleyi bir çok kişide sql server’ın çalışma prensibi ile ilgili soru işaretleri olduğu için yazmak istedim. Bu makalede sizi teoriyle biraz sıkabilirim. Ama SQL Server üzerinde derinleşmek isteyen herkesin ısrarla okumasını istediğim bir makale.

SQL Server’da veriler direkt olarak diskten okunmaz. Veriler önce diskten buffer cache’e(memory’de sql server’ın data ve index page’leri için kullandığı alan) aktarılır.

Buffer Cache’de bulunan bir verinin disk’e yazılma işlemi ise şu şekilde gerçekleşir:

Buffer cache’de değişikliğe uğramış ve henüz diske yazılmamış page’ler dirty page olarak adlandırılır.

Buffer cache’deki bir page değişikliğe uğradığında hemen diske yazılmaz. Öncelikle log cache’de(memory’de log kayıtlarının tutulduğu alan) bu değişiklikle ilgili bir kayıt oluşturulur.

Log cache’deki ilgili kayıt fiziksel olarak diske yazılmadan(ldf uzantılı transaction log dosyasına.. Bu işlem log flush olarak bilinir) buffer cache’de değişikliğe uğramış kayıt fiziksel olarak diske(mdf ya da ndf uzantılı data dosyasına) yazılmaz.  Bu olay karşımıza write ahead logging olarak çıkar. Eğer log dosyasına fiziksel olarak yazılmadan data dosyasına yazılma işlemi olsaydı her hangi bir hata sonucu server kapandığı takdirde rollback işlemi gerçekleşemezdi. SQL Server WAL(Write Ahead Log) mekanizması ile bu şekilde veri bütünlüğünü garanti altına alır.

Verilerin buffer cache’den diske yazılması page flushing olarak bilinir. Bu işlemi Lazy Writer yapar. Peki bu Lazy Writer’da nerden çıktı. SQL Server düzenli olarak kaynakları monitor eder. Ve memory üzerinde bir çekişme olduğunda Lazy Writer’ı tetikler. Ve bu şekilde buffer cache’deki dirty page’lerin diske yazılmasıyla buffer cache’de diğer session’ların kullanması için yeterli yer açılır.

Peki bu kadar şey anlattık ama checkpoint bunun neresinde?

SQL Server arka planda periyodik olarak checkpoint işlemini çalıştırır. Checkpoint’in çalışmasıyla yukarıda anlattığımız, log cache’deki kaydın ve dirty page’lerin diske yazılması işlemi gerçekleşir.(diskten okunduğundan beri ya da son checkpoint çalıştığından beri değişmiş olan kayıtların yazılması) Checkpoint manual olarak da CHEKCPOINT komutuyla da çalıştırılabilir. Ama SQL Server’ın iç işlerine karışmamanızı tavsiye ederim.

Checkpoint’in amacı veritabanı açılırken recovery süresini kısaltmaktır. Bununla ilgili bir senaryoyu “SQL Server Transaction Log Nedir” isimli makalemde anlattım.

SQL Server Sunucusunun crash olduğunu farzedelim. SQL Server yeniden açılırken recovery işlemini nasıl gerçekleştirir?

SQL Server Transaction Log Nedir” isimli makalemde LSN kavramına değindim. Bütün data page’lerin(buffer cache’e aktarılan) page header’ında(page’in metadata bilgisini tutan 96 byte’lık bir alan) bu page’i etkileyen son log dosyasının LSN bilgisi tutulur. SQL Server recover olurken(ayağa kalkarken) transaction log dosyasını kullandığını daha önce anlattım. Data page’lerin header’ında ilgili log kaydının LSN bilgisininin olması log kaydının nasıl recover olacağına(redone/roll forward veya undone/roll back) karar verilmesini sağlar. 

Basitçe hangi durumda ne gerçekleşeceğini aşağıda görebilirsiniz.

Commit edilmiş bir transaction ile alakalı bir log kaydı için;

  • Data page’in header’ında ki LSN, log kaydının LSN’ine eşit yada büyükse, bu ilgili log kaydının diske yazıldığını gösterir ve hiç bir işlem yapılmaz.
  • Data page’in header’ında ki LSN, log kaydının LSN’inden küçükse, bu ilgili log kaydının diske yazılmadığını gösterir ve redone işlemi yapılarak diske yazılması sağlanır.

Commit edilmemiş bir transaction ile alakalı bir log kaydı için;

  • Data page’in header’ında ki LSN, log kaydının LSN’ine eşit yada büyükse, ilgili log kaydının undone işlemi yapılması gerekir.(Normal şartlar altında WAL mekanizması böyle bir durumun olmamasını sağlar.)
  • Data page’in header’ında ki LSN, log kaydının LSN’inden küçükse, bu ilgili log kaydının diske yazılmadığını gösterir ve transaction commit olmadığı için hiç bir işlem yapılmaz.

WAL ile ilgili detay bilgi için aşağıdaki linkteki makaleyi okumak isteyebilirsiniz.

https://technet.microsoft.com/en-us/library/jj835093(v=sql.110).aspx

SQL Server’ın crash sonrası recovery işlemleri hakkında daha detaylı bilgi almak istiyorsanız Paul Randal’ın aşağıdaki linkteki makalesini okumak isteyebilirsiniz.

https://technet.microsoft.com/en-us/2009.02.logging

Eğer simple recovery model kullanıyorsanız checkpoint sonrasında aktif olmayan loglar truncate edilir. “Veritabanı recovery modelleri ” isimli makalemi okumak isteyebilirsiniz.

Loading