Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Transaction Log (İşlem Günlüğü) Dosyasını Okuma
#1
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.
 
tlog1.png

Tablomuzun üç sütunu bulunmaktadır: ID, FirstName, and LastName.
 
tlog2.png

Şimdi SQL script editor’ü kullanarak fn_dblog işlevini çağıralım.
 
tlog3.png

Boş tabloda 461 satır oluşturulduğunu görüyorsunuz. İşlem kütüğünü görmek için:
 
tlog4.png

İş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.
 
tlog5.png

Şimdi işlem günlüğüne bir bakalım:
 
tlog6.png

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 (Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.)
Türkçe’ye çeviren: 27 Aralık 2018, C. Sunguray
Orijinal makale: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Türkçe Makale PDF biçiminde: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#2
Hocam resimler görünmüyor bende mi sıkıntı var acaba
Cevapla
#3
Teşekkürler
Cevapla
#4
(28-12-2018, Saat: 01:07)FiRewaLL Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Hocam resimler görünmüyor bende mi sıkıntı var acaba

Resimleri bir türlü makaleye yerleştiremedim En sonunda orijinal kaynağından linkle yerleştirdim. Bu durumda da bazen görünmüyor. Düzeltmeye çalışıyorum.
WWW
Cevapla
#5
(28-12-2018, Saat: 09:14)csunguray Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(28-12-2018, Saat: 01:07)FiRewaLL Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Hocam resimler görünmüyor bende mi sıkıntı var acaba

Resimleri bir türlü makaleye yerleştiremedim En sonunda orijinal kaynağından linkle yerleştirdim. Bu durumda da bazen görünmüyor. Düzeltmeye çalışıyorum.

@csunguray, değerli bilgiler için teşekkür ederim. 
Not: Resimleri DelphiCan sunucumuza taşıdım.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#6
(28-12-2018, Saat: 09:45)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(28-12-2018, Saat: 09:14)csunguray Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Resimleri bir türlü makaleye yerleştiremedim En sonunda orijinal kaynağından linkle yerleştirdim. Bu durumda da bazen görünmüyor. Düzeltmeye çalışıyorum.

@csunguray, değerli bilgiler için teşekkür ederim. 
Not: Resimleri DelphiCan sunucumuza taşıdım.

Elinize sağlık...
WWW
Cevapla
#7
@csunguray emeğinize sağlık.
There's no place like 127.0.0.1
WWW
Cevapla
#8
Çok Teşekkürler , Elinize emeğinize sağlık .
Çok güzel bir anlatım olmuş.
Cevapla
#9
Teşekkürler.
Cevapla
#10
Ben de teşekkür ederim. Umarım arkadaşlarımıza yardımı olur.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Windows registry çoklu dize (multi string) değeri okuma ve yazma sabanakman 0 452 21-11-2018, Saat: 13:27
Son Yorum: sabanakman
  İşlem Süresinin Bulunması witalihakko 4 1.098 22-09-2018, Saat: 18:36
Son Yorum: Bay_Y



Konuyu Okuyanlar: 1 Ziyaretçi