Hoþgeldiniz           
   
"SQL Server baþvuru kaynaðýnýz"
Skip Navigation Links
=========
Anasayfa
Makaleler
Hatalar \ Çözümler
Duyurular
Diðer
Ýpuçlarý
Yararlý Adresler
Mesaj TahtasýExpand Mesaj Tahtasý
HakkýmdaExpand Hakkýmda
Ýletiþim
Kullanýcý Adý:
Þifre:
 

Ne Mutlu Türküm Diyene!

SQL Server ile ilgili soru sormak için buraya týklayýn!


Yazýlarýmý nasýl buluyorunuz?






En Son SQL Server ile Ýlgili Okuduðum Kitaplar
- Inside Microsoft SQL Server 2005: Query Tuning and Optimization - MS Press (Ýngilizce)
- Accelerated SQL Server 2008 - Apress (Ýngilizce)
- Designing and Optimizing Data Access by Using SQL Server 2005 - MS Press (Ýngilizce)
- Microsoft SQL Server 2005 Database Solutions Design - Wiley Publishing (Ýngilizce)- Optimizing and Maintaining a Database Administration Solution by Using SQL Server 2005 - MS Press (Ýngilizce)- Designing a Database Server Infrastructure Using SQL Server 2005 - MS Press (Ýngilizce)- SQL Server 2005 Implementation and Maintenance - MS Press (Ýngilizce)
- SQL Server 2005 Administrators Companion - MS Press (Ýngilizce)


          
"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


 
Bu sitenin tüm haklarý, Ekrem Önsoy' a aittir.