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 のフィルターパターンと一致するエージェントログイベントを受信するにはどうすればよいですか?」を参照してください。