2 Kasım 2015 Pazartesi

MS SQL Server'da Sistem Database'lerini Anlamak


Sql Server instance yüklendiği zaman default olarak belli database'ler instance ile birlikte kurulurlar. Bunların görevlerinin neler olduğu ne işe yaradığını bilmek önemlidir. Aşağıda size bunları anlatmaya çalıştım. Bu default olarak yüklenen database’ler şunlardır:
  • Master
  • Tempdb
  • Model
  • msdb
  • resource
  • distribution


Master Database
Master database aslında isminde de anlaşılabileceği gibi primary (birincil) veritabanımızdır. Bu veritabanı olmadan SQL Server başlatılamaz. Master database önemli database objeleri hakkında bilgileri saklar. Bunlara örnek olarak ise:
Instance içinde olan veritabanları
  • AlwaysOn
  • Database Mirroring
  • Configration
  • Login'ler
  • Kaynak Yönetimi
  • Endpoint

Örneğin aşağıdaki kodu çalıştırırsanız instance'ınızın içinde bulunan tüm database'lerin listesini görerbilirsiniz.

SELECT * FROM sys.master_files

Yukarıdaki query bize veritabanlarının listesini ve ek olarak da her bir database'in konfigrasyon seçenekleri ile ilgili bilgilerde yer almaktadır.

Tempdb Database
TempDb kullanıcılar yada uygulamalar tarafından SQL Server üzerinde oluşturulurlar. TempDb içerisinde geçici objeler saklanır. Bu bahsettiğimiz geçici objeler; geçici tablolar stored procedur'ler, tablo değişkenleri, global temp tablolar bulunur. Bunlara ek olarak da TempDb'de online index işlemleri, Trigger tetiklendikten sonraki durum saklanır. SQL Server her yeniden başlatıldığında TempDb yeniden oluşturulur. Ayrıca TempDb içerisinde kullanıcılar da objeler oluşturabilir. Fakat verileri düzenli olarak tempdb' de saklamak güvenilir bir yöntem değildir. Aslında adından da belli olacağı üzere geçici database olduğu için SQL'in yeniden başlatılması, oturumun kapanması gibi durumlarda buralarda saklanan veriler sıfırlanacaktır. Ayrıca tempdb üzerinde backup ya da restore seçenekleri kullanılamaz. Kafalarda biraz daha netleşmesi açısından benim tempdb'yi en çok kullandığım alanlara değinelim; kritik bir veritabanı üzerinde çalışıldığı için tablolara doğrudan yazma, güncelleme yetkimiz yok. Fakat scriptler üzerinde çalışırken local bir temp tabloya yazıp üzerinde her türlü  insert,update, delete işlemini uygulayarak geliştirmelerimizi test edip emin olduktan sonra gerekli değişiklikler canlı ortama taşınır. 
İki tip şekilde temp db tanımlanabilir:

Create table #table...
scriptini çalıştırırsanız local bir tablo oluşturmuş olursunuz ki bu durumda sadece çalışma yapmış olduğunuz session ve tek bir kullanıcı üzerinden bu tabloya ulaşılabilinir.

Create table ##table...
scripti çalıştırdığı durumda global bir temp table oluşturulmuş olur ve bu table farklı session ve kullanıcılar tarafında erişilebilir olur.

Model Database:
Aynı instance içerisinde oluşturulan bütün veritabanları modellerinin saklandığı yerdir. Aynı zamanda model database bir şablon olarak da kullanılabilir. Örneğin bir instance'ında dâhil olmak üzere belli standart bir tablo için her bir database içerisinde ayrı ayrı oluşturmak yerine tek bir seferde hepsinde model database sayesinde tanımlanabilir.  Eğer model database mevcut değil ya da offline ise tempdb bu durumda oluşturulamaz. Daha öncede bahsettiğimiz gibi Tempdb, SQL Server her başlatıldığında yeniden oluşturulur ki eğer model db'ye ulaşılamıyorsa TempDb'nin de bu durumda yaratılması mümkün olmaz.

Msdb Database:
Msdb database SQL Server Agent'lar için temel olarak back-end veritabanı olarak hizmet eder. Kullanıcı yeni bir Sql Agent Job tanımlarsa ya da bunu schedule(zamanlama) ederse bunların metadata'ları bu database üzerinde saklanırlar. Aynı zamanda aşağıdaki component'leri barındırır.

  • Service Brokers
  • Alerts
  • Log Shipping
  • SSIS Packages
  • Utility Control Point (UCP)
  • Database Mail
  • Maintance Plans


Resource Database
Resource database root'lar içersinde gizlenmiştir ve read only(sadece okunabilir) olarak çalışır. Bu database'in en temel amacı bir sonraki SQL Server versiyonuna geçebilmek için upgarde işlemlerini sağlamaktır. Bir SQL Server instance içerisinde bulunan bütün sistem objeleri bu database de bulunur.Resource database içerisinde iki tip dosya vardır: mssqlsystemresource.mdf ve mssqlsystemresource.ldf'tir.Bir diğer önemli bilgi bu veritabanının ID'si 32767'tir ve bu değer SQL Server 2005'ten SQL Server 2014' e kadar aynı kalmıştır. Resource Database Master Database ile aynı lokasyonda bulunmalıdır. Donanımsal bir sıkıntı yaşanması durumunda master database'i yeni bir alana restore etmeniz gerekmektedir. Bunu yapmdan önce WITH MOVE seçeneği ile birlikte yapmamız gerekmektedir ki RESOURCE DATABASE'in .mdf ve .ldf dosyalarıda master database ile birlikte taşınabilsin. Bu database ile ilgili enteresan bir bilgi daha, istisnai durumlar dışında diğer veritabanları gibi Resouce database'in Backup'ını alamaz yada tekrardan restore edemezsiniz.

Distribution Database
Evet, son olarak ele alacağımız sistem veritabanı distribution database. Bu sistem database'i eğer siz instance içiersinde distribution özelliğine sahip bir replication işlemi configre ettiğiniz zaman SQL Server Managament Studio'da system database branch'nin altında bu veritabanını görürsünüz. Replication işlemi için öncelikle verilerin gönderimini sağlayacak olan bir distributor database tanımlamanız gerekmektedir. Bunu da Replication configure ederken buradaki ilgili ekranlardan distribution database oluşturabilirsiniz. Bu veritabanında replication işlemi ile ilgili bütün metadata ve tarihsel dökümler bulunmaktadır.