気ままに

プログラム関連で困ったことを調べて気ままに投稿

【障害対応】MySQLでデットロックが発生した時の対応方法

RDSのMySQL5.6でデットロックが発生し、対処に時間がかかったので、対応メモ。

AWSWordPress環境を構築して、DBはRDSにMySQL5.7で運用中。 突然500エラーが頻発している通知を受け取ったので確認。

よくわからないが、サーバが500エラー返すようになった。サーバの負荷が高いわけでもないし、キャッシュがおかしくなったわけでもない。 いつもならこのどちらかが原因(botの大量アクセスがくるとLAが上がって一時的に500を返すことが多い。原因は画像数やCSS、JSの読み込みが多いからなのだが、コンテンツは別のとこが受けているので、手出ししにくい)だが、いつもと様子が違う。

エラーログを見てみると、デットロックと思いッきり出ていた。 MySQLでデットロックが起きた時の対処方法わからなかったので、今回参考までに。

# DBと接続しているトランザクションの情報の詳細を表示
mysql> show engine innodb status;

# プロセスが使用している対象のテーブルの状況確認
mysql> show open tables where In_use > 0;

## ↑ここまでが現状把握

# 実行中のプロセスの一覧を取得(IDがprocess id)
mysql> show processlist;

# ↑のコマンドで、「Lock xxx」となっているプロセスを停止する
mysql> kill <process id>;

今回は、バッチ処理に問題があり、デットロックしているプロセスを停止しても延々とデットロックのプロセスができあがるので、 デットロックプロセスが実行しているSQLをkill直後に実行(DELETE 文)して、データの不整合を解決。 詰まっていたところが流れ、表示も通常運転に戻りました。

月曜日に確かにバッチ修正してリリースしてたのすっかり忘れてた。。。

やさしく学べるMySQL運用・管理入門【5.7対応】

やさしく学べるMySQL運用・管理入門【5.7対応】

詳解 MySQL

詳解 MySQL