Bu makalede AlwaysOn yapısında bulunan tüm dblerin Availabilty Group bazında backup alma işlemini ele alacağım. Ola.hallengren.com sayfasında bulunan MaintenanceSolution.sql scriptinin çalıştırılması lazım. Bu script çalıştırıldıktan sonra master veritabanı altında Programmability altında bulunan Stored Procedures bölümünde ilgili stored procedure’lerin geldiğini görebiliriz.

Not: Ola hallengreen scriptlerinde AG kontrol şartı belirtmeye gerek yoktur. Eğer aşağıdaki gibi default şekilde bırakılırsa tüm ag yapılarının ve stand alone çalışan veritabanlarının backup’ını alır. Bazen belirli AG yapısının backup’ını almak istiyorsak ilgili AG ola hallengreen scriptleriyle belirtilmesi gerekmektedir.
Daha sonra aşağıdaki script’le instance altında bulunan AG’lerin FULL backuplarını otomatik almış oluyoruz.
EXECUTE [dbo].[DatabaseBackup]
@Databases = 'USER_DATABASES',
@Directory = N'B:\BACKUP',
@BackupType = 'FULL',
@Verify = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@CheckSum = 'Y',
@Compress = 'Y',
@LogToTable = 'Y'
1. EXECUTE [dbo].[DatabaseBackup]
- Bu satır, DatabaseBackup adlı bir stored procedure’ü çalıştırır. Bu stored procedure, veritabanı yedekleme işlemlerini gerçekleştirmek için kullanılır.
2. @Databases = ‘USER_DATABASES’
- Bu parametre, hangi veritabanlarının yedekleneceğini belirtir. ‘USER_DATABASES’ değeri, kullanıcı tarafından oluşturulan tüm veritabanlarını yedeklemeyi ifade eder.
3. @Directory = N’B:\BACKUP’
- Bu parametre, yedekleme dosyalarının nereye kaydedileceğini belirtir. Bu örnekte, yedekleme dosyaları B:\BACKUP dizinine kaydedilecektir.
4. @BackupType = ‘FULL’
- Bu parametre, yedekleme türünü belirtir. ‘FULL’ değeri, tam (full) yedekleme yapılacağını ifade eder. Diğer yedekleme türleri arasında ‘DIFF’ (differential) ve ‘LOG’ (transaction log) bulunur.
5. @Verify = ‘Y’
- Bu parametre, yedekleme işlemi tamamlandıktan sonra yedekleme dosyasının doğrulanıp doğrulanmayacağını belirtir. ‘Y’ değeri, yedekleme dosyasının doğrulanacağını ifade eder.
- Yedekleme işlemi tamamlandıktan sonra sistem, oluşturulan yedek dosyasını tekrar okur.
- Okunan veriler kontrol edilir ve yedekleme sırasında beklenen yapıyla uyumlu olup olmadığı test edilir.
- Bu işlem, yedekleme dosyasının gerçekten kullanılabilir ve bozulmamış olup olmadığını doğrulamak içindir.
- Amaç, “yedek alındı” demekle yetinmeyip, “alınan yedek gerçekten geri yüklenebilir mi?” sorusuna önceden cevap vermektir.
6. @CleanupTime = 168
- Bu parametre, yedekleme dosyalarının ne kadar süre sonra silineceğini belirtir. Bu örnekte, 168 saat (7 gün) sonra eski yedekleme dosyaları silinecektir.
- Sen bir yedek alma işlemi başlatırsın.
- Yedek başarıyla alınır.
- Backup yazılımı veya komutu, yedekleme işlemi bittikten hemen sonra mevcut yedek dosyalarının tarihine bakar.
- Eğer bu dosyaların oluşturulma zamanı 168 saatten eskiyse, bu dosyaları otomatik olarak siler.
- CleanupTime=168 gibi bir parametre, yedekleme işlemi sırasında belirtilen hedef (output) dizine bakar ve sadece oradaki eski yedekleri siler.
7. @CleanupMode = ‘AFTER_BACKUP’
- Bu parametre, eski yedekleme dosyalarının ne zaman silineceğini belirtir. ‘AFTER_BACKUP’ değeri, yeni bir yedekleme işlemi tamamlandıktan sonra eski yedekleme dosyalarının silineceğini ifade eder.
8. @CheckSum = ‘Y’
- Bu parametre, yedekleme işlemi sırasında checksum kontrolü yapılıp yapılmayacağını belirtir. ‘Y’ değeri, checksum kontrolü yapılacağını ifade eder. Bu, yedekleme dosyasının bozulup bozulmadığını kontrol etmek için kullanılır.
- Bir dosya yedeklenirken, içeriğine göre bir checksum (örneğin MD5 veya SHA256 gibi) değeri hesaplanır.
- Daha sonra bu yedek geri yüklenmek istendiğinde, dosyanın checksum’ı tekrar hesaplanır ve yedekleme sırasında hesaplanan değerle karşılaştırılır.
- Eğer iki değer aynıysa, dosya bozulmamış demektir.
- Eğer farklıysa, dosya transferi sırasında bir hata olmuş veya dosya bozulmuş olabilir.
9. @Compress = ‘Y’
- Bu parametre, yedekleme dosyalarının sıkıştırılıp sıkıştırılmayacağını belirtir. ‘Y’ değeri, yedekleme dosyalarının sıkıştırılacağını ifade eder. Bu, disk alanından tasarruf sağlar.
10. @LogToTable = ‘Y’
- Bu parametre, yedekleme işlemi sırasında komutların bir tabloya kaydedilip kaydedilmeyeceğini belirtir. ‘Y’ değeri, komutların CommandLog tablosuna kaydedileceğini ifade eder. Bu, yedekleme işlemlerini izlemek ve denetlemek için kullanılır.
Yukarıdaki komutu çalıştırdığımda AlwaysOn altında bulunan AG’leri sırasıyla alt klasör oluşturacak şekilde full backup’ını alıyor. AG altında olmayan backupları ise ayrı bir şekilde aldığını görmüş oluyoruz.




