Πώς μπορούμε να εκτελούμε backups και λοιπά Agent jobs σε Always On Availability Group του SQL Server

Πώς μπορούμε να εκτελούμε backups και λοιπά Agent jobs σε Always On Availability Group του SQL Server
Πώς μπορούμε να εκτελούμε backups και λοιπά Agent jobs σε Always On Availability Group του SQL Server

Σε αυτό το άρθρο θα δούμε πώς γίνεται να παίρνουμε backup και να τρέχουμε jobs σε όποιον server έχει τον Primary ρόλο ή είναι Preferred Backup Replica σε ένα Always On Availability Group του SQL Server.

Κατά την εγκατάσταση ενός standard Availability Group σε Enterprise SQL Server, μας ζητάει που θέλουμε να παίρνει τα database backups. Ως default τιμή έχει την επιλογή Prefer Secondary. Όμως υπάρχει ένα πρόβλημα. Στην secondary replica επιτρέπει μόνο την εκτέλεση COPY_ONLY Full backup και καθόλου Differential backup:

Πώς μπορούμε να εκτελούμε backups και λοιπά Agent jobs σε Always On Availability Group του SQL Server
01

Για να το λύσουμε αυτό το πρόβλημα και να είναι η εγκατάσταση μας λιγότερο πολύπλοκη, θα ορίσουμε να εκτελούνται όλα τα backup και λοιπά jobs για maintenance και όχι μόνο, σε όποια replica της βάσης δεδομένων είναι Preffered Backup Replica ή Primary Replica άνα περίπτωση.

Τα βήματα

Για τα Database Backup

Πάμε στον Object Explorer του SSMS και επιλέγουμε Always On High Availability, Availability Groups και κάνουνουμε δεξί κλικ Properties στο group:

Πώς μπορούμε να εκτελούμε backups και λοιπά Agent jobs σε Always On Availability Group του SQL Server
02

Με το που εμφανιστεί ο Wizard στα Backup Preferences επιλέγουμε Primary και OK:

Πώς μπορούμε να εκτελούμε backups και λοιπά Agent jobs σε Always On Availability Group του SQL Server
03

Ο παρακάτω κώδικάς ελέγχει αν είναι η Preffered Backup Replica και αν δεν είναι εμφανίζει σφάλμα. Η default συμπεριφορά του SQL Server Agent, είναι να σταματάει το job αν κάποιο step εμφανίσει σφάλμα:

DECLARE @preferredReplica int
SET @preferredReplica = (SELECT 
  max(cast(sys.fn_hadr_backup_is_preferred_replica (database_name) as int)) AS IsPreferredBackupReplicaNow
FROM sys.availability_databases_cluster)

IF (@preferredReplica = 0)
BEGIN
RAISERROR ('No backup produced as this server, is not the preferred replica for backups.  Please run the job again from the preferred replica.', 16, 1)
END;

Τον κώδικα τον προσθέτουμε στο SQL Server Agent job που θέλουμε. Για να γίνει αυτό επιλέγουμε το Job, Steps(1), New…(2) , προσθέτουμε τον κώδικα(3), ορίζουμε να είναι Start Step(4) και πρώτο στο Job step list(5) :

Πώς μπορούμε να εκτελούμε backups και λοιπά Agent jobs σε Always On Availability Group του SQL Server
04

Οπότε έχοντας φτιάξει το το SQL Server Agent Job σε όλα τα nodes/servers του Availability Group αυτό θα εκτελέστεί μόνο σε όποιο είναι Primary αυτή τη στιγμή.

Μπορούμε φυσικά να το κάνουμε λίγο πιο πολύπλοκο και να έχουμε τον κωδικά του Backup και τον έλεγχο του Preferred Replica στο ίδιο step:

DECLARE @preferredReplica int
SET @preferredReplica = (SELECT 
  max(cast(sys.fn_hadr_backup_is_preferred_replica (database_name) as int)) AS IsPreferredBackupReplicaNow
FROM sys.availability_databases_cluster)

IF (@preferredReplica = 0)
	RAISERROR ('No backup produced as this server, is not the preferred replica for backups.  Please run the job again from the preferred replica.', 16, 1)
ELSE
    EXEC msdb.dbo.sp_start_job N'DatabaseBackup - USER_DATABASES - FULL'; 

Για Database Integrity Check

Κάπου εδώ θα πρέπει να αναφέρουμε ότι η ίδια διαδικασία μπορεί να λειτουργήσει και για το Database Integrity Check καθώς το Availability Group μας επιτρέπει να κάνουμε αυτό τον έλεγχο σε secondary replica.

Για Index Optimize (Index Rebuild) και λοιπά jobs

Αντίστοιχα για SQL Server Agent Jobs που θέλουμε να τρέχουνε μόνο στην Primary Replica κάνουμε την ίδια διαδικασία και προσθέτουμε Step στο Job με τον παρακάτω κώδικα που κάνει τον έλεγχο αυτό:

DECLARE @Role int
SET @Role = (select role from sys.dm_hadr_availability_replica_states where is_local=1)

IF (@Role != 1 ) -- if is not primary
BEGIN
RAISERROR ('Job did not run, is not the Primary replica. Please run on Primary Replica.', 16, 1);
END;

Μπορούμε και σε αυτή την περίπτωση αν θέλουμε να προσθέσουμε τον έλεγχο στο ίδιο step με τον κώδικα:

DECLARE @Role int
SET @Role = (select role from sys.dm_hadr_availability_replica_states where is_local=1)

IF (@Role != 1 ) -- if is not primary
	RAISERROR ('Job did not run, is not the Primary replica. Please run on Primary Replica.', 16, 1);
ELSE
	EXEC msdb.dbo.sp_start_job N'IndexOptimize';  

Bonus

Με τον παρακάτω script που έχω φτιάξει, με μόνο ένα κλικ, κάνει εγκατάσταση το MaintenanceSolution του Ola Hallengren μαζί με έτοιμα παραμετροποιημένα jobs για Backup ,Database Integrity και Index Optimize με τις βέλτιστες παραμέτρους και χρονοδιάγραμμα.

Τα Backup jobs δημιουργούνται disabled καθώς μπορεί να έχουμε άλλη λύση για backup με 3rd party tool. Επίσης κάνει έλεγχο για Availability Group ώστε να τρέχουν μόνο αν είναι η Preffered Backup Replica (για backup / database integrity) και αν είναι Primary Replica (για Index Optimize).

Το μόνο που χρειάζεται να κάνουμε, είναι να εκτελέσουμε το παρακάτω script στο κάθε SQL Server Instance:

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση