SQL Server を実行する Amazon Relational Database Service (Amazon RDS) DB インスタンスがあります。RDS DB インスタンスでデッドロックイベントが発生するとすぐに通知を受け取りたいです。どうすればよいですか?
簡単な説明
SQL Server は、ロックモニタースレッドを使用してデッドロックイベントを監視します。デッドロックイベントが検出された場合、SQL Server はリソース/コストベースのメカニズムを使用して、いずれかのトランザクションをデッドロックの被害者と宣言します。被害者のトランザクションはロールバックされ、エラーコード 1205 がエラーログに投稿されます。
この問題を解決するには、デッドロックトレースフラグ (1222、1204) を有効にして、デッドロックイベントを SQL エラーログにキャプチャします。次に、SQL Server のエラーログを Amazon CloudWatch に発行し、デッドロックイベントが発生するたびにアラートを送信する CloudWatch アラームと Amazon Simple Notification Service (Amazon SNS) 通知を作成します。
解決方法
RDS パラメータグループを通じてトレースフラグを有効にする
注意: 既存のカスタムパラメータグループがある場合は、ステップ 5 に進みます。
- Amazon RDS コンソールを開き、ナビゲーションペインから [パラメータグループ] を選択します。
- [パラメータグループの作成] を選択します。
- [パラメータグループファミリー] で、使用している SQL Server のバージョンとエディションを選択します。たとえば、SQL Server 2016 エンタープライズエディションは sqlserver-ee-13.0 を使用します。
- [グループ名] と [説明] を入力してから、[作成] を選択します。
- [パラメータグループ] ページで、前のステップで作成したグループを選択します。
- [パラメータを編集する] を選択し、1204 と 1222 の横にあるチェックボックスをオンにします。
- 1204 と 1222 の両方の値を 1 に編集します。
- [変更をプレビュー] を選択します。次のページで、[変更の保存] を選択します。
- ナビゲーションペインで [データベース] をクリックします。
- [DB 識別子] セクションで、RDS DB インスタンスを選択します。
- [変更] を選択します。
- [データベースオプション] セクションの [DB パラメータグループ] で、作成したパラメータグループを選択します。注意: 新しいパラメータグループを作成して RDS DB インスタンスにアタッチするには、変更を有効にするために RDS DB インスタンスを再起動する必要があります。
SQL Server エラーログを Amazon CloudWatch にプッシュする
- [エラーログ] セクションで、[エラーログ] ボックスを選択します。これにより、SQL Server エラーログが CloudWatch Logs に発行されます。
- [続行] を選択します。
- [変更のスケジュール] セクションで、[すぐに申し込む]、[DB インスタンスを変更] を選択します。注意: RDS DB インスタンスのステータスは [変更中] です。[利用可能] ステータスに戻るまでお待ちください。既存のパラメータグループを使用した場合は、RDS DB インスタンスを再起動する必要がないため、ステップ 4 をスキップします。新しいパラメータグループを作成した場合は、ステップ 4 に進みます。
- [データベース] ページで、RDS DB インスタンスを選択し、[アクション] を選択します。変更を有効にするには、RDS DB インスタンスを再起動します。
RDS DB インスタンスがオンラインになったら、RDS DB インスタンスで DBCC TRACESTATUS (1222、1204) を実行して、デッドロックトレースステータスを確認できます。グローバルトレースコマンドが出力ウィンドウに 1 を返した場合、デッドロックトレースが有効になります。
デッドロックトランザクションをシミュレートする
RDS DB インスタンスでデッドロックトランザクションをシミュレートし、デッドロックの被害者クエリが SQL Server エラーログに記録されるかどうかを検証します。RDS DB インスタンスで次のクエリを実行して、SQL Server エラーログのデッドロックイベントを確認できます。
sp_readerrorlog 0, 1, 'deadlock'
フィルターパターンと Amazon CloudWatch アラームを作成する
- CloudWatch コンソールを開きます。
- [ログ] セクションから、[ロググループ] を選択します。
- RDS DB インスタンスの SQL Server エラーログを選択します。ログは次の形式で一覧表示されます。(/aws/rds/instance/<Your-RDS-Instance-Name>/error)
- [メトリックフィルターを作成] を選択します。
- [ログメトリックフィルターの定義] ページの [フィルターパターン] セクションで、[デッドロック] と入力します。
- [メトリクスの割り当て] を選択します。
- [フィルター名] フィールドと [メトリック名] フィールドの両方に [デッドロック] と入力します。
- [フィルターを作成] を選択します。デッドロックフィルターが作成されたら、[アラームの作成] を選択します。
- [メトリックと条件の指定] ページの [メトリック名] に [デッドロック] と入力します。
- [統計] で、[最小] と入力します。
- [期間] ドロップダウンメニューから、アラームの期間 (例: 1 分) を選択します。
- [条件] セクションで、次の設定を選択します。
しきい値の種類: [静的]
デッドロックの場合: しきい値以上
その場合: 0 と入力します。
13. [次へ] を選択します。
14. [通知] セクションの [アラーム状態トリガー] で、[アラーム中] を選択します。
15. [Amazon SNS トピックの選択] または [新しいトピックの作成] を選択します。新しいトピックを作成する場合は、アラートを受信したい E メールアドレスを使用します。その後、[次へ] を選択します。
16. [名前と説明] セクションで、[アラーム名] と [アラームの説明] を入力し、[次へ] を選択します。
17. [プレビューと作成] ページでアラーム設定を確認し、[アラームを作成] を選択します。
同じプロセスを使用して、他の SQL Server の致命的なエラーやログイン失敗エラーを知らせる CloudWatch アラームを作成します。これにより、データベースシステムに重大な問題が発生する前に、多くの SQL Server エラーについて通知を受け取ることができます。
関連情報
MySQL データベースのログファイル