Database Mirroring Nedir ve Nasıl Yapılır? Mirroring Hataları ve Çözümleri..

Microsoft SQL Server Always On teknolojisini geliştirdiği için Database Mirroring’in gelecekte kaldırılacağını duyurdu. Ama SQL Server 2005 ve 2008 kullananlar Always ON özelliğini kullanamayacakları için Database Mirroring nedir ve nasıl oluşturulur’a değineceğiz.

 

Database Mirroring, veritabanı seviyesinde erişilebilirliği arttıran bir çözümdür. (Yani veritabanının olduğu sunucu hizmet veremez duruma gelirse uygulamanın veritabanına diğer sunucudan erişebilmesi)

 

Mirroring ile ilgili genel bilgiler:

 

  • Veritabanı bazlı yapılabilir. Birden fazla veritabanında aynı anda mirroring yapılamaz. Her veritabanı için ayrıca mirroring yapmalısınız.
  • mirroring yapılacak veritabanının full recovery model’de olması gerekir. “Veritabanı recovery modelleri” isimli makalemi okumak isteyebilirsiniz.
  • 2 instance üzerinde mirroring oluşturabilmek için 2 instance’ında aynı sql server sürümünü kullanması gerekir.
  • Mirroring durmuşsa, yeniden başlatılmadan önce primary veritabanındaki bütün transaction log backup’lar secondary sunucuya with no recovery ile restore edilmelidir.
  • Sistem veritabanları mirroring yapılamaz.
  • Veritabanı mirror yapılmışsa mirror bozulmadan ismi değiştirilemez.
  • FileStream desteklemez. File Stream File Group’u olan bir veritabanını mirror yapamazsınız.

 

Mirroring teknolojisinde en az 2 adet instance’a ihtiyaç vardır. Bu sunuculardan bir tanesi Principal Server(Ana Sunucu/Instance), diğeri de Mirror Server(Yedek Sunucu/Instance) olacak. Bir sorun anında sorunun otomatik olarak algılanması ve yedek sunucunun devreye otomatik olarak girmesini istiyorsanız üçüncü bir sunucuya/Instance’a ihtiyacınız olacaktır. Bu sunucu/Instance ‘da Witness Server olarak geçer. Aynı sunucu üzerinde test amaçlı iki instance’ı kullanarak Database Mirroring’i uygulayabilirsiniz ama production sistemden bu şekilde bir işlem yapmanın anlamı olmayacaktır.

 

Şimdi SQL Server 2014 kullanarak Database Mirroring Kurulumu yapmaya başlayalım.

 

Öncelikle Mirror yapmak istediğimiz veritabanının full backup’ını alıyoruz ve mirror yapılacak instance’a NO RECOVERY mode’da restore ediyoruz. Ardından ana veritabanının log backup’ını alıyoruz ve bu log backup’ıda mirror yapılacak instance’a no recovery mode ‘da restore ediyoruz. “Backup Restore İşlemleri” isimli makalemde detaylı olarak bu işlemleri nasıl yapacağımızı görebilirsiniz.

 

AdventureWorks2014 veritabanı üzerinde sağ tıklayarak properties diyoruz ve aşağıdaki gibi Mirroring sekmesine geliyoruz.

 

 

Configure Security diyoruz. Gelen ilk sayfada Do not show this starting page again’i seçerek Next diyoruz.

 

 

Bir sonraki ekranda witness server kullanıp kullanmayacağımızı soruyor. Yes seçili iken Next diyoruz.

 

 

Bir sonraki ekranda konfigure edilecek instance’ların listesini veriyor. Principal ve Mirror zorunlu Witness’ı ise seçimimize bırakmış. Biz witness seçili iken next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda Listener port’u(endpoint için kullanılacak port) ve Endpoint Name’i(Endpoint diğer sunuculardan gelen connectionları almak için kullanılır) belirliyoruz. Ayrıca bu endpoint üzerinden gönderilen dataları şifreleyip şifrelemeyeceğimizi belirleyebiliyoruz. Encrypt data sent through this endpoint’i seçersek şifreliyoruz.

 

 

Port için müsait başka bir portuda yazabilirsiniz. Aynı sunucuda 3 instance üzerinde(principal,mirror,witness) Database Mirroring yapacaksanız farklı portlar kullanmalısınız.

 

Biz yukardaki gibi doldurup next diyerek ilerliyoruz.

 

Bir sonraki ekranda Mirror sunucu/Instance için aynı ekran geliyor. Ben principal ve mirror sunucu için farklı sunucular kullanıyorum. Bu yüzden port’u 5022 olarak bıraktım. Siz aynı sunucu üzerindeki farklı instance’ları kullanacaksanız port’u 5023 olarak değiştirebilirsiniz.

 

 

Bir sonraki ekranda da witness server’ı konfigüre ediyoruz. Ben witness server için principal server instance’ımın olduğu sunucuda başka bir instance kullanacağım. Bu yüzden port olarak aşağıdaki gibi 5023’ü set ettim.

 

 

Bir sonraki ekranda principal,mirror ve witness server’lar için aşağıdaki gibi account’lar tanımlıyoruz.

 

 

Bir sonraki ekranda da yaptığımız konfigürasyon ile ilgili özet bilgi sunuluyor. Finish diyerek işlemi tamamlıyoruz.

 

 

 

Son olarak Start Mirroring’e tıklayarak işlemi tamamlıyoruz. Karşımıza aşağıdaki gibi bir ekran gelmesi gerekiyor. Aşağıdaki ekranda Failover tuşuna basarsanız mirror sunucu principal hale gelecektir.

 

 

