継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Aurora のデッドロック情報を抽出して CloudWatch Logs に出力する

タダです.

Aurora のデッドロックの発生時に SHOW ENGINE INNODB STATUS を実行し, LATEST DETECTED DEADLOCK の詳細情報を抽出して開発メンバーに連携する作業が時折発生してどうにかならんかな〜と思っていた際に自分の改善案を持っていって所属のチームで相談してみたところ, innodb_print_all_deadlocks というパラメーターを教えてもらいました.この記事ではこのオプションの概要と設定方法を記してきます.

innodb_print_all_deadlocks の概要

innodb_print_all_deadlocksSHOW ENGINE INNODB STATUS からデッドロックの情報についてのみ出力するパラメーターです.まさに自分が今回やろうとしてた改善に適うパラメーターでした.

このパラメータを有効にすると (1 に設定)、InnoDB ユーザートランザクションに関連するデッドロックMySQL エラーログに記録されます。それ以外の場合、この情報は SHOW ENGINE INNODB STATUS コマンドを使用して最後のデッドロックについてのみ利用できます

引用記事

aws.amazon.com

関連ドキュメント

docs.aws.amazon.com

Aurora MySQLinnodb_print_all_deadlocks を有効化する

Aurora では innodb_print_all_deadlocksクラスターパラメーターグループにあり,再起動は不要で指定できます.加えて,エラーログでデッドロックの詳細情報が出力されるので CluoudWatch Logs の出力有効化を行います.これで準備万端です.

Aurora MySQL 設定パラメータ - Amazon Aurora

デッドロック発生時のログの中身

デッドロックを試しに発生した時の CloudWatch Logs の通知内容を確認してみます.デッドロックが発生すると transactions deadlock detected, dumping detailed information のメッセージの次のログにまさに LATEST DETECTED DEADLOCK の詳細情報が出力されていました(本記事では内容部分は割愛しています).この結果を通知してあげれば,データベースにログインするオペレーションも無くなり,開発メンバーもすぐに内容確認できて良い運用のカタチを目指せそうです.

2024-03-14 02:09:32 xxxInnoDB: transactions deadlock detected, dumping detailed information.
2024-03-14 02:09:32 xxx-03-14 02:09:32 xxx
*** (1) TRANSACTION:
~各種情報~
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
~各種情報~
*** (2) TRANSACTION:
~各種情報~
*** (2) HOLDS THE LOCK(S):
~各種情報~
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
~各種情報~
*** WE ROLL BACK TRANSACTION (2)
=====================================

まとめ

Aurora のデッドロックの詳細情報を CloudWatch Logs に出力するパラメーターと設定方法をまとめました.