27-12-2018, Saat: 22:20
(Son Düzenleme: 28-12-2018, Saat: 09:44, Düzenleyen: TescilsizUzman.)
SQL SERVER – Transaction Log (İşlem Günlüğü) Dosyasını Okuma (Giriş)
Bu yazıda “İşlem Günlüğü” (ing. Transaction Log) dosyasının ne olduğunu, bu dosyaya neden ihtiyaç duyduğumuzu ve bu işlemlerin nasıl çalıştığını gözden geçireceğiz.İşlem Günlüğü’ne Bakış:
SQL Server işlem günlüğü belki de SQL Server mimarisinin en anlaşılmayan bölümüdür. Aynı zamanda işlem günlüğü her veri tabanının en önemli bölümlerinden biridir.
Tüm SQL Server veri tabanları tüm işlemlerin ve bu işlemler tarafından yapılan tüm değişikliklerin kaydedilmesi için bir işlem günlüğüne (ing. transaction log) sahiptir. Bir sistem çökmesi durumunda veri tabanını bir önceki tutarlı durumuna döndürmek için işlem günlüğü içerisindeki bilgilere ihtiyaç duyarız. Bu nedenle işlem günlüğü hiç bir zaman silinmemeli veya devre dışı bırakılmamalıdır.
İşlem Günlüğü’nün Amacı:
Öncelikle ACID kavramını gözden geçirelim. Atomiklik (ing. atomicity), tutarlılık (ing. consistency), yalıtım (ing. Isolation) ve dayanıklılık (ing. durability) verilerin veri tabanına güvenilir bir şekilde kaydedilmesini garanti eden özelliklerdir. İşlem günlüğü bize dayanıklılık konusunda yardımcı olur ve yapılan işlemlerin kalıcı hale gelmesini garanti altına alır. Dayanıklılık, yapılan veri tabanı işlemleri tam olarak onaylanmadan önce kalıcı bir depolama alanına kaydedilmesiyle elde edilir. Bu da onaylanmamış işlemlerin sabit diskte depolanması gerektiği anlamına gelir. Değişiklikler (onaylanmamış işlemler) yalnızca veri tabanı sunucusunun belleğinde tutuluyor olsaydı bir elektrik kesintisi yaşadığınızda, sunucu yeniden başlatıldıktan sonra yapmış olduğunuz değişikliklerin kaydedilmediğini görürdünüz. Bu nedenle, kullandığınız uygulamaya “başarılı” mesajı göndermeden önce tüm değişikliklerin diske yazılması gerekir.
SQL Server, satırları veri dosyamızın herhangi bir yerindeki 8 KB’lik sayfalar (ing. page) halinde depolar. Bir sayfa yüksek sayıda (yaklaşık 400 satır) veri satırı (ing. row) içerebilir. Sayfa, veri tabanında okuma/yazma yapılabilen en küçük birimdir. Bir sayfadaki tek bir satırı değiştirirseniz bu satırın bulunduğu 8 KB’lik sayfa bütün olarak diske yeniden yazılacaktır.
Bir işlemde 100 satır güncellediğiniz zaman bu satırların farklı data dosyalarında bulunabileceğiniz göz önünde bulundurmalıyız.
Bu durumda bir okuma/yazma işlemi için sabit disk kafasının uygun pozisyona konumlanması, disklerin dönmesi, bilginin diske yazılması ve yeni okuma/yazma işlemi için aynı işlemin tekrar etmesi gerekir.
İşlem günlüğü ise asıl veri dosyasındaki rasgele erişimin (ing. random access) tersine kayıtların sıralı (ing. sequantial) yazıldığı bir dosyadır. İşlem günlüğüne veri yazılırken bir seferde 8 KB’lik bir sayfa veri yerine sabit diske 512 byte uzunluğundaki bir sektörlük bilgi yazar.
Sabit disklerde en küçük yazma işlemi bir disk sektörüne denk gelir. Disk sektörü, sürücüdeki fiziksel bir sektördür. Sabit sürücülerin çoğunda bir sektörün uzunluğu 512 byte’tır.
Buna dayanarak, SQL Server'ın tek bir küçük yazma işlemi için günlük dosyasına 512 byte yazacağı sonucuna varabiliriz.
İşlem günlüğü sıralı (ing. sequential) olduğundan, değişikliği yazmak için disk kafasının bir sonraki konuma geçmesini beklemeniz gerekmez. Bir sonraki pozisyon zaten disk kafasının o anda olduğu yerdedir. Bu durum değişikliklerin diske çok hızlı bir şekilde yazılabileceği anlamına gelir.
İşlem günlüğündeki değişiklikleri yazarken, veri sayfasının bellekteki sürümü de güncellenir. Daha sonra da Lazy Writer sistemi (geçici bellekteki bilgileri sabit diske yazan süreç) devreye girecek ve bu veri sayfalarını diske yazacaktır. Elektrik kesintisi olursa, bellekteki tüm veri sayfaları kaybolur. Ancak elimizde veri tabanında gerçekleşen tüm değişikliklerin bir kaydı kalır.
İşlem Günlüğünü Okuma:
Şimdi SQL Server’ın işlemleri nasıl sakladığına ve işlem günlüğünde ne gibi bilgiler depolandığına bakalım.
İşlem günlüğünü okumak için fn_dblog işlevi (ing. function) kullanılır. Bu işlev SQL Server belgelerinde yer almayan işlevlerden biridir.
İşlem günlüğündeki her bir kayıt tekil olan kütük sıra numarası (log squence number – LSN) bilgisiyle tanımlanır. Eğer LSNn+1, LSNn ‘den büyükse LSNn+1 ile gerçekleşen değişiklik LSNn ile gerçekleşen değişiklikten sonra gerçekleşmiş demektir.
fn_dblog işlevi iki parametre ile çağrılır:
- Birinci parametre başlangıç sıra numarası (LSN)’dır. Bu parametreyi NULL olarak da belirtebilirsiniz. NULL parametresi günlüğün en baştan itibaren okunacağını belirtir.
- İkinci parametre bitiş sıra numarası (LSN)’dır. Bu parametreyi NULL olarak da belirtebilirsiniz. NULL parametresi günlüğün en sona kadar okunacağını belirtir.
Test amaçlı olarak bir veri tabanı ve tablo oluşturalım.
Management Studio ile bu işlemi kolaylıkla yapabiliriz. SQL Server'a bir bağlantı kurduktan sonra, bağlantıyı sağ tıklayın ve ardından New Database (Yeni Veri tabanı) seçeneğini tıklayın. Database designer (Veri tabanı tasarımcısı) görünecektir. Tasarımcı penceresinde veri tabanı adını girin (Biz ViewTransactionLog kullanacağız) ve Update Database düğmesine tıklayın. Hepsi bu kadar. Bir tablo oluşturmak için, nesne ağacındaki database maddesini genişletin. Table klasörünü sağ tıklatın ve ardından New Table (Yeni Tablo) seçeneğini tıklatın.
Tablomuzun üç sütunu bulunmaktadır: ID, FirstName, and LastName.
Şimdi SQL script editor’ü kullanarak fn_dblog işlevini çağıralım.
Boş tabloda 461 satır oluşturulduğunu görüyorsunuz. İşlem kütüğünü görmek için:
İşlem Adı sütununun veri tabanı adını içerdiğine dikkat edin. Bu değer yalnızca Operation sütunundaki değer "LOP_BEGIN_XACT" (işlem başlangıcı anlamına gelir) ile başladığında görünür. Operation sütunu, SQL Server tarafından gerçekleştirilen işlemin ne olduğunu gösterir (insert, update, delete, shrink, lock, page allocation vb.) .
Şimdi çeşitli veri işleme komutları (ing. DML) çalıştırarak bu komutların işlem günlüğündeki etkilerini gözleyelim.
Şimdi işlem günlüğüne bir bakalım:
Günlüğün ilk satırını aşağıdaki gibi yorumlayabiliriz:
- INSERT deyimi ID 0000:00000a80 işlem numarası ile gerçekleşmiştir.
- 2014/10/10 tarihinde saat 10:44:52:273’te başlamıştır.
- ‘dbo.Person’ tablosuna INSERT komutuyla yeni bir satır eklenmiştir. Bu satır veri tabanındaki ID’si 0000011d:00000140 olan sayfaya yazılmıştır.
- 2014/10/10 tarihinde saat 10:44:52:273’te sonlanmıştır.
Sonuç:
Gördüğünüz gibi işlem günlüğü veri tabanında gerçekleşen değişikliklerin bir listesidir. İşlem günlüğü aynı zamanda bu değişikliklerin/işlemlerin tekrar edilebilmesini de sağlar.
Veri tabanının tam bir yedeğini (ing. full backup) alır ve işlem günlüğünü kopyalarsanız veri tabanını sağlam olduğu gelecek bir zamana geri döndürene kadar veri tabanındaki tüm işlemleri tekrar edebilirsiniz.
Örneğin yanlışlıkla bir tablo’yu sildiğinizde veri tabanını silme zamanının hemen öncesindeki bir zamana veya belli bir LSN’ye alarak verileri kurtarabilirsiniz.
Yazar: 15 Ekim 2014, Pinal Dave (https://blog.sqlauthority.com/author/pinaldave/)
Türkçe’ye çeviren: 27 Aralık 2018, C. Sunguray
Orijinal makale: https://blog.sqlauthority.com/2014/10/15...-log-file/
Türkçe Makale PDF biçiminde: https://drive.google.com/file/d/1AqffYuR...sp=sharing