Operating mode’da High Performnce(asynchronous) ve High Safety with automatic failover(synchronous) seçeneklerini görüyorsunuz.

 

High Performance(asynchronous): Kullanıcı istekleri principal veritabanına geldiğinde yapılan işlem mirror sunucuya yansıtılmadan kullanıcıya işlem tamamlandı bilgisi iletilir. Daha sonra arka tarafta bu işlem mirror sunucuya aktarılır.

 

High Safety with automatic failover(synchronous): Kullanıcı istekleri principal ve mirror veritabanına yansıtılır ve daha sonra kullanıcıya işlem tamamlandı bilgisi iletilir. Witness sunucu gerektirir. Daha güvenli bir yoldur. Ama iki sunucu arasındaki network’ün yeterli(hızlı ve güvenli) olması gerekir. Principal sunucuda bir sorun olduğunda otomatik olarak kullanıcı istekleri mirror sunucuya yönlendirilir. Daha doğrusu mirror sunucu principal hale gelir.

 

Bu seçeneği daha sonradan da değiştirebilirsiniz. Asenkron yapıp tekrar senkron hale getirebilirsiniz ama:

 

Senkrondan asenkron’a getirdikten sonra witness instance bilgileri kayboluyor. Öncelikle witness instance’ın karşısında çıkan text’e daha önce tanımlamış olduğunuz witness sunucu ve port bilgilerini girmeniz gerekiyor.

 

Aşağıdaki ekran görüntüsünde gördüğünüz üzere High safety with automatic failover disable geliyor ve witness sunucu bilgileri boş gözüküyor.

 

 

Daha sonra aşağıdaki gibi witnes sunucunun bilgilerini girdiğimde  high safety with automatic failover seçilebilir hale geliyor.

Buraya kadar herşey sorunsuz geldiyse şanslısınız demektir. Ben kurulumu test ortamıma yaptığım için bir çok şey hazır değildi ve birkaç sorunla karşılaştım.

 

Sizin ortamınızda aşağıdaki koşulları sağlamıyorsa;

 

Eğer belirttiğiniz portlar iki sunucu arasında açık değilse ya da başka bir process tarafından kullanılıyorsa,

Full backup’ı ve log backup’ı mirror sunucuya norecovey mode’da restore etmediyseniz,

Mirror yaptığınız instance’ların servis hesapları LocalSystem gibi bir hesapla çalışıyorsa,

Tanımladığınız portlar başka bir servis tarafından kullanılıyorsa

 

Aşağıdaki gibi hatalar alabilirsiniz.

 

Birinci Hata:

The Database Mirroring endpoint can not listen on port 5022 because it is in use by another process.

 

 

Bu hatada 5022 portunun başka bir process tarafından kullanıldığını söylüyor. Bu yüzden enpointleri silip bütün işlemi yeniden yaptım ve bu sefer 5026 ve 5027 portlarını set ettim.

 

İkinci Hata:

 

The server network address “TCP://domaindekisunucuismi:5026” can not be reached or does not exist. Check the network address name and that the ports for the local and remote endpoints are operational. (Microsoft SQL Server, Error: 14418)

 

 

Bu hata da mirror yaptığım instance’ların servis hesapları local system’di. Bu instance’ların servis hesaplarını aynı domain hesabı yaptım ve endpointleri silip bütün işlemi tekrar baştan yaptım ve bu sefer sorun almadan gerçekleştirebildim.

 

Siz bu hataları başka sebeplerlede alabilirsiniz.

 

Bu hataları almamak için;

 

Full backup’ı ve log backup’ı mirror sunucuya norecovey mode’da restore ettiğinizden emin olun.

 

Belirlediğiniz portların iki sunucu arasında açık olduğundan emin olun.

 

Cmd komut satırını Run As Administrator ile açıp;

 

“Telnet hedefsunucuipsiyadaismi hedefport” şeklinde yazıp enter’a basın.

 

Hedefle başlayan kısımlarda sizin sunucu ip’nizi ve portunuzu yazmalısınız. Eğer Connecting.. yazıyorsa port kapalı demektir. Kurumunuzun kullandığı firewall da ya da windows üzerindeki firewall da gerekli yetkileri sistem ya da güvenlik grubundan istemelisiniz.

 

Mirror yaptığınız instance’ların servis hesaplarını aynı domain kullanıcısı yapın.

 

Bütün bu yaptığınız işlemlere rağmen hata almaya devam ediyorsanız bütün serverlarda aşağıdaki sorguyu çalıştırın ve endpoint’lerin çalıştığından emin olun.

 

SELECT state_desc FROM sys.database_mirroring_endpoints;

 

Endpointler çalışmıyorsa aşağıdaki script ile çalıştırabilirsiniz.

 

ALTER ENDPOINT endpointismi STATE = STARTED

 

Eğer yine olmuyorsa bütün endpointlere kurulum yaparken tanımladığımız enpointler üzerinde aşağıdaki şekilde yetki vermeyi deneyebilirsiniz.

 

GRANT CONNECT ON ENDPOINT::Mirroring TO [domainismi/userismi]

 

Bu sorun’un sebebi olabilecek ve daha önce benim karşılaştığım tüm nedenleri ve çözümlerini yazdım. Eğer bütün bunlara rağmen sorununuz düzelmediyse bana mail atabilirsiniz.

Loading

Leave Your Comment