Transactional Replication, verilerin bir sunucudan (Publisher) diğerine (Subscriber) neredeyse eş zamanlı olarak aktarıldığı, yüksek erişilebilirlik ve raporlama yükünü dağıtmak için kullanılan en popüler yöntemlerden biridir.
Sql sunucusunda çok yoğun işlemler olduğu için rapor sorguları performans sorununa yol açabilir ve rapor çekeceğimiz tabloları başka bir sunucuya aktarıp asıl sunucuda performans kaybı olmadan raporlarımızı çekebiliriz. Transactional Replication neredeyse eş zamanlı çalışacağı için raporlarımızda neredeyse gerçek zamanlı olacaktır. Always ON kullanıyor olsaydık secondary sunucudan Read yapabiliyor olurduk fakat rapor sorgularının bir çok index ihtiyacı olabilir ve Always ON’da secondary sunucuda index oluşturulamıyor. Bu yüzden Always On’un secondary sunucusunu raporlama amaçlı kullanmak istersek raporlar için gerekli indexleri primary sunucuda oluşturmamız gerekir. Gereğinden fazla index eklemek çalışan uygulamanın insert,update ve delete performansını yavaşlatacağı için primary sunucuda rapor amaçlı index eklemek istemiyor olabilirsiniz. Bu durumda Transactional Replication biçilmiş bir kaftan olarak karşımıza çıkacaktır.
Özetle Snapshot agent tarafından veritabanının snapshot’ı alınıp subscriber’e uygulanır. Daha sonra Log Reader Agent tarafından publisher’daki replike edilecek olarak işaretlenmiş transaction’lar “distribution” veritabanına aktarılır. Distribution Agent’da, Snapshot tarafından alınan snapshot’ı ve Log Reader Agent tarafından “distribution” veritabanına aktarılan transaction’ları Subscriber’lara aktarır.
Önemli bir not olarak Transactional Replication’da, asıl veritabanında yapılan her değişiklik replike edilen veritabanına yansıtılır. Yani 1.transaction’da a kolonunu 3 olarak set ettiniz ve 2.transaction’da a kolonunu bu sefer 5 olarak set ettiniz. Transactional replication replike veritabanındaki a kolonunu direk 5 olarak set etmez. Önce 3 sonra da 5 olarak set eder. Bu şekilde her transaction bir iz bırakarak geçmişe dönük izlemeye olanak sağlar.
Mssql server kurulumunda database engine role’ünün yanına replication role’ünün eklenmesi gerekmektedir. Bu özellik seçilmezse replication servisleri yüklenmez ve sihirbazlar çalışmaz.

En az iki farklı SQL Server Instance gereklidir.
- Publisher (Yayıncı): Verinin asıl sahibi.
- Subscriber (Abone): Verinin kopyalanacağı yer.
- Not: İsterseniz “Distributor” (Dağıtıcı) rolünü üçüncü bir sunucuya verebilirsiniz, ancak genellikle Publisher ve Distributor aynı sunucuda yapılandırılır.
Server1instance instance’ı Publisher ve Distributor olacak,(Yani local Distributor), Server2Instance ise Subscriber olacaktır.
Not: Instance isimlerinin farklı olması bir engel değildir. Hatta karışıklığı önlemek için farklı olması önerilir. Ancak sunucuların birbirini Host Name (veya SQL Instance Name) üzerinden çözümleyebilmesi şarttır.
Replication mekanizmasının “postacısı” olan Distribution veritabanını oluşturma adımıdır. SSMS üzerinde “Replication” klasörüne sağ tıklayıp “Configure Distribution” diyoruz.

Gelen ekranda Do not show this page again’i tıklayarak next diyoruz.

Bir sonraki ekranda aşağıdaki gibi seçim yaparak Distributor’ü kurulum yaptığımız sunucuda oluşturuyoruz. Arka planda distribution veritabanıda oluşacak. Next diyerek ilerliyoruz.

Gelen ekranda sql server agent servisinin otomatik başlaması için Yes diyiyoruz.

Dağıtımın yapılacağı bir klasör yolu (Network Share) belirtilir. Değişiklikleri takip eden logların ve ilk kurulumdaki veri setinin (snapshot) tutulacağı bir depo oluşturmak için. Replication sistemi veriyi nereye yazacağını ve nereden dağıtacağını bilemez, sistem çalışmaz.

Oluşturulan paylaşım klasörüne sql server engine ve agent servis hesaplarına full kontrol yetkisi verilmesi gerekmektedir.
S1 sunucusu üzerinde ReplicationFolder klasörü oluşturduktan sonra Snapshot folder kısmına oluşturulan paylaşım klasörü yazılır.

Bir sonraki ekranda aşağıdaki gibi distribution veritabanının data ve log dosyalarının hangi path’lerde tutulacağı bilgilerini girip next diyerek ilerliyoruz. Hiçbir değişim yapmadan default şeklinde bırakıyorum.

Bir sonraki ekranda bu distribution veritabanının hangi Publisher’ın kullanacağını belirliyoruz. Biz Publisher ve distributor’ın aynı instance üzerinde kuracağımız için aynı instance’ı seçili bırakıp next diyerek ilerliyoruz.

Seçili olan Configure Distribution yapısını gördükten sonra Next diyoruz. İkinci seçeneği işaretlerseniz yapılan işlemin scriptini alabilirsiniz.

Finish diyerek yapılan işlemler tamamlanır.

Kurulum işlemleri gerçekleştikten sonra sistem veritabanları içerisinde distrubution veritabanının görülmesi gerekmektedir.

Publisher ve Distributor’u aynı sunucu üzerinde yapılandıracağımız için Replication kısmında Local Publication kısmında sağ tıklayıp New Publication.. denilir.

Gelen ekranda Do not show this page again’i tıklayarak next diyoruz.

Gelen ekranda hangi veritabanımızı replica edeceksek seçim işlemi yapılmaktadır. İlgili veritabanı seçimi yaptıktan sonra Next denilir.

Gelen ekranda aşağıdaki gibi Transactional publication’ı seçerek Next diyoruz.

Gelen ekranda article olarak hangi nesne seçimini yapmak istiyorsak ilgili nesne seçimi yapılmaktadır.

Bir sonraki ekranda article’ları soruyor. Biz sadece Person.Address tablosunu seçip Next diyoruz.

Bir sonraki ekranda bize tablonun tamamını değil de belli bir filtreye göre filtrelenmiş halini aktarmak istersek bu kolaylığı sağlayan ekran geliyor. Aşağıdaki ekrandan Add diyerek istediğimiz filtreyi ekleyip tablonun belli bir kısmını replike edebiliriz. Biz şu anda herhangi bir filtreleme yapmadan next diyerek ilerliyoruz.

Add butonuna tıklanarak filtreleme işlemi yapılabilir.

Kaldığımız yerden devam edecek olursak önceki resimde gelen ekranda verilerin snapshot’ının şimdi mi yoksa daha sonra mı alınacağını soruyor. Aşağıdaki gibi Create a snapshot immediately and keep the snapshot available to initialize subscription’ı seçerek, snapshot’ın şimdi alınmasını istediğimizi söylüyor ve next diyerek ilerlemeye devam ediyoruz. Belirli bir zamanda işlemin gerçekleşmesi istenirse Schedule the Snapshot Agent to run at the following times seçeneği ile belirlenebilir.

Bir sonraki ekranda Snapshot Agent ve Log Reader Agent’ın kullanacağı kullanıcı hesaplarını soruyor. Security Settings’e tıklayarak ilgili kullanıcıları set edebiliriz.
Snapshot Agent için set edeceğiniz kullanıcının minimum hakları:
- Distribution veritabanında db_owner olmalı.
- Publication yapılacak veritabanında db_owner olmalı.
- Snapshot paylaşımında write hakkı olmalı.
Log Reader Agent için set edeceğiniz kullanıcının minimum hakları:
- Distribution veritabanında db_owner olmalı.
- Publication yapılacak veritabanında db_owner olmalı.
Microsoft bu iki hesap içinde Windows Account set etmemizi öneriyor.
Veritabanları üzerinde tanımlanan servis hesapları ilgili veritabanlarında full kontrol yetkisine sahiptir. Kullanılan servis hesabı başlangıçta oluşturulan Sbapshot dosyası üzerinde write yetkisi bulunmaktadır. Log Reader Agent içinde aynı hesabı kullanmış oldum.

