Bu makalede AlwaysOn backup yöntemlerinden primary yöntemiyle backup alınmasına değineceğiz.
Primary seçeneği genelde tavsiye edilmeyen bir yöntem ama eğer differential backup alacaksak bu seçeneğin seçilmesi gerekmektedir. Çünkü diff backup secondary sunucularından alınmaz.
Not: Herhangi bir AG altında bulunan veritabanımızın backup’ını almak istiyorsak backup alma işlemini AG yapımızı belirterek veya ola hallengren scriptleri ile backup almamız gerekmektedir. ola.hallengren scriptlerinde AG şartı bırakmamıza gerek yoktur. Script kendi içerisinde yapmaktadır. Ne kadar AG properties ekranından backup alınacak sunucuyu değiştirsek bile secondary sunucusudan backup işlemi gerçekleşmez. Secondary sunucusunda full backup sadece copy only yöntemiyle alınmaktadır. Secondary sunucusunda log backup hem copy only hem de normal bir şekilde alınmaktadır. Diff backup ise ne copy only nede normal bir diff backup şekilde alınmaz. Tabi bunlar AG altında bulunan veritabanları için geçerli bir özelliktir.
AlwaysOn ekranında Backup Preferences kısmından Primary sunucusundan backup alma yöntemi olan seçeneği seçiyoruz.

SSMS arayüzünde ola.hallengren scriptlerini çalıştırdığımızda primary olan sunucu üzerinde AG ve AG altında olmayan tüm veritabanlarımızın backuplarını aldığını görmüş oluruz. Secondary sunucusunda çalışan bu sorgu sadece stand alone olan veritabanlarının backuplarını almaktadır.
EXECUTE [dbo].[DatabaseBackup]
@Databases = 'USER_DATABASES',
@Directory = N'E:\BACKUP',
@BackupType = 'FULL',
@Verify = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@CheckSum = 'Y',
@Compress = 'Y',
@LogToTable = 'Y'

Yukarıdaki komutun aynısını secondary sunucusunda çalıştırdığımızda backup işleminin sadece stand alone veritabanları üzerinde gerçekleştiği AG altındaki veritabanları için gerçekleşmemiş olduğunu görmüş oluyoruz.

Gerçek ortamlarda backup alma işlemimiz bir job aracılığıyla gerçekleştiği için aşağıdaki komut yardımıyla AG kontrolü yapıldıktan sonra backup işlemimiz gerçekleşmektedir. Bu Ag kontrol yapısını oluşturulmasına gerek yoktur. Çünkü ola hallen green scriptleri kullanılıyorsa kendi içerisinde ag kontrolü sağlıyor. İnstance üzerinde birden fazla AG yapımız varsa backup işlemi gerçekleşmez. Çünkü aşağıdaki script en son eklenen AG yapımızı referans almaktadır.
DECLARE @tsql nvarchar(max)=''
DECLARE @AGName nvarchar(50)
SELECT @AGName=grp.ag_name
FROM sys.dm_hadr_availability_replica_states AS a JOIN
sys.availability_replicas AS b ON b.replica_id = a.replica_id left outer join
sys.dm_hadr_name_id_map as grp on grp.ag_id = a.group_id
WHERE a.role=1
IF @AGName = 'AG_NAME'
BEGIN
EXECUTE [dbo].[DatabaseBackup]
@Databases = 'USER_DATABASES',
@Directory = N'E:\BACKUP',
@BackupType = 'FULL',
@Verify = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@CheckSum = 'Y',
@Compress = 'Y',
@LogToTable = 'Y'
END

Secondary sunucusunda ilgili komutu çalıştırdıktan sonra Backup işleminin gerçekleşmediğini görmüş oluyoruz.

Yukarıda bulunan kontrol komutunu çalıştırdıktan sonra primary sunucusunda AG2 isminin geldiği görülmektedir. Aşağıdaki dönen ifadedeki AG ismini komutumuzda girdikten sonra belirtilen AG ile birlikte primary sunucusu altında bulunan diğer farklı AG’lerinde backup işlemi gerçekleşmiş olur.

