Database Checkpoint Nedir

2 Eki by NURULLAH ÇAKIR

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

4 Comments

  1. 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 ve daha sonra buffer cache’de değişiklik yapılırsa diske yazılır.

    Burayı anlamıyorum. İlk cümle ve diğer cümleler arasında kopukluk var ya da ben kopuyorum. Birinde okunma demiş sonra yazma olmuş.

    1. Aslında bahsettiğiniz kısımda verilerin diske yazılması sürecini anlattım.

      İlk etapta bahsettiğim “SQL Server’da veriler direkt olarak diskten okunmaz.” kısmını giriş olarak kullandım.

      çünkü verilerin diske yazılma sürecinden önce verilerin memory’ye nasıl geldiğinden bahsetmek istedim.

      Bir örnekle açıklayım.

      Bir transaction açtınız bir veriyi select ettiniz. Select ettiğiniz verinin memory’de olmadığını farzedelim.

      Bu yüzden öncelikle veri diskten memory’e aktarılır. Daha sonra memory’den okunur.

      Memory’den okunan veriyi daha sonra update ettiğinizi düşünelim. Update ettiğinizde, log cache’de yaptığınız değişiklikle ilgili bir kayıt oluşur.

      Daha sonra makalede belirttiğim log flush gerçekleşir.

      Burda asıl anlatmak istediğim konu, veri ldf dosyasına yazılmadan(log flush) data dosyalarına yazılma işleminin(page flushing) gerçekleşmeyeceği. SQL Server WAL(Write Ahead Log) mekanizması

  2. Merhaba,
    Siteni yeni farkettim.
    Yazıların çok anlaşılır. Anlatım tarzın çok iyi. Tebrik ederim.
    Umarım devamı gelir.
    İyi Çalışmalar

    1. Teşekkür ederim. Şu ana kadar bir dba’in bilmesi gereken çoğu konuyu yazdık. Bundan sonraki makaleler karşılaşılan hatalar üzerine olacak. Kısa bir süre sonra devamı gelecek.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir