SQL Server Log Shipping
Log Shipping SQL Server’ın High Availability olarak adlandırılan Yüksek Erişilebilirlik teknolojilerinden biridir.Bu işlem bir ana sunucu,bir yedek sunucu ve opsiyonel olarak monitörleme yapan sunucudan oluşmaktadır.Burada yaptığımız işlemler SQL Server Agent Servisi tarafından sağlandığından msdb sistem veritabanının bakımı ve izlenmesi önem taşımaktadır.Bu işlemlerde job’ların çalışma zamanı iyi ayarlanmalı sunucudaki diğer joblarla çalışma vakti olarak çakışmaması hem SQL Server Log Shipping performansı hem de sistem performansı açısından daha sağlıklı olacaktır.Gelin SQL Server Log Shipping teknolojisi nasıl çalışır ona bakalım.
SQL Server Log Shipping işlemini gerçekleştirirken veritabanımızın Full veya Bulk-Logged Recovery Model’e sahip olması gerektiğini vurgulamak isterim.Çünkü Log Shipping işlemi kısaca özetlemek gerekirse ana sunucudaki veritabanında gerçekleşen işlemleri belirlenmiş periyotlarla yedek sunucuya aktarma işlemi diyebiliriz ve bu Transaction Log Backup aracılığıyla sağlanmaktadır.Simple Recovery Model Transaction Log Backup alınmasına izin vermediğinden bu Recovery Model’e sahip veritabanlarında Log Shipping işlemi gerçekleştiremeyiz.Bunu belirttikten sonra Transaction Log Backup alabilmemiz için ilk önce bir Full Backup almamız gerekir.Bu bilgileri öğrendikten sonra Log Shipping işlemi sırasıyla nasıl gerçekleşiyor onu açıklayalım.İlk önce ana sunucudaki veritabanının Full Backup’ını yedek sunucudaki restore işlemi yapılırken erişebileceği bir dosyaya(yaygın olarak Shared Folder kullanılır)alınır.Daha sonra aldığımız bu Full Backup yedek sunucuda restore edilir.Son olarak ise ana sunucudaki veritabanının belirli periyotlarla alınan Transaction Log Backupları yedek sunucuya kopyalanır ve o sunucuda restore işlemi gerçekleştirilerek bu süreç devam eder.SQL Server üzerinde bir uygulama ile süreci daha detaylı olarak görelim.
Ana Sunucu:ALWAYSON1
Yedek Sunucu:ALWAYSON2
Ana Sunucu olan ALWASON1 üzerinde LOGSHIPPINGDB adında Recovery Model’i Full olan bir veritabanı oluşturdum.
Veritabanı üzerinde Hesap adında bir tablo oluşturdum ve tabloya birkaç kayıt ekledim.Bu işlemleri gerçekleştirdikten sonra gelin bu veritabanı üzerinde Log Shipping işlemini gerçekleştirelim.
İlgili veritabanımız üzerinde sağ tık “Properties” seçeneğine tıklayıp “Select a Page” sekmesi altındaki “Transaction Log Shipping” kısmına geliyoruz.”Enable this as a primary database in a log shipping configuration” seçeneği ile Log Shipping işlemini aktif edip bu sunucudaki veritabanını primary database olarak belirliyoruz.Daha sonra “Backup Settings” butonuna tıklayarak backup işlemleri ile ilgili jobların başarıyla gerçekleşmesi için dosya yolu ve jobların çalışma vakitlerini belirtiyoruz.
Bu kısımda “Network path to backup folder” kısmı için ana sunucu üzerindeki disk içine LogShipping adında bir klasör açıp bu dosyayı paylaşıma açıyorum.
Burada benim Administrators(SQLALWAYSON\Administrators) kullanıcım iki sunucuda da Database Engine ve SQL Server Agent Servisi için en yetkili kullanıcı olduğu için bu klasörde de Full yetkiye sahip.Bu uygulamayı gerçekleştirecek arkadaşlar burada Everyone’a Full Control vererek problemle karşılaşmadan işlemlerini gerçekleştirebilirler.
Yani burada “Network path to backup folder” kısmına oluşturduğumuz paylaşımlı klasörün yolunu “\\ALWAYSON1\LogShipping” yazmalıyız.Altındaki seçenekte bu oluşturduğumuz dosya ana sunucuda mevcutsa onunda yolunu belirtmemizi istiyor bu kısımada “C:\LogShipping”yazmalıyız.Daha sonra bu backup işlemlerin ne sıklıkla ve ne zaman gerçekleşeceği belirtmek için “Schedule” butonuna tıklıyoruz.
Bu job’ın ve diğer job’ların her 5 dakikada bir çalışması için ayarlayacağım o yüzden yazımın ilerleyen kısımlarında Schedule ayarlarını tekrardan göstermeyeceğim dediğim gibi hepsinin 5 dakikada bir çalışması için ayarlıyorum.
Ana sunumuz ile ilgili bilgileri ayarladıktan sonra sıra geldi yedek sunucumuz ile ilgili ayarları yapmaya.Burada “Secondary Databases” kısmındaki “Add” butonuna tıklayarak yedek sunucumuzu belirtiyoruz.
Burada yedek sunucumuz olan “ALWAYSON2”’ye bağlanıyoruz.Secondary database kısmınada istersek Primary Database ile aynı ismi verip ya da yeni bir database oluşturup istediğimiz adı verebiliriz.”Yes generate a full backup of the primary database and restore it into the secondary database(and create the secondary database if it doesn’t exist” seçeneği işaretlememizin nedeni biz bu veritabanını ana sunucumuzda yeni oluşturduğumuzdan bir Full Backup’ı mevcut değil bu seçeneği işaretleyerek bir Full Backup aldırtıp bunu yedek sunucumuza restore etmesini istiyoruz.Eğer sizin veritabanınızın FullBackup’ı mevcut ise 2.seçeneği seçerek Backup file’ını belirtebilirsiniz.
“Restore Options…” butonuna tıklayarak restore ayarlarını yapmalısınız.
Copy Files sekmesine gelerek ana sunucudan gelen Transaction Log Backup dosyalarının yedek sunucuda nereye kopyalanacağını belirtiyoruz.Burada dikkat etmişsinizdir ki “This folder is usually located on the secondary server.” olarak belirtilmekte yani bu dosyayı genellikle yedek sunucuda oluşturmalıyız.
Yedek sunucu üzerinde de aynı dosya adına sahip bir klasör oluşturdum.
Restore Transaction Log kısmı bizim için önemlidir.Çünkü eğer biz yedek sunucu üzerindende bu veritabanında raporlama yapmak istiyorsak “Stanby mode” seçeneğini işaretlemeliyiz.”No recovery mode”seçeneğini işaretlersek yedek sunucuda bu veritabanı erişilemez olacaktır.Ben bu uygulamada yedek sunucuda sorgulama yapacağım için “Standby mode”seçeneğini işaretledim.”Disconnect users in the database when restoring backups” seçeneğinide işaretleyerek alınan log backupların yedek sunucuya restore edildiği anda bu veritabanına bağlı kullanıcıların bağlantılarını koparmak istediğimi belirtiyorum.
Görmüş olduğunuz gibi Log Shipping işlemimiz başarıyla gerçekleşti.Gelin incelemeleri ve testlermizi gerçekleştirelim.
Yedek sunucumuza bağlantı sağladığımızda görmekteyizki veritabanımız gelmiş ve (Stanby/Read-Only) modunda yani biz yedek sunucu üstünde raporlama için veritabanına bağlantı sağlayabiliriz ancak Insert,Update,Delete gibi işlemleri gerçekleştiremeyiz.
Bahsetmiş olduğumuz gibi yedek sunucuda sorgulama işlemi yapabiliyoruz ama görmüş olduğunuz gibi insert işlemini gerçekleştiremedik.
Ana sunucumuzda tablomuza iki yeni kayıt ekledik.
Ana sunucumuzda tablomuzu okumak istediğimizde eklemiş olduğumuz kayıtlarla birlikte tüm kayıtları görebildik.
Ama yedek sunucumuzda aynı select işlemini gerçekleştirdiğimizde eklenen 2 kayıtı göremiyoruz.Çünkü ana sunucudaki transaction log backup daha yedek sunucuya kopyalanmadı ve restore edilmedi.Kopyalama ve restore işlemi gerçekleştirdikten sonra tekrardan aynı sorguyu çalıştırdığımızda iki kayıtında geldiğini görmekteyiz.
Log Shipping işlemi ile birlikte oluşan jobları görmek için SQL Server Agent altındaki Jobs kısmına bakarsak oluşan jobları görebiliriz.Bir kez daha hatırlatmakta fayda varki Log Shipping işleminde SQL Server Agent servisinin önemi büyük o yüzden SQL Server Agent servisinin çalışıyor olması ve buna bağlı olarak msdb sistem veritabanının bakımı ve performansı takip edilmesi Log Shipping işleminin devamlılığı için çok önemlidir.