Aynı komut secondary sunucusunda çalıştırıldığında ise NULL değeri dönmektedir. Komut çalışmaz.

Yukarıda yapmış olduğumuz işlemlerin tam tersi olan işlem Secondary only yöntemidir. Bu yöntem ile veritabanı backupları secondary sunucunda alınmasına rağmen primary sunucunda alınmaz.
Makalemizi bitirmeden önce önemli bir konuya değinmek istiyorum. Primary sunucusunda log backup alındıktan sonra otomatik olarak truncate olur. Secondary sunucusuna halen gönderilmemiş olan loglarında truncate olması demek bu gibi durumda secondary sunucusu verileri nasıl almaktadır.
Normalde bir log backupı aldığınızda, BACKUP LOG ... WITH TRUNCATE_ONLY gibi eski bir syntax kullanmıyorsanız, backup işlemi başarılı olduğunda log dosyasındaki backup’ı alınmış kısımları truncate etmeye (yani boşaltmaya) izin verir. Bu, log dosyasının sonsuz büyümesini engellemek içindir.
Primary’de Log Backupı Alınırsınız: BACKUP LOG [MyDB] TO DISK = '...'
SQL Server Arka Planda Şunu Yapar: Backup işlemi, fiziksel log dosyasındaki (LDF) şu ana kadar yazılmış tüm log kayıtlarını yedekler. Bu, secondary’e gönderilmemiş olanları DAHİL eder. Backup işlemi başarıyla tamamlandığında, bir “Log Truncation LSN” noktası belirlenir. Bu nokta, backupın içerdiği son LSN’dir. Ancak! Primary, log dosyasını hemen bu LSN noktasından itibaren truncate etmez (temizlemez). Önce bekler. Primary, bu Log Truncation LSN bilgisini secondary sunucuya iletir ve onay bekler. Secondary sunucu, primary’den gelen “Log Truncation LSN” bilgisini alır.
Secondary, kendi üzerindeki log kuyruğuna (redo queue) bakar. “Ben bu LSN’ye kadarki tüm log kayıtlarını zaten aldım ve diske yazdım mı?” diye kontrol eder. Eğer bu LSN’ye kadar olan tüm kayıtları işlemişse (hardened), primary’e “Tamam, ben bu noktaya kadar olan her şeyi güvende saklıyorum, sen artık logunu o noktadan itibaren temizleyebilirsin” şeklinde bir onay (acknowledgement) gönderir.
Primary, secondary’den gelen bu onayı aldığında, artık log dosyasını güvenle Truncation LSN noktasından itibaren kesip temizleyebilir (truncate). Eğer secondary henüz o LSN’ye ulaşmamışsa (örneğin ağ yavaşsa veya secondary yüklüyse), onay gelmez. Primary log dosyasını temizleyemez ve büyümeye devam eder. Bu da bize “log send queue”nin büyüdüğünü ve bir gecikme olduğunu gösteren bir uyarı işaretidir.
Kısacası secondary sunucusundan onay gelmeden log truncate edilmez. Primary, backupı aldıktan sonra secondary’e “Ben X LSN’sine kadar olan kısmı yedekledim ve senin de onayını bekliyorum” der. Secondary, o LSN’ye kadar olan kayıtları almadıysa, onay göndermez. Onay gelmediği için Primary log’u truncate EDEMEZ. LDF dosyası büyümeye devam eder. Secondary, bağlantılar/performans düzeldiğinde, o kayıtları almaya devam eder. Onları aldığı ve diske yazdığı anda, primary’e onayını gönderir. Ancak ondan sonra primary log’u temizler.
Secondary sunucusunda backup alma makalesinde görüşmek dileğiyle..
“Onlar gaybe inanırlar, namazı dosdoğru kılarlar, kendilerine rızık olarak verdiğimizden de Allah yolunda harcarlar.” Bakara-3