ALWAYS ON VERİ EŞİTLEME(JOIN ONLY)
SQL Server ortamlarında yüksek erişilebilirlik sağlamak adına kullanılan AlwaysOn Availability Group yapısı, doğru adımlarla yapılandırıldığında kritik verilerin kesintisiz ve senkronize biçimde çalışmasına olanak tanır. Bu yazımızda, halihazırda Primary (aktif) sunucuda bulunan bir veritabanının, Secondary (yedek) sunucuya veri kaybı yaşanmadan nasıl taşınacağı ve ardından JOIN ONLY yöntemiyle Availability Group’a nasıl dahil edileceğini adım adım ele alıyoruz.
Senaryomuzun Amacı
Amacımız, Primary SQL Server sunucusundaki bir veritabanını, veri bütünlüğünü bozmadan Secondary sunucuya aktarmak ve ardından bu veritabanını AlwaysOn grubuna senkronize şekilde dahil etmektir. Böylece veritabanı her iki sunucuda da eş zamanlı olarak çalışabilir hale gelir.
Uygulama Adımları
Full Backup Alma:
İlk olarak, Primary sunucuda ilgili veritabanının tam yedeği alınır ya da elinizde ki son full backup ile işlemleri gerçekleştirebilirsiniz.
BACKUP DATABASE [VeritabaniAdi]
TO DISK = N'\\yedekleme\full\VeritabaniAdi_FULL.bak'
WITH INIT, COMPRESSION;
- [VeritabaniAdi]: Yedeği alınacak veritabanının adıdır. Örneğin CRMDB, ERP vb.
- TO DISK: Yedeğin nereye kaydedileceğini belirtir. Burada ağ üzerinde bir klasör (\\yedekleme\full\) kullanılmaktadır.
- WITH INIT: Belirtilen yedek dosyası daha önceden varsa, üzerine yazılmasını sağlar. Eski içerik silinir.
- COMPRESSION: Yedeğin sıkıştırılarak alınmasını sağlar. Bu sayede disk alanı daha verimli kullanılır.
Transaction Log Backup Alma:
Ardından, sistemde yapılmış olan işlemleri kapsayan bir veya birden fazla log yedeği alınır ya da elinizde ki log backuplar ile işlemleri gerçekleştirebilirsiniz.
BACKUP LOG [VeritabaniAdi]
TO DISK = N'\\yedekleme\log\VeritabaniAdi_LOG1.trn'
WITH INIT;
- [VeritabaniAdi]: Log yedeği alınacak veritabanının adı.
- TO DISK: Yedek dosyasının kaydedileceği konumu belirtir. Bu örnekte \\yedekleme\log\ klasörüne .trn uzantılı olarak kaydediliyor.
- WITH INIT: Belirtilen dosya daha önce oluşturulmuşsa üzerine yazılmasını sağlar.
🔸 Not: Birden fazla Transaction Log yedeği alınacaksa, her biri ayrı dosyaya kaydedilmelidir (örneğin LOG1.trn, LOG2.trn, …). Bu yedekler sırasıyla Secondary sunucuda geri yüklenmelidir.
Bu adım, veritabanındaki en güncel işlemlerin de yedeklenmesini sağlayarak veri kaybı riskini ortadan kaldırır.
Tail Log Backup Alın (Opsiyonel ama önerilir):
BACKUP LOG [VeritabaniAdi]
TO DISK = N'\\yedekleme\log\VeritabaniAdi_TAIL.trn'
WITH INIT;
- [VeritabaniAdi]: Tail-log yedeği alınacak veritabanının adı.
- TO DISK: Yedek dosyasının kaydedileceği tam konumu belirtir.
- WITH INIT: Yedek dosyası varsa üzerine yazar.
🔸 Not: Tail Log Backup, sistem aniden kapanmadan önceki son işlemleri de yakalayarak veri kaybını sıfıra indirir.
Elimizde backup olmadığı durumda yukarıdaki backuplama işlemlerini uygulamalıyız ya da elimizde bulunan backuplar yeterli ise bundan sonrasında restore işlemlerine devam ediyor olacağız.
Neden Recovery Yapılmıyor?
AlwaysOn yapılarına veritabanı eklenirken, veritabanının daha önce alınmış yedeklerden restore edilmiş olması ve RECOVERY yapılmamış olması gerekir. Bunun nedeni:
- Log zincirinin (log chain) kesilmemesi gerekir.
- Veritabanı, gruba dahil edilirken SQL Server zaten RECOVERY işlemini kendi içinde yapar.
- Eğer önceden RECOVERY uygulanırsa, JOIN işlemi başarısız olur.
Full Backup Restore(WITH NORECOVERY)
Primary sunucudan alınan tam yedek (Full Backup), Secondary sunucuda NORECOVERY modunda geri yüklenmelidir:
RESTORE DATABASE [VeritabaniAdi]
FROM DISK = N'\\yedekleme\full\VeritabaniAdi_FULL.bak'
WITH NORECOVERY, REPLACE;
- [VeritabaniAdi]: Geri yüklenecek veritabanının adı.
- FROM DISK: Tam yedek dosyasının bulunduğu konumu belirtir (Secondary sunucuya kopyalanmış olmalıdır).
- WITH NORECOVERY: Veritabanı henüz çevrimiçi yapılmaz. Bu sayede log yedeklerinin yüklenmesine olanak tanınır. AlwaysOn yapılandırması için bu gereklidir.
- WITH REPLACE: Eğer aynı isimde bir veritabanı zaten varsa, üzerine yazılmasını sağlar.
🔸 Not: REPLACE parametresi dikkatli kullanılmalıdır. Aynı isimde çalışan bir veritabanı varsa veriler geri döndürülemez şekilde silinebilir.
Log Backup’ı Restore(WITH NORECOVERY)
RESTORE LOG [VeritabaniAdi]
FROM DISK = N'\\yedekleme\log\VeritabaniAdi_LOG1.trn'
WITH NORECOVERY;
- [VeritabaniAdi]: Log yedeği geri yüklenecek veritabanının adı.
- FROM DISK: Log yedeği dosyasının tam yolunu belirtir. (LOG1.trn, LOG2.trn, … şeklinde sıralı olabilir)
- WITH NORECOVERY: Bu parametre sayesinde, birden fazla log yedeği art arda yüklenebilir. Her bir yedekten sonra veritabanı “RESTORING” modunda kalır.
🔸 Not: Birden fazla log yedeği varsa, log yedeklerinin alınma sırasına göre yüklenmesi gerekir. Örneğin:
RESTORE LOG [VeritabaniAdi]
FROM DISK = N'\\yedekleme\log\VeritabaniAdi_LOG1.trn'
WITH NORECOVERY;
RESTORE LOG [VeritabaniAdi]
FROM DISK = N'\\yedekleme\log\VeritabaniAdi_LOG2.trn'
WITH NORECOVERY;
Tail Log Restore(Varsa – WITH NORECOVERY)
Tüm Transaction Log yedeklerinden sonra, eğer alınmışsa Tail-Log Backup da yine NORECOVERY modunda yüklenmelidir:
RESTORE LOG [VeritabaniAdi]
FROM DISK = N'\\yedekleme\log\VeritabaniAdi_TAIL.trn'
WITH NORECOVERY;
- [VeritabaniAdi]: Tail-log yedeği geri yüklenecek veritabanının adı.
- FROM DISK: Tail-log yedeğinin bulunduğu tam dosya yolu.
- WITH NORECOVERY: Veritabanı restore işleminden sonra da çevrimiçi yapılmaz; bu şekilde AlwaysOn grubuna katılmaya hazır hale getirilir.
🔸 Not: Bu adım yalnızca Tail-Log Backup alındıysa uygulanır. Eğer alınmadıysa, doğrudan log yedeklerinden sonra AlwaysOn grubuna JOIN ONLY yöntemiyle dahil etme adımına geçilebilir.
📌 Önemli:
Yedeklerin tamamı NORECOVERY ile yüklenmeli. Kesinlikle RECOVERY yapılmamalı. Aksi takdirde AlwaysOn grubuna katılamaz.
AlwaysOn Grubuna JOIN ONLY ile Dahil Etme
Secondary sunucuda restore işlemleri tamamlandıktan sonra, veritabanını Availability Group’a senkronize biçimde dahil etmek için aşağıdaki komut kullanılır:
ALTER DATABASE [VeritabaniAdi]
SET HADR AVAILABILITY GROUP = [AG_ADI];
- Bu işlem sırasında SQL Server, veritabanını otomatik olarak senkronize eder ve RECOVERY işlemini kendisi gerçekleştirir.
- “JOIN ONLY” doğrudan yazılmaz ama bu mantık arka planda çalışır.
Bu işlemleri komutlar ile yapabileceğimiz gibi SSMS( SQL Server Management Studio) ile de yapabiliriz.
- Availability Group’unuza sağ tıklayın → Add Database… seçeneğine tıklayın.
- Açılan pencerede, AG’ye eklenmeye uygun olan veritabanları listelenir. Eğer veritabanı Restoring modundaysa, listede görünür.Eklemek istediğiniz veritabanını işaretleyin.
- Secondary sunucuda “Join Only” modunda olduğu için, “Readiness” kısmında “Joined (RESTORING)” olarak görünmelidir.
- Uyarı ya da hata varsa, en altta açıklamalar bölümünde nedenini görebilirsiniz.
- “Next” butonuna tıklayarak ilerleyin → Özet ekranını kontrol edin → “Finish” butonuna tıklayarak işlemi tamamlayın.
İşlem tamamlandıktan sonra:
- Veritabanı hem Primary hem de Secondary node altında “Synchronized” ya da “Synchronizing” olarak görünmelidir.
- Sağlıklı bir eşleşme varsa, Secondary sunucu loglarında successful join bilgisi yer alır.
Süreç İçerisinde Dikkat Edilmesi Gerekenler
- Primary sunucuda FULL → LOG → TAIL LOG yedekleri alınır.
- Secondary sunucuda sırasıyla hepsi WITH NORECOVERY ile yüklenir.
- Veritabanı JOIN komutuyla gruba dahil edilir (SQL Server RECOVERY’yi burada yapar).
Kritik Noktalar:
- Tüm restore işlemleri WITH NORECOVERY olmalı.
- WITH RECOVERY yapılırsa işlem geçersiz olur.
- Log zinciri kesilmemeli, yedekler ardışık olmalı.
- Veritabanı isimleri ve yapılandırmaları birebir aynı olmalı.
- Saat farkı, ağ gecikmesi gibi senkronizasyon hatalarına dikkat edilmeli.
Özetle bu yöntemle Veri kaybı yaşanmaz, Planlı bir geçiş gerçekleştirilir ve AlwaysOn ortamına temiz ve güvenli bir şekilde dahil olunur.