Yao が、
アイドル状態である MySQL トランザクションを見つける方法を示します

blocked-mysql-query-yao

MySQL を実行している Amazon Relational Database Service (Amazon RDS) インスタンスでクエリを実行しようとしましたが、クエリがブロックされました。その時に、他のクエリは実行されていませんでした。なぜクエリがブロックされたのですか?この問題はどうすれば解決できますか?

クエリがブロックされた最も一般的な原因は、コミットされていない InnoDB トランザクションです。これにより、新しいクエリがブロックされ、スリープし、ロック待機タイムアウトを超えた場合は最終的に失敗する可能性があります。

コミットされていないトランザクションを特定する

1.     INNODB_TRX テーブルに対して以下のクエリを実行することで、現在実行中であるトランザクションを特定します。

select * from information_schema.innodb_trx\G

2.    クエリの結果にある実行中のトランザクションを、アプリケーションの動作およびワークロードと一致させます。これは時間のかかるプロセスですが、アクションを実行する前に、それぞれのクエリがデータベースとアプリケーションの状態に及ぼす潜在的な影響を理解することが重要です。

3.    ブロックの原因であるトランザクションを特定したら、トランザクションの trx_state を確認し、トランザクションを停止またはロールバックした場合の影響を検討します。注意: 長時間実行される操作をロールバックすると、データベース、アプリケーション、ユースケースなどに悪影響を与える可能性がある I/O またはロック処理がシステムで発生する可能性があります。

トランザクションの停止

トランザクションを停止したい場合は、次の手順を実行して、実行中の InnoDB トランザクションを停止 (kill) することができます。

1.    以下のコマンドを実行して、Running (実行中) 状態である、すべての InnoDB トランザクションを見つけます。

select * from information_schema.innodb_trx\G

2.    停止したい InnoDB トランザクションのスレッド ID に注意します。

3.    次のコマンドを実行して、実行中のトランザクションを停止 (kill) します。ここで、thread-id は実行中の InnoDB トランザクションのスレッド ID です。

CALL mysql.rds_kill(thread-ID)

トランザクションが停止したら、ブロックされたクエリを再度実行してみてください。


このページは役に立ちましたか? はい | いいえ

AWS サポート ナレッジ センターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください。

公開日: 2017 年 3 月 15 日

更新: 2018 年 7 月 5 日