SQL Server Transaction Log Architecture – Part II

Bir önceki makalede transaction log mimarisine basit bir giriş yapmıştık. Bu makalede ise, transaction log file ın iç yapısını inceleyeceğiz.

Yeni bir veri tabanı oluşturduğumuzda ya da yeni bir log file eklediğimizde özellikle bir ilk boyut değeri belirtmezsek, log file için varsayılan olarak 0.5MB ya da data fileların toplamının 25%’i oranında boyut belirlenir. Örnek vermek gerekirse, 500GB’lık bir data file oluşturursak, elimizde 125GB büyüklüğünde bir log file olacaktır. Best practice olan Windows IFI aktif olsa bile, transaction log file bu mekanizmayı kullanmadığı için Windows, NTFS File System üzerinde 125GB’lık bir file oluşturur, içerisi 0 (sıfır) ile doldurulur ve tahsisat işlemi bittikten sonra bu file SQL Server’a teslim edilir. 125GB’lık file ın oluşturulması ne kadar sürerse, log file ekleme işlemi de o kadar sürecektir. Bu sebeple, log fileların başlangıç ve büyüme değerleri gözlemlenerek belirlenmeli ve atanmalıdır.

0 (sıfır) ile doldurulma işlemini normal şartlarda görüntülemeyiz, fakat gözlemlemek için 3605 ve 3004 numaralı trace flagleri aktif edebiliriz. Böylece SQL Server loglarında ilgili entryleri görebiliriz. Ayrıca 0 (sıfır) ile doldurma işlemi esnasında ASYNC_IO_COMPLETION wait type’ı da gözlemlenebilir. Eğer wait typeları aktif olarak monitör ediyorsak bu wait type ın sahip olduğu değerleri incelemek de faydalı olacaktır.

Transaction log file mantıksal olarak, belirli bir dizi halinde bölünmüş virtual log filelardan (VLF) oluşmaktadır. Bunun sebebi ise, SQL Server log yönetimin kolaylaştırılması ihtiyacıdır.

Yeni bir veri tabanı ya da yeni bir log file oluşturduğumuzu düşünelim. Yukarıdaki 0 (sıfır) ile doldurma vs. işlemleri tamamlandıktan sonra log file kendi içerisinde VLFlere bölünür. Eğer veri tabanı oluşturma işlemi gerçekleşiyorsa, ilk VLF aktif olarak işaretlenecektir, bunun nedeni veri tabanının logging işlemi için en az bir aktif VLF e ihtiyaç duymasıdır. Bu durum haricinde yeni eklenen log file içerisindeki VLFler pasif ve kullanım dışı olarak işaretlidir. Dipnot olarak belirtmekte fayda var, VLFler ya aktif ya da pasif durumda olabilirler. Transaction log file ın başlangıcında, bu log file a ait metadata, file size ve büyüme oranları vb. bilgilerin yer aldığı 8KB büyüklüğünde file header page yer almaktadır.

Peki yeni bir log file eklendiğinde kaç VLF’e ayrılıyor:

  • 64MB ve altındaki boyutlar için 4 yeni VLF
  • 64MB-1GB aralığındaki boyutlar için 8 yeni VLF
  • 1GB ve üstü boyutlar için 16 yeni VLF oluşturulur. Bilinmesi gereken diğer bir önemli nokta ise, VLF boyutları ve sayıları, tamamen SQL Server’a ait olmakla birlikte, tarafımızca değiştirilemektedir.

VLFler, benzersiz ve sıralı bir numaraya sahiptir. Her yeni VLF aktif olduğunda numara artarak devam etmektedir. Bir VLF içeriği dolduğunda, yeni bir VLF aktif olarak işaretlenecekse, en küçük sıra numarasına sahip olan VLF den başlanır ve sırayla devam eder. Yeni bir veri tabanı için VLF sıra numarası 1’den başlamayacaktır, bunun nedeni ise 1’in model system veri tabanına ait olmasıdır. Her zaman 1+ şeklinde artarak devam etmektedir.

VLF içerisinde VLF header bulunmaktadır. Header şu bilgileri içermektedir:

  • VLF’in aktif olup olmadığı
  • Log sequence number (log sıra numarası)
  • 512byte lık blocklar için geçerli parity bilgisi

VLFler, transaction log fileların iç yapısını oluştururken, log blocklar da VLFlerin iç yapısını oluşturmaktadır. VLFlerin içinde, değişken boyutlara sahip log blocklar mevcuttur. Log blockların minimum boyutu 512byte iken maksimum boyutu 60KB’tır. Log blocklar artışa ihtiyaç duyduğunda her seferinde 512byte lık artışla maksimum 60KB a kadar büyüme gerçekleştirebilirler.

Log blocklar ise, log kayıtlarından meydana gelmektedir. Log kayıtları, log blocklarda yazıldığı sırayla saklanır ve data file pagelere benzer bir yapıya sahiptir. Her log kaydı, yine log VLFlerde olduğu gibi sıralı ve benzersiz bir sıra numarasına sahiptir, buna Log Sequence Number (LSN) denmektedir.

Log kaydının sahip olduğu sıra numarası yani LSN, ait olduğu log blockun numarası, kendi sıra numarası ve yine ait olduğu VLF in sıra numarasının birleşiminden oluşmaktadır. Formülüze etmek gerekirse:

LSN = [VLF sequence number (4byte)] : [Log block number (4byte)] : [Log record number (2byte)]

LSN, birçok konuda büyük önem taşımaktadır. Backup, restore, recovery, data file vs.

Örnek vermek gerekirse her data file page’de yer alan header bölümünde, kendisine flush edilen en sonra LSN bilgisi yer almaktadır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir