Direkt zum Inhalt

Wie löse ich Fehlerereignisse in meiner Amazon RDS für SQL Server-Instance aus und erfasse sie?

Lesedauer: 5 Minute
0

Ich möchte Fehlerereignisse in meiner Amazon Relational Database Service (Amazon RDS) für SQL Server-DB-Instance auslösen und erfassen. Ich möchte auch benachrichtigt werden, wenn ein Fehlerereignis auftritt.

Kurzbeschreibung

SQL Server verwendet die Fehlerbehandlung, um Fehler beim Vorhandensein von Objekten und Laufzeitfehler in einem T-SQL-Code zu beheben. Verwende das TRY...CATCH-Konstrukt, um Fehler wie diese zu beheben. Verwende dann den Befehl RAISERROR, um benutzerdefinierte Fehler zu generieren und Ausnahmen auszulösen. Verwende Amazon CloudWatch Logs, um die SQL Server-Fehlerprotokolle zu überwachen und Benachrichtigungen darüber zu erhalten.

Lösung

TRY...CATCH-Konstrukt und die RAISERROR-Anweisung verwenden

Führe die folgenden Schritte aus:

  1. Melde sich bei SQL Server Management Studio (SSMS) an.

  2. Verwende das folgende TRY...CATCH-Konstrukt, um einen Codeblock für Fehlertests zu definieren:

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

    **Hinweis:**Die statement_block überwacht den Code, den du zwischen BEGIN TRY und END TRY einfügen, zur Laufzeit auf Fehler. Wenn im Block ein Fehler auftritt, wird der Fehler auf die CATCH-Sitzung übertragen. Abhängig vom Code im CATCH-Block führt die Anweisung dann die Aktion aus. Je nach Problem kannst du den Fehler beheben, den Fehler melden oder den Fehler in den SQL Server-Fehlerprotokollen protokollieren.

  3. Erstelle eine benutzerdefinierte Meldung, die einen SQL Server-Fehler auslöst, wenn sie auftritt. Füge den Speicherverfahren oder dem SQL Server, den du überwachen möchtest, die folgende RAISERROR-Anweisung hinzu:

    RAISERROR ( { msg_id | msg_str | @local_variable }  
    
    { , severity, state }  
    
    [ , argument [ , ...n ] ] )  
    
    [ WITH option [ , ...n ] ]

    Beispiel für ein TRY- und CATCH-Konstrukt und einen RAISERROR-Befehl: 

    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

    Infolgedessen wird die folgende Fehlermeldung in den SQL Server-Protokollen ausgegeben:

    Error: 50000, Severity: 16, State: 1.  
    
    Divide by zero error encountered.

Die SQL Server-Fehlerprotokolle überwachen und Benachrichtigungen senden

Füge dem Jobschritt ein Skript hinzu, um den SQL Server-Agent-Job zu überwachen und den Fehler in den SQL Server-Fehlerprotokollen auszulösen. Du kannst dann die Fehlerprotokolle verwenden, um Benachrichtigungen zu senden.

Gehe wie folgt vor, um den SQL Server-Agent-Job zu bearbeiten:

  1. Melde dich in SSMS an.

  2. Wähle als Typ die Option T-SQL.

  3. Gib einen Datenbanknamen ein und füge dann das folgende T-SQL in den Bereich Befehl ein:

    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  
    
    declare @errormsg nvarchar(4000)  
    
    select @error = count(run_status) from @jb where run_status != 0  
    
    if @error > 0  
    
    begin  
    
    set @errormsg='Automatic message from RDS for SQL Server Agent - Job: "' + @name + '" succeed'  
    
    RAISERROR(@errormsg, -1,1) WITH LOG  
    
    end else  
    
    begin  
    
    set @errormsg='Automatic message from RDS for SQL Server Agent - Job: "' + @name + '" failed'  
    
    RAISERROR(@errormsg, 16,1) WITH LOG  
    
    end
  4. Konfiguriere den vorherigen Jobschritt so, dass Bei Erfolg und Bei Ausfall zu den nächsten Jobschritten übergegangen wird. Weitere Informationen findest du auf der Microsoft-Website unter Festlegen des Erfolgs- oder Fehlerflusses für Jobschritte. Die Jobschritte Bei Erfolg und Bei Ausfall führe den vorherigen Code aus, um zu überprüfen, ob die Ausführung erfolgreich war oder nicht. Der Agent-Job löst dann die Meldung im SQL Server-Fehlerprotokoll aus, aus der hervorgeht, ob der Auftrag erfolgreich war oder nicht.

  5. Führe das folgende Verfahren aus, um zu bestätigen, dass der SQL Server-Auftrag ordnungsgemäß ausgeführt wurde und aktualisiere die Details des fehlgeschlagenen Auftrags in den SQL Server-Fehlerprotokollen:

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

    Weitere Informationen findest du unter Fehler- und Agent-Protokolle anzeigen.
    Das Folgende ist ein Beispiel für die aktualisierten Auftragsdetails in den Fehlerprotokollen:

    Automatic message from RDS for SQL Server Agent - Job: "jobtest-new" succeed    
    Error: 50000, Severity: 16, State: 1.  
    Automatic message from RDS for SQL Server Agent - Job: "jobtest-new" failed

Benachrichtigungen in CloudWatch Logs konfigurieren

Informationen zum Konfigurieren von Benachrichtigungen in CloudWatch findest du unter Veröffentlichen von SQL Server-Protokollen in Amazon CloudWatch Logs.

Nachdem du die SQL Server-Protokolle in CloudWatch Logs veröffentlicht hast, kannst du Metrikfilter erstellen, die dir bei der Suche in den Protokollen helfen. Die Metrikfilter wandeln die Protokolldaten in numerische CloudWatch-Metriken um, für die du Alarme einrichten kannst. Weitere Informationen findest du unter Wie kann ich SNS-Benachrichtigungen über Fehler und Agent-Protokollereignisse in Amazon RDS für SQL Server erhalten, die einem CloudWatch-Filtermuster entsprechen?