如何在 RDS for SQL Server 实例中捕获和接收有关错误事件的通知?

3 分钟阅读
0

我想在 Amazon Relational Database Service(Amazon RDS)for 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 错误时引发 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 代理作业,请向该步骤添加脚本,以在 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 作业以转到您为 On failure action section(失败时的操作部分)创建的步骤。

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。在 Log exports(日志导出)部分中,选择要发布到 CloudWatch 日志的日志。将 SQL Server 日志发布到 Amazon CloudWatch 后,您可以创建指标筛选条件帮助您搜索日志。指标筛选条件定义了 Amazon CloudWatch 在日志数据中搜索的术语和模式。然后,指标筛选条件将这些日志数据转换为 CloudWatch 数字指标,您可以为这些指标设置警报。

有关更多信息,请参阅如何接收与 CloudWatch 筛选模式匹配的 Amazon RDS for SQL Server 错误和代理日志事件的 SNS 通知?


AWS 官方
AWS 官方已更新 2 年前