|
|
|
"Kayýt Dosyalarý (Transaction
Logs) ve Boyut Sorunu"
|
Son güncelleme tarihi: 04 Nisan 2008
Merhaba arkadaþlar,
Giriþ
SQL Server' da bir veritabaný temel olarak iki dosyadan oluþur. Bunlardan birisi
verileri tutulduðu veri dosyasýdýr. Diðeri de veri dosyasýna karþý yapýlan iþlemlerin
kayýtlarýnýn tutulduðu kayýt dosyasý (Transaction Log). Kayýt dosyasýnýn boyutu
zaman zaman veritabanýna karþý yapýlan iþlemlere göre çok þiþebilir ve bu dosyanýn
boyutunu düþürmek isteyebilirsiniz. Ýþte bu yazýmda size bu konuda bilgi vereceðim.
Veri Dosyalarý (Data Files)
Ýlk paragrafta sizlere veritabanýnýn iki temel dosyadan oluþtuðunu ve bunlardan
birisinin de veri dosyasý olduðunu söylemiþtim. Veri dosyalarýnýn uzantýlarý varsayýlan
olarak "*.mdf" tir. Fakat böyle olmak gibi bir zorunluluðu da yoktur. Bu sadece
bir standarttýr, fakat standartlara baðlý kalmak veya kendi standartlarýnýzý oluþturmak
da çok önemli bir iþlemdir.
Kayýt Dosyalarý (Transaction Files)
Diðer temel olan dosya ve esas deðinmek istediðim ise kayýt dosyasýdýr. Kayýt dosyalarýnýn
da varsayýlan uzantýsý "*.ldf" tir. Gene veri dosyalarý gibi bunlarýn da dosya uzantýlarýnýn
"*.ldf" olmasý zorunlu deðildir.
Kayýt dosyasýna birçok tip iþlem kaydedilmektedir, aþaðýdakiler bu iþlemler arasýndadýr:
- Tüm iþlemlerin baþlangýç ve bitiþi,
- INSERT, UPDATE ve DELETE gibi tüm veri deðiþiklikleri. Yani
DML (Data Manipulation Language) iþlemleri ve ayrýca DDL (Data Definition Language)
iþlemleri,
- Tüm "extent" ve "sayfa (page)" ayýrma ve kapatma iþlemleri,
- Bir tablo veya indeks oluþturma ve silme iþlemleri...
Meselâ þöyle sorular geliyor: "Bir tablom var ve çok büyük. Tablonun iskeleti gerekiyor,
ama içindeki verileri tamamen boþaltmak istiyorum. Fakat silmeye baþlayýnca kayýt
dosyamýn þiþtiðini görüyorum. Acaba grup grup mu silsem ve sonra kayýt dosyamý küçültsem
sonra ayný iþlemleri sýrasýyla tekrarlasam olur mu? Daha kolay bir yöntem yok mu?!"
Var tabii, meselâ TRUNCATE TABLE ile bir tabloyu sildiðinizde, DELETE komutundan
farklý olarak yaptýðýnýz iþlem kayýt dosyasýna kaydedilmez.
Bazý arkadaþlar ise gerek habergruplarýnda gerekse de forumlarda þöyle sorular soruyorlar:
"Veritabanýmda indeksleme iþlemi yapýyordum ve bir süre sonra 'kayýt dosyasý doldu!'
gibi bir hata alýyorum" diyorlar veya "Ýndeksleme iþlemi yaparken kayýt dosyamýn
boyutunun çok arttýðýný fark ettim, bu dosyamýn boyutu neden büyüyor? Kayýt dosyamý
nasýl eski haline getirebilirim?" gibi gibi... Yukarýda da sýraladýðým gibi, Ýndeksleme
iþlemi de kayýt dosyasýnda takip edilen bir iþlemdir. Bu nedenle indeksleme iþlemine
dair tüm bilgiler kayýt dosyasýna da saklanýr. Yapacaðýnýz indeksleme ne kadar geniþ
çaplýysa, kayýt dosyanýz da ona eþit orantýlý olarak büyüyecektir. Bu nedenle "kayýt
dosyasý doldu" hatasý almamak için hem kayýt dosyanýzýn "dosya boyutu sýnýrý" ayarýnýn
düzgün yapýlandýrdýðýndan, hem de kayýt dosyanýzýn bulunduðu diskte yeterli alan
olduðundan emin olun.
Kayýt Dosyalarýnýn Boyutlarýný Küçültme
Kayýt dosyalarýnýzýn boyutlarýný küçültmek için ilk önce yedeklerini almanýz gerekiyor
veya doðrudan içlerindeki Pasif Sanal Kayýtlarý aþaðýdaki örneklerde verdiðim gibi
temizleyebilirsiniz:
BACKUP LOG veritabani_adi WITH TRUNCATE_ONLY
veya
BACKUP LOG veritabani_adi WITH NO_LOG
Bu komutlardan birini kullandýktan ve dolayýsýyla kayýt dosyasýnýn içerisindeki
pasif sanal kayýtlarý temizledikten sonra, dosyanýn fiziksel boyutunu küçültmek
için DBCC SHRINKFILE komutunu kullanmalýsýnýz. Aþaðýdaki örnekte, Deneme_Log isimli
kayýt dosyasýnýn boyutu 1MB' a düþürülecektir. Bu komutu ise aþaðýdaki örneðe göre
kullanabilirsiniz:
DBCC SHRINKFILE (Deneme_Log, 1);
Not:
Burada göz önünde bulundurmanýz gereken þey, kayýt dosyasýnýn içerisindeki sanal
kayýtlarýn, en son aktif sanal kayda kadar silinebileceðidir. En son aktif sanal
kayýttan daha sonrasý silinemez, ta ki o aktif kayýt pasifleþinceye kadar. Aktif
ve Pasif Sanal Kayýtlardan aþaðýda söz edeceðim.
Ayrýca, bu konu hakkýnda SQL Server 2008' de bazý deðiþiklikler var. Bununla ilgili
olan ve aþaðýda adresini verdiðim makalemi de okuyabilirsiniz:
SQL Server 2008' de 'TRUNCATE_ONLY' ve 'NO_LOG' BACKUP Seçenekleri
Bununla birlikte, "Recovery Models" konusu da doðrudan
kayýt dosyasýnýn büyümesiyle alâkalý bir konudur. Meselâ bir kayýt dosyasýnýn içini
SIMPLE RECOVERY modelini kullanarak da belli aralýklarla temizleyebilirsiniz. Bu
konuda da daha fazla bilgi almak için aþaðýdaki makalemi okuyabilirsiniz:
Recovery Models: FULL, BULK LOGGED, SIMPLE
Kayýt dosyalarýnýn dosya boyutlarýný sürekli düþük
bir deðerde tutmak da marifet deðildir. Aslýnda Veritabaný Yöneticisi olmayýp, ama
kaynak olmadýðý için de bu konuda bir uzmanla çalýþamayan kiþilerin sürekli bu tür hatalar yaptýklarýný gözlemliyorum.
Aþaðýdaki paragrafa geçmeden önce hemen kýsaca Aktif Sanal Kayýt ve Pasif Sanal
Kayýtlardan da bahsetmek istiyorum. Kayýt dosyasý içerisindeki kayýtlar Aktif ve
Pasif Sanal Kayýtlar olarak sýnýflandýrýlýr. Aktif Sanal Kayýtlar, "Rollback" iþlemi
için açýlmýþ ve baþarýyla devam eden iþlemler silsilesindeki kayýtlardýr. Bu kayýtlar
ne kayýt dosyasýnýn yedeði alýnarak, ne de baþka bir þekilde kesinlikle temizlenemezler.
Pasif Kayýt Dosyalarý ise, kayýt dosyasýnýn yedeði alýnarak temizlenebilir.
Peki neden kayýt dosyalarýnýn boyutlarý çok düþük olmamalý ve ortamýnýza özel belli
bir deðerde olmalý? Çünkü yukarýda da anlattýðým gibi veritabanýnýzda iþlemler gerçekleþtirildikçe,
bu iþlemler kayýt dosyasýna iþlenirler. Metin dizeleri gibidir kayýt dosyalarý da
yani belli bir sýraya göre düzenlenir ve yeni iþlemler hep sona eklenirler. Her
iþlemin bir LSN (Kayýt Sýrasý Numarasý) i vardýr. Siz iþlem yaptýkça dosya büyür
de büyür. Ve her büyüme esnasýnda Veritabaný Motoru iþlemleri durdurup, kayýt dosyasýnýn
boyutunu büyütür ve iþlemlere devam eder.
Þöyle bir örnek vereyim: Veri dosyasý boyutu 80GB olan ve her gün veri giriþi yapýlan
ve yoðun kullanýlan bir veritabanýnýz olsun. Bunun kayýt dosyasýnýn boyutunu ise
her gün kayýt dosyasý yedeðinin alýnmasý iþleminin ardýndan "DBCC SHRINKFILE\SHRINKDATABASE"
gibi komutlar kullanarak veya "Maintanence Task" lar kullanarak küçülttüðünüzü varsayalým.
Dosya büyüme oraný da 10MB olsun. Bunun anlamý þu dur, kayýt dosyasýnýn yedeðini
alma iþlemiyle kayýt dosyanýzýn içindeki Pasif Sanal Kayýtlarý temizlersiniz, DBCC
SHRINK iþlemi ile de dosyanýn fiziksel boyutunu küçültürsünüz; yani yeni iþlemler
için kayýt dosyasýnýn içerisinde boþluk kalmaz. Bu nedenle, yeni iþlemler için kayýt
dosyasýnýn fiziksel boyutunun büyütülmesi gerekir. Zaten yoðun kullanýlan bir veritabaný
ve büyüme deðeri de sadece 10MB. Veritabaný Motorunun sürekli bu dosyanýn boyutunu
büyütmesi gerekeceði zaman nasýl bir sorunun oluþabileceðini görüyorsunuz deðil
mi? Ýþte bu, performans sorunlarýna katkýda bulunabilecek önemli bir etkendir.
Sonuç
Gerekli gereksiz kayýt dosyasýnýn küçültülmesi iþleminin yapýlmamasýný tavsiye ederim.
Kayýt dosyanýzý belli bir büyüklük deðerinde býrakýn, sürekli büyüyüp küçülmesi
gerekmesin. SHRINK iþlemlerini gerektiðinde siz yapýn, otomatikleþtirmeyin. Ayrýca
otomatik dosya büyüme deðeri için de küçük deðerler kullanmayýn. Eðer yeriniz varsa
býrakýn rahatça büyüsün. Ama 80GB' lýk veritabanýnda da 50GB kayýt dosyasý olsun
demiyorum tabi, yazýmýn belli yerlerinde de dediðim gibi, her ortamýn kendine has
özellikleri ve ihtiyaçlarý vardýr. Siz de ayarlarýnýzý kendi durumunuza uygun yapýn.
Ekrem Önsoy
|
|
Anasayfa |
|