Kategoriler
Anlatım Bilgisayar Bilimleri

Veritabanı Aynalama/Yansıtma (Database Mirroring)

Veritabanı aynalama da sadece bir sunucu müşterilere hizmet verir. Buna esas, asıl ya da ana sunucu (principal server) denir. Ben bana daha anlaşılır geldiği için birincil sunucu tabirini kullandım. Sistemin iki sunucu ile çalıştığını söylemiştik. İşte diğer sunucu beklemededir ve sunucunun bu durumu (beklemede kalma) aynalama oturumuna (mirroring session) göre ve ayarlara göre değişir. Bu sunucuya ayna sunucu (mirror server) denir. Fakat ben yine daha iyi anlaşılması açısından ikincil sunucu olarak bahsettim. Veritabanı aynalama oturumu (iki veritabanı arasındaki bağlantı) senkronize edildiğinde (yani iki veritabanı arasında bilgilerin eşitlenmesi işlemi gerçekleştirildiğinde) veritabanı aynalama olayı gerçekleşir ve hazırda bekleyen ve afet anında devreye girecek olan ikincil veritabanını oluşturur. Veri eşitleme oturumu senkronize olmazsa, veritabanı veri kaybı da olsa, beklemede durur. Veritabanı aynalamada birincil sunucuda gerçekleşen her ekleme, çıkartma ve güncelleme işlemi ikincil sunucu üzerinde de olabildiğince hızlı bir şekilde gerçekleşir. Yeniden gerçekleştirme işlemi birincil sunucunun ikincil sunucuya işlem kayıtlarını (transaction logs) göndermesiyle başlar. İkincil veritabanında bu işlemleri ikincil ve beklemede olan veritabanı üzerinde uygular. Çoğaltmada (Replication) işlemler mantıksal düzeyde gerçekleşirken veritabanı aynalamada işlemler fiziksel düzeyde gerçekleşir. Çünkü direk olarak veriler ayrı bir diske yeniden yazılır. Birincil ve ikincil sunucular aynalama oturumu esnasında birbirleriyle iletişim içerisindedirler ve karşılıklı olarak çalışırlar. Her iki eş (partner) de aynalama oturumu esnasında birbirini tamamlayacak şekilde çalışır. Bu roller birincil ve ikincil rolleridir. Her hangi bir zamanda eşlerden biri birincil rolü gerçekleştirirken diğer eş ikincil rolü gerçekleştirir. Her eş kendi rolünün sahibidir. Birincil rolü üstlenen eş birincil sunucu olarak adlandırılır. Birincil sunucu üzerindeki veritabanına da birincil veritabanı denir. Diğer sunucu ise bu duruma bağlı olarak ikincil sunucu özelliğini gösterir ve onun üzerindeki veritabanı da ikincil ya da ayna veritabanıdır.

Veritabanı aynalamanın bir faydası veriyi korumaktır. Veri eskiden bir veritabanı üzerinde yer alırken şimdi iki ayrı sunucu üzerinde aynı bilgileri içeren iki veritabanı bulunur. Sunucunun birinde bir hata olduğunda ikinci sistem devreye girerek kullanıcıların çalışmasına devam edebilir. Yani veri yedek bir sistemde tutularak korunmuş olur.

Bunun yanı sıra veritabanı aynalama tam anlamıyla ya da neredeyse tam olarak veri yedeği alınır. Bu yedek yüksek güvenlik veya yüksek performans moduna göre değişiklik gösterir. Yüksek güvenlik modu senkronize olarak çalışır. Yüksek performans modu zamandan kazanmak için asenkron olarak çalışır. Çalışma mantıkları aşağıda açıklanacaktır.

Yüksek güvenlik modunda birincil sunucu aktif kayıtları ikincil sunucuya gönderir. İkincil sunucu bu kayıtları alıp ikincil veritabanına yazmadan önce diske yazar ve sonra birincil veritabanına “Ben kayıtları diske yazdım bir sonraki işlemi yapabilirsin” anlamına gelen bir mesaj gönderir.  Sonrada diske yazdığı kayıtları ikincil veritabanına uygular.

Yüksek performans modunda ise birincil sunucu ikincil sunucuya kayıtları gönderip ve ikincil sunucunun kayıtları diske yazdığı onayını beklemeden işlemleri gerçekleştirmeye devam etmesidir. Yani yüksek güvenlik modunda ki ikincil diskin birincil diske olan geribildirimi beklenmez. Bu sayede geribildirimi bekleme süresi ortadan kalktığı için birincil sunucu işlemleri hızlı bir şekilde gerçekleştirir.

Veritabanı aynalamanın bir diğer faydası veritabanına erişimin sürekli kılınmasını sağlamasıdır. Daha öncede bahsettiğimiz gibi birincil sunucu çalışmayı durdursa bile yedek sunucu üzerinden veritabanına erişim mümkün olduğu için sistem çalışmaya devam eder. Bu nedenle afet durumlarında zor durumda kalmamak için tercih edilen yöntemlerdir. Yüksek güvenlik modunda bir afet olması durumunda yedekte beklemede olan veritabanı çevrimiçi hale geçer. Burada çok az bir veri kaybı vardır. Diğer modlarda veritabanı yöneticisi alternatif veritabanını ayağa kaldırır.

