MySQLにおけるLock wait timeoutの調査
Aurora MySQL におけるロック競合(ブロッキング)の原因を事後調査できる仕組みを作った話
MySQL (InnoDB)におけるロック待機上限を超えるとSQL Error: 1205が起きる
ブロックされていた側の情報は簡易に取得できるが、ブロッカーの情報を探すのは結構大変
記事中で検討したが選ばれなかったアプローチ
Amazon DevOps Guru for RDS
ブロックされている側の情報しか出てこなかった
監視系 SaaS
Datadogがブロッキングクエリを検出する機能を持っている
https://www.datadoghq.com/ja/blog/troubleshoot-blocking-queries-with-database-monitoring/
ただしPostgreSQLとSQL Serverしか対応してない
NewRelicなどは対応してない
DB 系の OSS、DB モニタリングツール
OSSでは対応なし
有償サービスは高価
自作したアプローチ
sys.schema_table_lock_waits 経由でperformance_schemaから情報を得る
スレッドIDを特定した後、performance_schema.events_statements_history から該当スレッドが過去に実行した直近 N 件の SQL テキストを取得する
Aurora MySQLのGeneral Log
有効化している場合、CloudWatch Logs Insights で該当プロセスが実行した SQL の履歴を全て取得できる