Πώς μπορούμε να λαμβάνουμε email κάθε φορά που εμφανίζεται ένα σφάλμα στο Error Log του SQL Server
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
Σε ένα instance του SQL Server ότι πιθανά προβλήματα προκύψουν καταγράφονται σε ένα μέρος που ονομάζεται Error Log. Θα μας ήτανε όμως πολύ χρήσιμο αν ότι σημαντικό σφάλμα εμφανίζοτανε στο Error Log, ο SQL Server να μας το προωθούσε αυτόματα σε κάποιο email. Στο άρθρο θα δούμε αναλυτικά πως γίνεται αυτό είτε με γραφικό περιβάλλον είτε με T-SQL.
Τα βήματα
Για αρχή θα πρέπει να έχουμε ενεργοποιήσει το Database Mail στον SQL Server. Το πως γίνεται αυτό το έχουμε δει σε αυτό το άρθρο.
Δημιουργία του Operator
Αφού βεβειωθούμε ότι λειτουργεί το Database Mail θα πρέπει να φτιάξουμε τον Operator. O Operator είναι το ψευδώνυμο του email που θα είναι παραλήπτης.
Για την δημιουργία του με SQL Server Management Studio επιλέγουμε:
Δεξί κλικ στον SQL Server Agent, New, Operator…
Έπειτα του δίνουμε στο Name ένα ψευδώνυμο και στο E-mail name ορίζουμε το mail που θα είναι παραλήπτης:
Αντί για γραφικό περιβάλλον μπορούμε να κάνουμε χρήση T-SQL και να τον δημιουργήσουμε με τον παρακάτω κώδικα:
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Database Mail XPs', 1; GO RECONFIGURE GO USE [msdb] GO EXEC msdb.dbo.sp_add_operator @name=N'sqlserver_alerting', @enabled=1, @weekday_pager_start_time=80000, @weekday_pager_end_time=180000, @saturday_pager_start_time=90000, @saturday_pager_end_time=180000, @sunday_pager_start_time=80000, @sunday_pager_end_time=180000, @pager_days=0, @email_address=N'dataplatform.gr@gmail.com', @category_name=N'[Uncategorized]' GO
Δημιουργία Alert
Στο επόμενο βήμα θα δημιουργήσουμε ένα ένα τα Alerts για το κάθε σφάλμα. Tα σφάλματα χωρίζονται σε κατηγορίες Severities ανάλογα την σοβαρότητα τους. Εμείς θέλουμε να στέλνει όποιο ανήκει από Severity 17 και πάνω.
Οπότε πάμε πάλι στο SQL Server Management Studio και επιλέγουμε:
Δεξί κλικ στον SQL Server Agent, New, Alert…
Στην καρτέλα General ορίζουμε ένα όνομα που παραπέμπει στο Severity που θέλουμε και επιλέγουμε στο drop box το αντίστοιχο Severity:
Στην καρτέλα Response επιλέγουμε Notify operators και κλικ στο E-mail με τον Operator που δημιουργήσαμε στο πρώτο βήμα:
Στην καρτέλα Options, επιλέγουμε το E-mail και ορίζουμε το Delay between responses στα 5 λεπτά ώστε να στέλνει με αυτή την περιοδικότητα:
Επαναλαμβάνουμουμε την ίδια διαδικασία για το κάθε Severity από το 17 έως το 25.
Αφού τελειώσουμε με αυτά προσθέτουμε και τα Errors με κωδικό 823,824,825 που αν και σοβαρά (μας δείχνουν corruption σε δίσκο) δεν ανήκουν σε κάποιο Severity.
Επίσης αν κάνουμε χρήση Always On Availability Groups προσθέτουμε και τα Errors με κωδικό 1480, 35264, 35625 τα οποία θα μας ενημερώσουν αν γίνει κάποια αλλαγή μεταξύ Primary και Secondary, όπως επίσης αν σταματήσει η μεταφορά δεδομένων μεταξύ τους.
Οπότε κάνουμε την ίδια διαδικασία για το κάθε Error Number (823,824,825,1480,35264,35625):
Αντί για γραφικό περιβάλλον μπορούμε να κάνουμε χρήση T-SQL και να τα δημιουργήσουμε με τον παρακάτω κώδικα:
USE [msdb] GO EXEC msdb.dbo.sp_add_alert @name=N'severity 17', @message_id=0, @severity=17, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 17', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'severity 18', @message_id=0, @severity=18, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 18', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'severity 19', @message_id=0, @severity=19, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 19', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'severity 20', @message_id=0, @severity=20, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 20', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'severity 21', @message_id=0, @severity=21, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 21', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'severity 22', @message_id=0, @severity=22, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 22', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'severity 23', @message_id=0, @severity=23, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 23', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'severity 24', @message_id=0, @severity=24, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 24', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'severity 25', @message_id=0, @severity=25, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'severity 25', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'extra error 823', @message_id=823, @severity=0, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'extra error 823', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'extra error 824', @message_id=824, @severity=0, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'extra error 824', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'extra error 825', @message_id=825, @severity=0, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'extra error 825', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'AlwaysOn Availability Group - Role Change', @message_id=1480, @severity=0, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'AlwaysOn Availability Group - Role Change', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'AlwaysOn Availability Group - Data Movement Suspended', @message_id=35264, @severity=0, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'AlwaysOn Availability Group - Data Movement Suspended', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO EXEC msdb.dbo.sp_add_alert @name=N'AlwaysOn Availability Group - Data Movement Resumed', @message_id=35265, @severity=0, @enabled=1, @delay_between_responses=300, @include_event_description_in=1, @job_id=N'00000000-0000-0000-0000-000000000000' GO EXEC msdb.dbo.sp_add_notification @alert_name=N'AlwaysOn Availability Group - Data Movement Resumed', @operator_name=N'sqlserver_alerting', @notification_method = 1 GO
Σχεδόν έτοιμοι
Στο τέλος θα πρέπει μέσα από το SQL Server Management Studio να βλέπουμε κάτω από τα Alerts και Operators του SQL Server Agent κάτι παρόμοιο με την παρακάτω εικόνα:
Πώς δοκιμάζουμε ότι λειτουργούν τα Alerts και θα μας έρθει E-mail
Με τον παρακάτω T-SQL κώδικα μπορούμε να δημιουργήσουμε ένα ψεύτικο Error για να δούμε ότι λειτουργεί:
Use [master] GO RAISERROR (N'An error occurred Severity 17: insufficient resources !', 17, 1) WITH LOG GO
Μετά από λίγο θα δούμε ότι θα μας έρθει mail που θα αναφέρει το σφάλμα όπως στην παρακάτω εικόνα:
Bonus Script (Για εγκατάσταση του email alerting με ένα κλικ)
Με το παρακάτω sql script τροποποιώντας το Profile που είναι ο αποστολέας και τον Operator που είναι ο παραλύπτης των email με τα ανάλογα email, smtp server και credentials, μπορούμε να δημιουργήσουμε το email profile, email operator και όλα τα alerts με ένα κλικ:
Πηγές:
- Operators
- Create an Operator
- Alerts
- Database Engine Error Severities
- sp_add_operator (Transact-SQL)
- sp_add_alert (Transact-SQL)
- How to Configure SQL Server Agent Alerts