Aynı komutu diff backup için sadece BackupType ifadesinin değiştirilmesi gerekmektedir.
EXECUTE [dbo].[DatabaseBackup]
@Databases = 'USER_DATABASES',
@Directory = N'B:\BACKUP',
@BackupType = 'DIFF',
@Verify = 'Y',
@Compress = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@CheckSum = 'Y',
@LogToTable = 'Y'

Aynı komutu log backup için sadece BackupType ifadesinin değiştirilmesi gerekmektedir.
EXECUTE [dbo].[DatabaseBackup]
@Databases = 'USER_DATABASES',
@Directory = N'B:\BACKUP',
@BackupType = 'LOG',
@Verify = 'Y',
@Compress = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@ChangeBackupType = 'Y' – Bu ifade eğer log yedekleme alınamıyorsa yedekleme türünü değiştirir
@CheckSum = 'Y',
@LogToTable = 'Y'

SQL Server’da bir transaction log yedeği alınabilmesi için veritabanının FULL veya BULK_LOGGED kurtarma modelinde olması ve daha önce bir tam yedek alınmış olması gerekir. Eğer bu koşullar sağlanmamışsa, log yedeği alınamaz. Bu durumda, @ChangeBackupType = ‘Y’ parametresi sayesinde sistem, log yedeği yerine diferansiyel veya tam yedek alarak yedekleme sürecinin kesintiye uğramasını önler.
AlwaysOn’a dahil olan veya olmayan tüm dblerin backup’ını almaya çalıştığımızda bazen büyük dblerin backuplarını çıkarmak isteyebiliriz. Bunun için USER_DATABASE ifadesinden sonra –alınmasını_istemediğimiz_db_ismi yazarak işlemlerimizi gerçekleştiririz. Database ister AG altında olsun veya olması backup işlemlerini gerçekleştirir.
EXECUTE [dbo].[DatabaseBackup]
@Databases = 'USER_DATABASES,-AdventureWorks2012',
@Directory = N'B:\BACKUP',
@BackupType = 'FULL',
@Verify = 'Y',
@Compress = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@CheckSum = 'Y',
@LogToTable = 'Y'
AlwaysOn yapısında olan AG ve AG yapısı olmayan tüm veritabanlarının backup’ını aşağıdaki komutla alabiliriz.
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = N'B:\BACKUP',
@BackupType = 'FULL',
@Compress = 'Y',
@CheckSum = 'Y',
@BufferCount = 50, -- Yedekleme için kullanılacak I/O sayısını belirtir.
@MaxTransferSize = 4194304,-- sql ile disk arasında aktarılacak maksimum byte değeri
@NumberOfFiles = 3 -- aynı şekilde alınacak dosya sayısı 3 defa backup alır anlamına gelecek. Partition backupda diyebiliriz.

