如何在 RDS for SQL Server 執行個體中擷取和接收錯誤事件的相關通知?

上次更新日期:2022 年 10 月 19 日

我想在我的 Amazon Relational Database Service (Amazon RDS) 上引發和擷取 SQL Server 資料庫執行個體的錯誤事件。我也希望在發生錯誤事件時收到通知。該如何進行?

簡短描述

SQL Server 會使用錯誤處理來解決 T-SQL 程式碼中的物件存在錯誤和執行時間錯誤。若要處理這類錯誤,請使用 TRY 和 CATCH 方法。然後,使用 RAISERROR 命令產生客戶錯誤並擲回例外狀況。

解決方案

使用 TRY 和 CATCH 方法

1.    使用 TRY 和 CATCH 陳述式來定義錯誤測試的程式碼區塊。您在 BEGIN TRY 和 END TRY 之間包含的任何程式碼都會在執行時受監控是否有錯誤。每當區塊中發生錯誤時,就會傳輸到 CATCH 工作階段。然後,根據 CATCH 區塊中的程式碼執行動作。視問題而定,您可以修正錯誤、報告錯誤或將錯誤記錄到 SQL Server 錯誤日誌中。

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

2.    建立在發生 SQL Server 錯誤時引發的自訂訊息。若要如此,請將 RAISERROR 新增至您的儲存區程序或您要監控的 SQL Server。

RAISERROR ( { msg_id | msg_str | @local_variable }

                         { , severity, state }

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

                         [ WITH option [ , ...n ] ]

TRY CATCH 方法和 RAISERROR 的範例當您使用 TRY CATCH 方法擷取錯誤時,請建立自訂訊息,然後將錯誤引發至 SQL Server 錯誤日誌中。請參閱此範例:

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

以下是 SQL Server 日誌中引發錯誤的範例:

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

  Divide by zero error encountered.

監控 SQL Server 錯誤日誌並傳送通知

若要監控 SQL Server Agent 工作,請將指令碼新增至欲監控的步驟,並在 SQL Server 錯誤日誌中引發錯誤。然後,您可以使用這些日誌來傳送通知。

1.    編輯您的 SQL Server 工作,然後新增步驟。針對類型,請選擇 T-SQL。輸入資料庫名稱,然後在命令區段中新增此 T-SQL:

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.    將 SQL Server 工作設定為移至您為失敗時動作區段所建立的步驟。

3.    執行此程序以確認 SQL Server 工作已正確執行,並更新 SQL Server 錯誤日誌中的工作失敗詳細資料。如需詳細資訊,請參閱檢視錯誤和代理程式日誌

EXEC rdsadmin.dbo.rds_read_error_log @index = 0, @type = 1;
錯誤日誌中的範例:
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.    將 SQL Server 日誌發佈到 Amazon CloudWatch 以設定通知。使用 Amazon RDS 主控台修改 SQL Server。從「日誌匯出」區段,選擇您要發佈到 CloudWatch 日誌的日誌。將 SQL Server 日誌發佈到 Amazon CloudWatch 之後,您可以建立指標篩選條件來協助您搜尋日誌。指標篩選條件可定義 Amazon CloudWatch 在日誌資料中搜尋的字詞和模式。然後,指標篩選條件會將此日誌資料轉換為可設定警示的數值 CloudWatch 指標。

如需詳細資訊,請參閱如何接收有關與 CloudWatch 篩選條件模式相符的 Amazon RDS for SQL Server 錯誤和代理程式日誌事件的 SNS 通知?


此文章是否有幫助?


您是否需要帳單或技術支援?