Πώς μπορούμε να λαμβάνουμε email όποτε εμφανίζει πρόβλημα ο συγχρονισμός στον SQL Server μέσω του Oracle GoldenGate

Πώς μπορούμε να λαμβάνουμε email όποτε εμφανίζει πρόβλημα ο συγχρονισμός στον SQL Server μέσω του Oracle GoldenGate
Πώς μπορούμε να λαμβάνουμε email όποτε εμφανίζει πρόβλημα ο συγχρονισμός στον SQL Server μέσω του Oracle GoldenGate

Όταν συγχρονίζουμε πίνακες μέσω του Oracle GoldenGate μπορεί είτε να σταματήσει το extract του source να γράφει trail files στο target στους πίνακες, είτε να σταματήσει το replicat του target να κάνει apply τα trail files. Οπότε για οποιοδήποτε από τις δύο περίπτωσεις θα μας βοηθούσε να λαμβάνουμε email όποτε το replication μείνει μερικά λεπτά πίσω.

Στο άρθρο αυτό λοιπόν θα δούμε βήμα βήμα πώς φτιάχνουμε αυτόν τον μηχανισμό μέσω SQL Server Agent Job.

Το email που θα λαμβάνουμε θα είναι της παρακάτω μορφής ενημερώνοντας μας για τυχόν lag από το source ή apply lag των trail files:

GoldenGate SQL Server replication warning at: SMATZOURANISLP

DESCRIPTION: At Mar  7 2023  3:58PM on SQL Server " SMATZOURANISLP", GoldenGate replication warning for group: "INI_REP", lag from the source is -2720 minutes, apply lag is 0 minutes!!!!

Τα βήματα

Για αρχή θα πρέπει να έχουμε ενεργοποιήσει το Database Mail στον SQL Server. Το πως γίνεται αυτό το έχουμε δει σε αυτό το άρθρο.

Το Transact SQL Script

Με το παρακάτω script που έχω ετοιμάσει, θα φτιαχτεί ένα SQL Server Agent Job το οποίο θα τρέχει άνα 15 λεπτά και θα ελέγχει τον CHECKPOINTTABLE του GoldenGate. Αν οι τιμές audits_ts (lag from source) ή last_update_ts (apply lag) ξεπερνάνε το threshold που έχουμε ορίσει στον κώδικα θα στέλνει email με το profile που έχουμε ορίσει.

Τις μόνες πληροφορίες που χρειάζεται να αλλάξουμε ανά περίπτωση είναι οι παρακάτω που ορίζονται ως bold:

set @bod = (select top 1 ''DESCRIPTION: At '' + cast(getdate() as nvarchar) +'' on SQL Server "'' + @@servername +''", GoldenGate replication warning for group: "'' +group_name + ''", lag from the source is ''+cast(datediff(minute,getdate(),audit_ts) as nvarchar) +'' minutes and apply lag is ''+cast(datediff(minute,getdate(),last_update_ts) as nvarchar)+ '' minutes !!!!'' 
from dbo.CHECKPOINTTABLE where audit_ts is not null and (last_update_ts < dateadd(mi,-5,getdate()) or cast(audit_ts as datetime2) < dateadd(mi,-10,getdate())) order by last_update_ts);   <---threshold is set to 5 min for both source lag and apply lag
IF  (select count(*) from dbo.CHECKPOINTTABLE where audit_ts is not null and (last_update_ts < dateadd(mi,-5,getdate()) or cast(audit_ts as datetime2) < dateadd(mi,-10,getdate()))) > 0  <---threshold is set to 5 min for both source lag and apply lag
begin

	exec msdb.dbo.sp_send_dbmail
	@profile_name = ''gmail'',               <---- The profile name we made to send email in the first step
	@recipients = ''info@dataplatform.gr'',  <----- And the recipients of the email
	@subject = @sub,
	@body = @bod;
end;

', 
              @database_name=N'gg_database',    <---- Set the database name contains GoldenGate's CHECKPOINTTABLE

