Πώς μπορούμε να λαμβάνουμε email όποτε εμφανίζει πρόβλημα ο συγχρονισμός στον SQL Server μέσω του Oracle GoldenGate
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
Όταν συγχρονίζουμε πίνακες μέσω του 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 που μας ενημερώνει ότι είναι μερικά λεπτά πίσω ο συγχρονισμός σε σχέση με τα trail files του source: