跳至内容

如何在我的 Amazon RDS for SQL Server 实例中引发并捕获错误事件?

3 分钟阅读
0

我想在我的 Amazon Relational Database Service (Amazon RDS) for SQL Server 数据库实例中引发并捕获错误事件。我还想在错误事件发生时收到通知。

简短描述

SQL Server 使用错误处理来解决 T-SQL 代码中的对象存在错误和运行时错误。要解决此类错误,请使用 TRY...CATCH 构造。然后,使用 RAISERROR 命令生成自定义错误并抛出异常。要监控 SQL Server 错误日志并接收相关通知,请使用 Amazon CloudWatch Logs。

解决方法

使用 TRY...CATCH 构造和 RAISERROR 语句

完成以下步骤:

  1. 登录 SQL Server Management Studio (SSMS)。

  2. 使用以下 TRY...CATCH 构造定义一个用于错误测试的代码块:

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

    **注意:**statement_block 会监控 BEGIN TRYEND TRY 之间包含的代码是否存在运行时错误。当块中出现错误时,该错误会转移到 CATCH 会话。然后,根据 CATCH 块中的代码,语句会执行相应的操作。根据问题,您可以修复错误、报告错误或将错误记录到 SQL Server 错误日志中。

  3. 创建一条自定义消息,以在发生 SQL Server 错误时引发该错误。将以下 RAISERROR 语句添加到要监控的存储过程或 SQL Server 中:

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

    TRY 和 CATCH 构造以及 RAISERROR 命令示例:

    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 错误日志中引发错误。然后,您可以使用错误日志发送通知。

要编辑您的 SQL Server 代理作业,请完成以下步骤:

  1. 登录 SSMS。

  2. 对于 type(类型),选择 T-SQL

  3. 输入数据库名称,然后在 command(命令)部分添加以下 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  
    
    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. 配置上述作业步骤,使其在成功时失败时转到下一个作业步骤。有关详细信息,请参阅 Microsoft 网站上的“Set job step success or failure flow(设置作业步骤成功或失败流)”。成功时失败时作业步骤会运行之前的代码,以检查执行是否成功。然后,代理作业会在 SQL Server 错误日志中引发消息,显示该作业是成功还是失败。

  5. 运行以下过程,以确认 SQL Server 作业是否正确运行并在 SQL Server 错误日志中更新了失败作业的详细信息:

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

    有关详细信息,请参阅查看错误和代理日志
    以下是错误日志中更新后的作业详细信息示例:

    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

在 CloudWatch Logs 中配置通知

要在 CloudWatch 中配置通知,请参阅将 SQL Server 日志发布到 Amazon CloudWatch Logs

在将 SQL Server 日志发布到 CloudWatch Logs 后,您可以创建指标筛选器来帮助搜索日志。指标筛选器会将日志数据转换为数字 CloudWatch 指标,您可以为其设置警报。有关详细信息,请参阅如何接收有关与 CloudWatch 筛选模式相匹配的 Amazon RDS for SQL Server 错误和代理日志事件的 SNS 通知?