Wie löse ich Fehlerereignisse in meiner Amazon RDS für SQL Server-Instance aus und erfasse sie?
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:
-
Melde sich bei SQL Server Management Studio (SSMS) an.
-
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.
-
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 CATCHInfolgedessen 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:
-
Melde dich in SSMS an.
-
Wähle als Typ die Option T-SQL.
-
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 -
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.
-
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?
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor einem Jahr