Αφού κάνουμε τις παραπάνω τροποποιήσεις στο παρακάτω script, μένει απλά να τρέξουμε σε ένα καινούργιο query window στο instance:

USE [msdb]
GO

/****** Object:  Job [Alert for GoldenGate replication]    Script Date: 07/03/2023 02:05:43 μμ ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]    Script Date: 07/03/2023 02:05:43 μμ ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Alert for GoldenGate replication', 
              @enabled=1, 
              @notify_level_eventlog=0, 
              @notify_level_email=0, 
              @notify_level_netsend=0, 
              @notify_level_page=0, 
              @delete_level=0, 
              @description=N'No description available.', 
              @category_name=N'[Uncategorized (Local)]', 
              @owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [step1]    Script Date: 07/03/2023 02:05:44 μμ ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'step1', 
              @step_id=1, 
              @cmdexec_success_code=0, 
              @on_success_action=1, 
              @on_success_step_id=0, 
              @on_fail_action=2, 
              @on_fail_step_id=0, 
              @retry_attempts=0, 
              @retry_interval=0, 
              @os_run_priority=0, @subsystem=N'TSQL', 
              @command=N'set ansi_warnings on
go
set ansi_padding on
go
set quoted_identifier on
go
declare 
@sub nvarchar(max),
@bod nvarchar(max)
set @sub = (select ''GoldenGate SQL Server replication warning at: '' + @@servername);
set @bod = (select top 1 ''DESCRIPTION: At '' + cast(getdate() as nvarchar) +'' on SQL Server "'' + @@servername +''", GoldenGate replication warning for group: "'' +group_name + ''", lag from the source is ''+cast(datediff(minute,getdate(),cast(audit_ts as datetime2)) as nvarchar) +'' minutes and apply lag is ''+cast(datediff(minute,getdate(),last_update_ts) as nvarchar)+ '' minutes !!!!'' 
from dbo.CHECKPOINTTABLE where audit_ts is not null and (last_update_ts < dateadd(mi,-5,getdate()) or cast(audit_ts as datetime2) < dateadd(mi,-10,getdate())) order by last_update_ts);
IF  (select count(*) from dbo.CHECKPOINTTABLE where audit_ts is not null and (last_update_ts < dateadd(mi,-5,getdate()) or cast(audit_ts as datetime2) < dateadd(mi,-10,getdate()))) > 0
begin

	exec msdb.dbo.sp_send_dbmail
	@profile_name = ''gmail'',
	@recipients = ''info@dataplatform.gr'',
	@subject = @sub,
	@body = @bod;
end;

', 
              @database_name=N'gg_database', 
              @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'daily', 
              @enabled=1, 
              @freq_type=4, 
              @freq_interval=1, 
              @freq_subday_type=4, 
              @freq_subday_interval=15, 
              @freq_relative_interval=0, 
              @freq_recurrence_factor=0, 
              @active_start_date=20211029, 
              @active_end_date=99991231, 
              @active_start_time=0, 
              @active_end_time=235959, 
              @schedule_uid=N'df24cb48-55e9-436a-a0de-56d4dd5139a3'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO

Όταν το τρέξουμε θα δούμε στον Object Explorer του SQL Server Management Studio ότι έχει δημιουργήσει ένα καινούργιο Job στον SQL Server Agent:

Πώς μπορούμε να λαμβάνουμε email όποτε εμφανίζει πρόβλημα ο συγχρονισμός στον SQL Server μέσω του Oracle GoldenGate
01

Μετά από λίγο θα δούμε ότι έστειλε μόνο του χωρίς να κάνουμε κάτι email που μας ενημερώνει ότι είναι μερικά λεπτά πίσω ο συγχρονισμός σε σχέση με τα trail files του source:

Πώς μπορούμε να λαμβάνουμε email όποτε εμφανίζει πρόβλημα ο συγχρονισμός στον SQL Server μέσω του Oracle GoldenGate
02
Μοιράσου το

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