RDS for SQL Server インスタンスのエラーイベントに関する通知をキャプチャして受信する方法を教えてください。

所要時間3分
0

SQL Server DB インスタンス用の Amazon Relational Database Service (Amazon RDS) でエラーイベントを発生させてキャプチャしたいと考えています。また、エラーイベントが発生するたびに通知を受信したいと思います。これを行うにはどうすればよいですか?

簡単な説明

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 を追加します。

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 ジョブを編集し、ステップを追加します。[Type] (タイプ) で、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 を変更します。[Log exports] (ログエクスポート) セクションで、CloudWatch ログに公開するログを選択します。SQL Server ログを Amazon CloudWatch に公開すると、ログの検索に役立つメトリクスフィルターを作成できます。メトリクスフィルターは、Amazon CloudWatch がログデータを検索する用語とパターンを定義します。次に、メトリクスフィルターは、ログデータをアラーム設定が可能な CloudWatch の数値メトリクスに変換します。

詳細については、「Amazon RDS for SQL Server でのエラーに関する SNS 通知と、CloudWatch のフィルターパターンと一致するエージェントログイベントを受信するにはどうすればよいですか?」を参照してください。


AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