MS-SQL

SQL Server ve Otomatik Büyüme (AutoGrow) İşleminin Uygulamanıza Etkileri

MS-SQL Server’da otomatik büyüme (AutoGrow) işlemi uygulamanızda beklenmedik etkiler oluşturabilir. Bu yazımda bunları göz önüne sermeye çalışacağım. Başlamadan önce, birazdan bahsedeceğim hususları MS-SQL Server 2000 kullanan bir ortamda gözlediğimi belirtmek isterim. Daha sonraki sürümlerde da bu hususlar oluşmayabilir. Yazımı MS-SQL Server 2000 sürümü değerlendirmelisiniz.

SQL Server’da bir veritabanı (Database) oluşturduğunuzda otomatik büyüme miktarı (AutoGrow Size) varsayılan olarak “%10” gibi bir değer alacaktır. Bu değer aslında birçok sistem için yeterlidir. Sorun şu ki bu değer bir orandır ve veritabanının fiziksel olarak alana ihtiyacı olduğunda, SQL Server bu değere dayanarak otomatik olarak disk üzerinden yer ayırmaya çalışacaktır ve ayıracağı alanın miktarını da o anda veritabanı tarafından kullanılan alanın boyunun %10’u şeklinde hesaplayacaktır. Hemen dikkatinizi çekeceği gibi, eğer çok sık büyüyen bir veritabanınız varsa veri tabanınızın asıl kullandığı alan boyutu devamlı değişeceğinden bu işlem tamamlanmadan kesintiye uğrayabilir. Bu durumda SQL Server bu görevi bitirmek için tekrar bir işlem başlatacaktır. Diğer bir taraftan bir veritabanı üzerinde bu işlemi (AutoGrow ) yapmak oldukça kaynak tüketen bir iştir ve tüm bu döngü:

1. SQL Server yer ayırma işlemine başlar,
2. Veri tabanına kullanımdan dolayı çok fazla veri eklenmektedir,
3. SQL Server yer ayırma işlemini durdurur ve süreç başa döner…

devam ederken istemci uygulama (ASP.Net gibi…) SQL Server ile bağlantı problemleri yaşar, zaman aşımı (time-out) hataları oluşur ve uygulama isteklere cevap veremez hale gelir.

Eğer olay görüntüleyicinizde (Event  Viewer)

“Autogrow of file ‘Database File Name’ in database ‘Database Name’ took Number milliseconds. Consider using ALTER DATABASE to set a smaller FILEGROWTH for this file.”

şeklinde hatalar alıyorsanız muhtemelen bu şekilde bir durumla karşı karşıyasınız. Bu durumun üstesinden gelebilmek için çeşitli yollar var. Ancak öncelikle belirtmeliyim ki birçok sistemde bu sıklıkta ve büyüklükte veri girişi bir hatanın sonucu olur. Öncelikle uygulamanızda yüksek miktarda veri girişinin bir hata sonucu oluşmadığını belirlemenizde büyük fayda vardır.  Çözüm için kısaca iki yol üzerinde duracağım.

Bunlardan bir tanesi otomatik büyüme miktarının oran olarak değil sabit olarak verilmesidir. Bu durumda SQL Server veritabanın boyu değişse bile değeri tekrar hesaplamak zorunda kalmayacak ve işleme başladıktan sonra kesinti yapmadan tamamlayacaktır. Sabit verilecek değeri basit olarak şu anki kullanılan veritabanı boyutunuzun %10’u şeklinde hesaplayabilirsiniz. Daha sonra ihtiyaç duydukça bu değeri güncellemenizde fayda vardır.

Diğer bir yol ise büyüme işleminin otomatik değil veritabanı yöneticisi tarafından gerekli olduğunda yapılmasıdır. Bu yöntem veri tabanın devamlı gözlenmesini gerektireceğinden daha maliyetli bir yöntemdir. Ancak büyük veri tabanlarının büyüme işlemi sırasında isteklere cevap verememe durumu olabileceğinden bu işlemin ayrıca ele alınıp uygun zamanda yapılması bu açıdan iyi olacaktır. Bu işlem “ALTER DATABASE” konutu kullanarak yapılabilir.

Otomatik büyüme ile ilgili bir diğer sorun ise büyük veri girişleri olmadığı halde istemci uygulamanın veritabanı ile ilgili bağlantı zaman aşım (time-out) süreleri gereğinden kısa olduğunda oluşabilir. SQL Server’ın büyüme işlemi sırasında (her ne kadar bu işlemi kesintisiz olarak sürdürüyor olsa bile) bağlantılara cevap veremeyebileceğini unutmamak gereklidir. Eğer yukarıda anlatıldığı gibi otomatik yer ayırma işleminin kesintiye uğraması söz konusu olmadığı halde otomatik büyüme işlemi sırasında istemci uygulamanızda zaman aşımı (time-out) mesajları ile karşılaşıyorsanız istemci uygulamanızın zaman aşımı değeri bağlantı (Connection) veya komut (Command) nesneleri için çok küçük olabilir. Bu değeri SQL Server’ın otomatik büyüme işlemini bitirmesine izin verecek bir değer olarak atamak gerekmektedir. Hemen bu noktada belirtmekte fayda vardır ki, çok büyük zaman aşım değerleri farklı sorunlara yol açacaktır. Bu noktaya dikkat etmenizde fayda vardır. Bu durum için bir başka çözüm ise tam tersi bir yolla veritabanı dosyanızın büyüme oranı veya sabit miktarını daha ufak bir değer vererek işlemin daha kısa sürede tamamlanmasını sağlamaktır. Hangi yolun ideal olduğuna, veritabanı büyüklüğünüzü ve sistem ihtiyaçlarınızı inceleyerek karar verebilirsiniz.  SQL Server’ın veritabanınız için belirtilen oranda yer ayırma işlemi için ne kadar bir süreye ihtiyaç duyacağını, büyüme işlemini “ALTER DATABASE” konutu kullanarak kendiniz gerçekleştirip görebilirsiniz.

Sonuç olarak, SQL Server veritabanınızda otomatik büyüme (AutoGrow) özelliği aktif ise ve çok yoğun veri girişi olan, büyük bir veritabanına sahipseniz yukarıda anlatılan durumlarla karşı karşıya kalabilirsiniz. Bunların üstesinden gelebilmek için ise bu durumu yukarıda anlatıldığı şekilde incelemeniz ve yönetmeniz gerekecektir.

Bir cevap yazın

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