MSSQL Server AlwaysOn’da Secondary Only Yöntemi ile Backup Alma

Bu makalede Alwayson yapımızda secondary only yöntemiyle backup alma işlemini ele almış olacağız. Primary yöntemiyle backup alma işleminin tam tersi olarak karşımıza çıkmaktadır. Bu yöntemle backuplarımızın sadece secondary sunucusu üzerinden backup alma işlemini yapmış olacağız.

Not: Herhangi bir AG altında bulunan veritabanımızın backup’ını almak istiyorsak backup alma işlemini sadece AG yapımızı belirterek backup almamız gerekmektedir. 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 hemde 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.

Herhangi bir AG properties ekranında Secondary only yapısı aktif edilir.

AG2 üzerinden yapımızı aktif ettikten sonra backup işlemlerimizi secondary ve primary sunucusundan deneyelim.

Aşağıdaki komutumuz ilk bölümünde işlem yapılacak AG rolümüzü alıyoruz. Eğer AG adı doğruysa, bu sunucu secondary replica ise ve backup için tercih edilen replica ise yani sys.fn_hadr_backup_is_preferred_replica(‘DB7’) ifadesiyle backup alınacak AG altındaki veritabanını garantilemiş oluyoruz. Bu select ifadesinin çalıştırılması secondary replica ise sonucun 1 dönmesini sağlayacaktır. Eğer 0 ifade backup komutumuz çalışmamış olacaktır.

Kısacası SELECT sys.fn_hadr_backup_is_preferred_replica(‘DB7’) komutu, belirli bir veritabanı (DB7) için mevcut sunucunun backup için tercih edilen replica olup olmadığını kontrol eder. Bu fonksiyon, Always On Availability Groups (AG) yapılarında backup işlemlerini yönetmek için kullanılır.

DECLARE @tsql NVARCHAR(MAX) = '';
DECLARE @AGName NVARCHAR(50);
DECLARE @RoleDesc NVARCHAR(60);

SELECT 
    @AGName = grp.ag_name,
    @RoleDesc = a.role_desc
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.group_id = (SELECT group_id FROM sys.availability_groups WHERE name = 'AG2');

IF @AGName = 'AG2' AND @RoleDesc = 'SECONDARY' AND (SELECT sys.fn_hadr_backup_is_preferred_replica('DB7')) = 1
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
ELSE
BEGIN
    PRINT N'Bu sunucu secondary replica değil, backup için tercih edilen replica değil veya AG adı eşleşmiyor. Backup işlemi yapılmadı.';
END

Yukarıdaki komutu Primary olan replicamız üzerinde bulunan ilgili AG altında çalıştırdığımızda bu replicadan backup alınamayacağına dair mesaj almış oluruz.

Aynı komutu secondary sunucusu üzerinde çalıştırdığımızda işlemin başarılı ile sonuçlandığını görmüş oluyoruz. İlgili komutun secondary sunucusunda çalıştırılması yeterli değildir. Backup komutumuzun içeriğine copy_only seçeneğinin eklenmesi gerekmektedir.

DECLARE @tsql NVARCHAR(MAX) = '';
DECLARE @AGName NVARCHAR(50);
DECLARE @RoleDesc NVARCHAR(60);

-- Availability Group adını ve replica rolünü al
SELECT 
    @AGName = grp.ag_name,
    @RoleDesc = a.role_desc
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.group_id = (SELECT group_id FROM sys.availability_groups WHERE name = 'AG2');

-- Eğer AG adı doğruysa, bu sunucu secondary replica ise ve backup için tercih edilen replica ise
IF @AGName = 'AG2' AND @RoleDesc = 'SECONDARY' AND (SELECT sys.fn_hadr_backup_is_preferred_replica('DB7')) = 1
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',
    @CopyOnly = 'Y';  
END
ELSE
BEGIN
    PRINT N'Bu sunucu secondary replica değil, backup için tercih edilen replica değil veya AG adı eşleşmiyor. Backup işlemi yapılmadı.';
END

Aşağıdaki ekran resminde backup’ın secondary sunucusunda başarılı bir şekilde alındığını görmüş oluyoruz.

Resimde dikkat ederseniz sadece Secondary only seçeneği aktif olan AG yapımızın backup’ının alındığını görmekteyiz. Stand alone veritabanları için bir sıkıntı olmadığını dile getirmiştik.

Bu makalede Secondary Only Yöntemi ile Backup Alma işlemini görmüş olduk. Başka bir makalede görüşmek dileğiyle..

“Demek ki, zorlukla beraber bir kolaylık var.” İnşirah-5

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir