Wie kann ich Benachrichtigungen über Fehlerereignisse in meiner RDS-for-SQL-Server-Instance erfassen und empfangen?

Lesedauer: 4 Minute
0

Ich möchte Fehlerereignisse auf meiner Instance von Amazon Relational Database Service (Amazon RDS) for SQL-Server-DB auslösen und erfassen. Ich möchte auch benachrichtigt werden, wenn ein Fehlerereignis auftritt. Wie kann ich vorgehen?

Kurzbeschreibung

SQL Server verwendet Fehlerbehandlung, um Objektexistenz- und Laufzeitfehler in einem T-SQL-Code aufzulösen. Um solche Fehler zu behandeln, verwenden Sie die TRY- und CATCH-Methode. Verwenden Sie dann den Befehl RAISERROR, um Kundenfehler zu generieren und Ausnahmen auszulösen.

Auflösung

TRY- und CATCH-Methode verwenden

1.    Verwenden Sie eine TRY- und CATCH-Anweisung, um einen Codeblock für Fehlertests zu definieren. Jeglicher Code, den Sie zwischen BEGIN TRY und END TRY einfügen, wird zum Zeitpunkt der Ausführung auf Fehler überwacht. Immer wenn ein Fehler im Block auftritt, wird er an die CATCH-Sitzung übertragen. Dann wird abhängig vom Code im CATCH-Block die Aktion ausgeführt. Je nach Problem können Sie den Fehler beheben, den Fehler melden oder den Fehler in den SQL-Server-Fehlerprotokollen protokollieren.

BEGIN TRY
                            --code to try
                  END TRY
                  BEGIN CATCH
                                --code to run if an error occurs
                                --is generated in try
                  END CATCH

2.    Erstellen Sie eine benutzerdefinierte Meldung, die einen SQL-Server-Fehler auslöst, wenn dieser auftritt. Fügen Sie dazu RAISERROR zu Ihren Speicherverfahren oder zu einem SQL-Server hinzu, den Sie überwachen möchten.

RAISERROR ( { msg_id | msg_str | @local_variable }

                         { , severity, state }

                         [ , argument [ , ...n ] ] )

                         [ WITH option [ , ...n ] ]

Beispiele für die TRY CATCH-Methode und RAISERROR Wenn Sie Fehler mit der TRY CATCH-Methode erfassen, erstellen Sie eine benutzerdefinierte Meldung und lösen den Fehler dann in den SQL-Server-Fehlerprotokollen aus. Werfen Sie einen Blick auf folgendes Beispiel:

BEGIN TRY

SELECT 1/0

END TRY

BEGIN CATCH

DECLARE @Var VARCHAR(100)

SELECT ERROR_MESSAGE()

SELECT @Var = ERROR_MESSAGE()

RAISERROR(@Var, 16,1) WITH LOG

END CATCH

Dies ist ein Beispiel für einen Fehler, der in den SQL-Server-Protokollen ausgelöst wurde:

Error: 50000, Severity: 16, State: 1.

  Divide by zero error encountered.

SQL Server-Fehlerprotokolle überwachen und Benachrichtigungen senden

Um den SQL-Server-agentjob zu überwachen, fügen Sie dem zu überwachenden Schritt ein Skript hinzu und lösen Sie den Fehler in den SQL-Server-Fehlerprotokollen aus. Sie können diese Protokolle dann verwenden, um Benachrichtigungen zu senden.

1.    Bearbeiten Sie Ihren SQL-Server-Job, und fügen Sie den Schritt hinzu. Wählen Sie als Typ T-SQL. Geben Sie einen Datenbanknamen ein und fügen Sie dann diesen T-SQL im Befehlsabschnitt hinzu:

DECLARE @name NVARCHAR(128)

select @name =  name from msdb.dbo.sysjobs where job_id = $(ESCAPE_SQUOTE(JOBID));



-- Temporary table to store the data of the datafile with low free storage

DECLARE @jb TABLE ([step_id] int, [step_name] NVARCHAR(128), [message] NVARCHAR(4000), [run_status] int);



insert into @jb

select hist.step_id, hist.step_name, hist.message, hist.run_status

  from msdb.dbo.sysjobhistory hist inner join

       (select a.job_id

               , convert(varchar(50),max(a.run_requested_date),112) as run_date

                     , replace(convert(varchar(50),max(a.run_requested_date),108), ':', '') as run_time

          from msdb.dbo.sysjobs j inner join msdb.dbo.sysjobactivity a

               on j.job_id = a.job_id

           where j.name = @name

               and a.run_requested_date is not null

         group by a.job_id) ja

        on hist.job_id = ja.job_id

       and hist.run_date = ja.run_date

       and hist.run_time >= ja.run_time

 order by hist.step_id

declare @error int

select @error = count(run_status) from @jb where run_status != 0

if @error > 0

RAISERROR('Automatic message from RDS for SQL Server Agent. Job test2 successful', 18,1) WITH LOG  --\will raise the error when job successful

else

RAISERROR('Automatic message from RDS for SQL Server Agent. Job test2 failed', 16,1) WITH LOG  --\will raise the error when job failed

2.    Konfigurieren Sie den SQL-Server-Job so, dass er zu dem Schritt wechselt, den Sie für den Abschnitt On failure action (Aktion bei einem Fehler) erstellt haben.

3.    Führen Sie dieses Verfahren aus, um zu bestätigen, dass der SQL-Server-Job ordnungsgemäß ausgeführt wurde und die Details zum fehlgeschlagenen Job in den SQL-Server-Fehlerprotokollen aktualisiert hat. Weitere Informationen finden Sie unter Anzeigen von Fehlern und Agentenprotokollen.

EXEC rdsadmin.dbo.rds_read_error_log @index = 0, @type = 1;

Beispiel in den Fehlerprotokollen:

Msg 50000, Level 18, State 1, Line 33
Automatic message from RDS for SQL Server Agent. Job test2 failed
Msg 50000, Level 18, State 1, Line 29
Automatic message from RDS for SQL Server Agent. Job test2 successful

3.    Konfigurieren Sie Benachrichtigungen, indem Sie die SQL-Server-Protokolle auf Amazon CloudWatch veröffentlichen. Ändern Sie den SQL-Server mithilfe der Amazon-RDS-Konsole. Wählen Sie im Abschnitt „Log exports“ (Protokollexporte) die Protokolle aus, die Sie in den CloudWatch-Protokollen veröffentlichen möchten. Nachdem Sie die SQL-Server-Protokolle in Amazon CloudWatch veröffentlicht haben, können Sie Metrikfilter erstellen, die Sie beim Durchsuchen der Protokolle unterstützen. Metrikfilter definieren die Begriffe und Muster, nach denen Amazon CloudWatch die Protokolldaten durchsucht. Anschließend wandeln die Metrikfilter diese Protokolldaten in numerische CloudWatch-Metriken um, für die Sie Alarme einrichten können.

Weitere Informationen erhalten Sie unter Wie erhalte ich SNS-Benachrichtigungen zu Fehlern und Agent-Protokollereignissen in Amazon RDS for SQL Server, die einem Filtermuster in CloudWatch entsprechen?