Veritabanı aynalama sisteminin son faydası ise güncelleştirmeler sırasında ürün veritabanının (production database) erişimini arttırır. Aynalamanın kullanıldığı sistemlerde veritabanı çevrimdışı süresini azaltmak için bir sistem üzerinde SQL Server güncelleştirmeleri yapılırken yedek sistem çalışır. Daha sonra yedek sistemin güncelleştirilmesi yapılarak hem veritabanı çevrimiçi tutulur hem de sistemler güncellenmiş olur.

Kategoriler
Anlatım Bilgisayar Bilimleri

Indeksler (Veritabanı)

Indeksler iki kategoriye ayrılır. Bunlar kümelenmiş (clustered index) ve kümelenmemiş (non-clustered index) indekslerdir. SQL Serverda kümelenmiş indekslerde kayıtlar tablodaki bir kolona göre sıralanır. O kolonda yer alan bilgiler tekrar etmez. Yani isim kolonunu kümelenmiş indeks olarak tanımladığımız zaman o kolona iki tane Ali isimli kayıt giremeyiz. Eğer bir tabloda birincil indeks kısıtlaması (primary key constraint) veya özgün indeks kısıtlaması (unique key constraint) varsa bu kolonlardan biri kümelenmiş indeks olarak tanımlanabilir. Bununla birlikte bir tabloda doğası gereği sadece bir tane kümelenmiş indeks bulunur. Düşünelim ki, SQL Server aynı tabloya iki tane kümelenmiş indeks tanımlamaya izin verdi. Bizde önce isime daha sonra soyada göre kümelenmiş indeks tanımladık. SQL Server önce isime göre kayıtları sıralasın. Daha sonra soyada göre kayıtları sıralamaya çalıştığında bu sefer isim sırası karışır. Bu nedenle aynı tabloya birden fazla kümelenmiş indeks tanımlamak mümkün değildir. Kümelenmiş indeksler aralık sorgularında yüksek performansı gösterir. Bununda nedeni basittir. Kayıtlar sıralı olduğu için aralığın başını ve sonunu bulmak için çok zaman kaybedilmez. Örneğin para kolonu kümelenmiş indeksle tanımlı olsun ve biz sorgumuzda üç bin dolar ile yedi bin dolar arasında maaşı olanları elde etmek istiyoruz. Bu durumda ilk üç bin dolar kazanan kişiden en son yedi bin dolar kazanan kişiye kadar aşağı doğru kayıtlar kullanıcıya getirilir. Kullanım olarak bir tablo üzerinde başka indeksler tanımlanmadan önce kümelenmiş indeksi tanımlamakta fayda vardır. Bununla birlikte SQL Server kümelenmiş indeksi iki nedenden dolayı kullanır. Biri yukarıda da bahsettiğimiz gibi aralık sorgularıdır. Diğer ise arama sorgularında kullanılır. Kümelenmemiş indeksler doğrudan verilere erişemez. Yığın (heap) üzerözgüninden ya da kümelenmiş indeks üzerinden verilere erişebilir. Eğer yığın olarak tanımlanırsa (yani kümelenmiş indeks tablo üzerinde kullanılmıyorsa) her satır, satır numarasıyla (row id) tutulur. Satır numarası dosya numarası, satır numarası ve sayfa içindeki satır sayısından tutulur. Eğer kümelenmiş indeks varsa kümelenmiş indeks üzerinden çalışır.

Bir tablo üzerinde bir sütun bilgilerinin tekrarlanmamasını istiyorsak bunun için özgün indeks (unique index) kullanılır. Özgün indeks hem kümelenmiş hemde kümelenmemiş indeks ile birlikte kullanılabilir. Birincil kısıtlama (primary key) veya özgün kısıtlama (unique key) tanımladığı zaman özgün indeks otomatik olarak tanımlanmış olur. Bu oluşum yapılırken indeksin kümelenmiş olup olmayacağı belirtilmelidir. Kullanıcı bir seçenek belirtmezse birincil anahtar kısıtlaması (Primary Key Constraint) SQL Server’ca özgün indeks olarak özgün kısıtlamada (Unique Constraint) kümelenmemiş özgün indeks olarak belirlenir.

Bir tablo üzerinde indeks tanımlamak için T-SQL ifadesi kullanılabilir. Bu işlem aynı zamanda Microsoft SQL Server Management Studio kullanılarak grafik ekran üzerinden de yapılabilir. T-SQL olarak tanımlama yapmak için aşağıdaki SQL kodunu kullanmak yeterlidir.

CREATE index_tipi INDEX index_adı ON tablo_adı(sütun_adı)

İndeks tipinden ifade edilmek istenen şey indeksin kümelenmiş mi yoksa kümelenmemiş mi olduğunu belirtmek için kullanılır. UNIQUE, CLUSTERED yada NONCLUSTERED yazılabilir.

Daha ayrıntılı bir şekilde indeks oluşturmak için aşağıdaki kodları inceleyebilirsiniz.
(Books Onlinedan alıntıdır. Adres: http://msdn.microsoft.com/en-us/library/ms188783.aspx)

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> (column_name [ ASC | DESC ] [ ,…n ] )
    [ WITH <backward_compatible_index_option> [ ,…n ] ]
    [ ON { filegroup_name | “default” } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ]
    table_or_view_name
}

<backward_compatible_index_option> ::=
{
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE
  | DROP_EXISTING
}