Mevcutta bulunan sql server servis hesabının seçilmesi istenirse Run under the SQL Server Agent servis account checkbox’ın seçilmesi gerekmektedir.

İlgili windows account seçildikten sonra Next denilip bir sonraki aşamaya geçilmektedir.

Bir sonraki ekranda aşağıdaki gibi Create the publication seçili iken next diyerek ilerliyoruz.

Gelen ekranda Publication’a bir isim veriyoruz ve finish diyerek publication kurulumunu tamamlıyoruz.

Başarılı bir şekilde kurulumu gerçekleştirmiş olduk.

Başarılı bir şekilde Publications yapısının kurulduğu gözlemlenir.

Bir sonraki adımda Subscriber’ı kuracağımız instance’a geçiyoruz ve aşağıdaki gibi Local Subscription’a sağ tıklayarak New Subscriptions diyoruz.

Gelen ekranda Do not show this page again’i tıklayarak next diyoruz.

Sonraki ekranda publisher yazan yerden Find SQL Server Publisher.. bölümünden Publisher’ı kurduğumuz 1.Sunucudaki instance’ı seçiyoruz ve aşağıdaki ekran karşımıza çıkıyor. Next diyerek ilerliyoruz.

İlgili seçimi yaptıktan sonra Next denilip bir sonraki ekrana geçilmektedir.

Bir sonraki ekranda subcriptions’a verilerin nasıl geleceğini soruyor. Yani veriler Distributor’den subcscriber’lara mı aktarılacak yoksa subscriberlar distributor’dan mı veriyi alacaklar. Bu yöntemler Push ya da Pull Subscription olarak geçiyor.
Aşağıdaki ekran görüntüsü, Transactional Replication kurulumunun en kritik karar noktalarından biri olan Distribution Agent Location (Dağıtım Aracının Konumu) aşamasını gösteriyor.
Genel kullanım senaryolarının %90’ında ilk seçenek olan “Run all agents at the Distributor” (Push Subscription) tercih edilir. Detaylandıralım:
1. Seçenek: Run all agents at the Distributor (Push Subscriptions)
Verinin dağıtılma emri ve yönetimi merkezden (Distributor) kontrol edilir. Veri, Subscriber’a “itilir”.
- Yönetimi çok daha kolaydır. Replication Monitor üzerinden tüm akışı tek bir merkezden izleyebilirsin. Eğer sunucuların aynı local network üzerindeyse en mantıklı yoldur.
- Bu seçeneği seçmezsen, her bir abone (subscriber) kendi işini kendi takip etmek zorunda kalır. 10 tane aboneneniz olduğunu düşünürseniz, 10 ayrı yerden yönetim yapmanız gerekir.
2. Seçenek: Run each agent at its Subscriber (Pull Subscriptions)
Abone sunucu, belirli aralıklarla “yeni veri var mı?” diye merkez sunucuya sorar ve veriyi kendisi “çeker”.
- Eğer ana sunucun (Publisher) donanımsal olarak çok zayıfsa ve 1. seçeneği seçersen, replication trafiği ana sunucuyu iyice yorabilir.
- Eğer Publisher/Distributor sunucun üzerinde çok fazla yük (CPU/RAM) varsa ve bu yükü hafifletmek istiyorsan veya Subscriber sayısı çok fazlaysa (yüzlerce abone gibi) tercih edilir.

Bir sonraki ekranda aşağıdaki gibi replike edeceğimiz tabloları hangi instance’taki hangi veritabanına replike edeceğimizi soruyor. Add Subscriber diyerek yeni bir instace seçebiliriz.

Subscriber’dan replike edilecek veritabanının instance’ını, SubscriptionDatabase den de replike edilecek veritabanını seçerek devam ediyoruz.

ReplicationTest veritabanımı seçtikten sonra bir sonraki adıma geçilir.

