SQL Server "MSDB" Veritabanını Temizlemek

11 Ekim 2015 Pazar

Özellikle kritik Production sistemler için Full ve Differential yedeklerin yanında sıklıkla Transaction Log yedeği alınması oldukça normaldir. Recovery Model'ın değişik modlarının ve Transaction Log dosyalarının nasıl yönetileceği tamamen çok geniş ve ayrı konular, Transaction Log'ların sıklıkla alındığı ortamlarda "msdb" veritabanında düzenli temizlik yapılmadığında nasıl bir manzara ile karşılaşılabileceğinizi tahmin edebilirsiniz.

Bugün Domain'de olmayan ve bu nedenle (ve tabii ki biraz da ilgili arkadaşımın ilgisizliği nedeniyle) ve benim bu sunucuya henüz kendi denetim ve izleme Script'lerimi kurmamam nedeniyle yukarıda bahsettiğim gibi bir rezaletle karşılaştım.

Peki bu tablolar neden böyle dolar? Genellikle Full veritabanı yedekleri günde bir kere veya haftada bir kere alınır (tabii ki duruma göre değişir!) ve keza Differential yedeklerin de günde en fazla 4 kere alınabilir.

Fakat Transaction Log yedekleri çok daha sıklıkla alınır, mesela her 5 dakikada bir sefer gibi (her 1 dakikada bir alındığını da gördüm!). Bu ne demek? Günde ortalama 288 adet Transaction Log yedek dosyası ve "msdb" sistem veritabanındaki ilgili yedek tablolarında 288 adet kayıt demek. İlgili SQL Server Instance'ındaki veritabanı sayısı, Transaction Log yedek alma sıklığı ve "msdb" veritabanının temizlenmeme süresi hesaba katıldığında, ilgili yedek tabloları gerçekten çok fazla şişebilir.

Tek çekince tabii ki bu tabloların şişip yer kaplaması değil, genelde ve birçok ortamda bu tabloların tutulduğu "msdb" veritabanının dosyaları "C:" diskindedir. Çünkü DBA barındırmayan birçok şirkette SQL Server kurulumları "next, next" şeklinde yapılır ve Best Practice'ler takip edilmez. Hal böyle olunca, bu veritabanlarının büyümesi C: diskini tamamen doldurur, ki çoğu durumda Windows işletim sistemi ve hatta "tempdb" veritabanı da bu disktedir. Tabii ki bu durumda bir taraftan işletim sistemi teklemeye, garip hatalar vermeye başlar, bir taraftan da kullanıcılar "tempdb"den "ilginç" hatalar almaya başlarlar.

"MSDB" veritabanınızı bu yedek tarihçesi kirliliğinden aşağıdaki script ile kurtulabilirsiniz:

USE msdb
go
DECLARE @most_old_record_date DATETIME
SELECT @most_old_record_date = DATEADD(DAY, - 365, GETDATE())
EXEC msdb.dbo.sp_delete_backuphistory @oldest_date= @most_old_record_date;


Share/Bookmark

0 comments :