他のクエリが実行されていないときに、Amazon RDS MySQL DB インスタンスへのクエリがブロックされたのはなぜですか?

最終更新日: 2019 年 12 月 26 日

MySQL を実行している Amazon Relational Database Service (Amazon RDS) DB インスタンスでクエリを実行しようとしましたが、クエリがブロックされました。その時点では、他のクエリは実行されていませんでした。クエリがブロックされた理由と、この問題を解決する方法を教えてください。

解決方法

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

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

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

select * from information_schema.innodb_trx\G

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

3.    ブロックしているトランザクションを特定したら、トランザクションの trx_state を確認し、トランザクションを停止またはロールバックすることの意味を検討します。注意: 長時間実行される操作をロールバックすると、データベース、アプリケーション、またはユースケースに悪影響を及ぼす可能性があるシステムで I/O またはロックアクティビティが生成される可能性があります。

トランザクションを停止

トランザクションを停止する場合は、次の手順に従って、実行中の InnoDB トランザクションを停止 (強制終了) できます。

1.    Running ステータスであるすべての InnoDB トランザクションを検索します。

select * from information_schema.innodb_trx\G

2.    停止する InnoDB トランザクションのスレッド ID をメモします。

3.    次のコマンドを実行して、Running ステータスであるトランザクションを停止 (強制終了) します。ここで、thread-ID は実行中の InnoDB トランザクションのスレッド ID です。

CALL mysql.rds_kill(thread-ID)

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


この記事は役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合