Gelen ekranda Distribution Agent’ın hangi kullanıcı ile çalışacağını soruyor. Aşağıdaki resimde gördüğünüz ….’ya tıklıyoruz.

Distribution Agent için set edeceğiniz kullanıcının minimum hakları:
- Distribution veritabanında db_owner olmalı.
- Pull Subscription kullanılacaksa subscription(hangi veritabanına replike edeceksek o veritabanı) veritabanında db_owner olmalı.
- Snapshot paylaşımında read hakkı olmalı.
- Publication Access List(PAL)’ın bir üyesi olmalı.
Kullanıcını active dizinde tanımlı olan bir kullanıcı olması gerekmektedir. Aşağıdaki kullanıcı iki sunucuda ortak kullanıyorum.

Oluşturulan veritabanı üzerinde db_owner yetkisi verilmektedir.

İlgili kullanıcını Publication Access List(PAL)’ın bir üyesi olması için Publisher sunucusu üzerine gidilip ilgili ayarların yapılması gerekmektedir. Kullanıcıyı PAL’a üye yapmak için Publisher’ın olduğu instance’ta publication’a gelip sağ tıklayarak properties diyoruz.

Açılan ekranda aşağıdaki gibi Publication Access List’e giderek listelenen kullanıcılar arasında kendi kullanıcımızın olup olmadığına bakıyoruz. Kullanıcımız ilgili liste altında yoksa Add.. denilerek kullanıcımız eklenir.

Eğer yoksa Add diyerek ekliyoruz. Eğer kullanıcımız Add dediğimizde çıkmazsa aşağıdaki gibi bir uyarı verecektir. Kullanıcımız geldiği için önceden tanımlanan yetkilendirmelerin geldiğini görmüş olduk.

Tanımlamamızı başarılı bir şekilde gerçekleştirmiş olduk.

İlgili yetkilendirmeden sonra kaldığımız yerden devam edecek olursak ilgili kullanıcımızı 3 noktaya tıkladıktan sonra girilir. Next denildikten sonra bir sonraki adım geçilir.

Bir sonraki ekranda senkronizasyonun nasıl olacağını soruyor.
- Run continuously seçersek sürekli olarak senkronize olur ve gerçek zamanlıya yakın bir kopyamız olur.
- Run on demand only seçersek sadece tetiklediğimizde çalışır.
- Define schedule seçersek belirli zaman aralıklarıyla düzenli olarak çalışmasını sağlarız.

Ben senkronize işleminde herhangi bir sakınca olmasın diye ilk seçeneği seçip bir sonraki ekrana geçiyorum.

Bir sonraki ekranda, subscriber’a(asıl veritabanını replike edeceğimi veritabanı. Bizim örneğimizde ReplikeTest isminde oluşturduk.) hemen verileri aktarmak için Immediately’yi seçerek next diyoruz.

Bir sonraki ekranda aşağıdaki gibi Create the subscription(s) seçili haldeyken next diyoruz ve Finish diyerek işlemi tamamlıyoruz.

Publisher ve Distributor’un olduğu instance’da View Job history diyerek replikasyon için oluşturulan job’ları ve doğru çalışıp çalışmadıklarını görebilirsiniz.

Subscriptions altında oluşturduğumuz yapı ve ilgili instance altında bir tane job oluşmaktadır. Aktarım işlemiyle ilgili.
Publisher yapılan ortamda ilgili Replication bölümünde bulunan Local Publications altına bakıldığında Bağlantı sağladığımız Subscriptions görülmektedir.

Replikasyon durumunu ilgili Publication’ın üstüne sağ tıklayarak Launch Replication Monitor diyerek aşağıdaki şekilde görebilirsiniz.

Açılan ekranda warning sekmesine gelerek alert üretilmesinide sağlayabilirsiniz. Diğer sekmelerden de replikasyon durumu hakkında bilgi alabilirsiniz.
Bu makalede Transactional replication kavramını detaylı bir şekilde görmüş olduk. başka makalede görüşmek dileğiyle.
“Ey insan! Seni yaratan, şekillendirip ölçülü yapan, dilediği bir biçimde seni oluşturan cömert Rabbine karşı seni ne aldattı?” İnfitar-6-8