AlwaysOn yapısında SADECE belirtilen AG’nin backup’ı alınabilir. Bunun için aşağıdaki komut kullanılır.
EXECUTE [dbo].[DatabaseBackupr]
@AvailabilityGroups= 'AG_NAME',
@Directory = N'E:\BACKUP',
@BackupType = 'FULL',
@Verify = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@CheckSum = 'Y',
@Compress = 'Y',
@LogToTable = 'Y'


Aşağıdaki komut ile de sadece SQLAG altındaki db’lerin DIFF backupların alındığını görmekteyiz.
EXECUTE [dbo].[DatabaseBackup]
@AvailabilityGroups= 'AG_NAME',
@Directory = N'E:\BACKUP',
@BackupType = 'DIFF',
@Verify = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@CheckSum = 'Y',
@Compress = 'Y',
@LogToTable = 'Y'

Aşağıdaki belirtilen kod parçası hangi sunucu primary ise o sunucudan backup almaktadır.
Şunu belirtmek gerekirse aşağıdaki komut replica kontrolü yaptıktan sonra primary olan sunucu üzerinde backup alma işlemi gerçekleşmektedir. Primary sunucusu üzerinde olan tüm AG yapımızın ve stand alone olan veritabanlarının hepsini almaktadır. Secondary sunucusunda ilgili komutu çalıştırdığınızda kodumuzda sadece tamamlandı diye mesaj görürüz.
Sadece belirttiğimiz bir AG altında veritabanı almak istiyorsak @AvailabilityGroups= ‘AG_NAME’ komutunun aşağıdaki kod parçasına eklenmesi gerekmektedir. İlgili @Databases = ‘USER_DATABASES’ parametresinin yerine koyulur.
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
Sadece primary sunucusunda belirttiğimiz bir AG yapımızın backup’ını almak istersek aşağıdaki komut kullanılmaktadır. Primary sunucusu değilse hata mesajı vermektedir.
Sadece ola scriptleriyle backup çalıştırılması sadece primary sunucundan backup alındığını görmüş olacağız.
DECLARE @IsPrimary int
SET @IsPrimary = 0
SELECT @IsPrimary = 1
FROM sys.availability_groups sag
INNER JOIN sys.dm_hadr_availability_group_states hags ON sag.group_id = hags.group_id
WHERE hags.primary_replica = @@SERVERNAME AND sag.name = 'AG_NAME'
IF @IsPrimary = 1
BEGIN
EXECUTE [dbo].[DatabaseBackup]
@AvailabilityGroups= 'AG_NAME',
@Directory = N'E:\BACKUP',
@BackupType = 'FULL',
@Verify = 'Y',
@CleanupTime = 168,
@CleanupMode = 'AFTER_BACKUP',
@CheckSum = 'Y',
@Compress = 'Y',
@LogToTable = 'Y'
END
ELSE
BEGIN
RAISERROR ('Database is running as secondary', 16, 1)
END

Başka makalede görüşmek dileğiyle..
“Şüphesiz Allah katında din İslam’dır. Kitap verilmiş olanlar, kendilerine ilim geldikten sonra sırf, aralarındaki ihtiras ve aşırılık yüzünden ayrılığa düştüler. Kim Allah’ın âyetlerini inkar ederse, bilsin ki Allah hesabı çok çabuk görendir. “Âl-i İmrân -19