1つのテーブルを削除しようとしていますが、それがハングアップしています。「SHOW PROCESSLIST」コマンドを見ると、「メタデータのロックを待っています」と表示されています。その特定のテーブルで操作を実行することもできません。誰かがそれを解決する方法を知っていますか?
InnoDBテーブルがSELECTまたはDML(INSERT、UPDATE、DELETE)を介してまったくアクセスされている場合、メタデータのロックが予想されます。
メタデータロックに関するMySQLドキュメント によると:
トランザクションの直列化を保証するために、サーバーは、あるセッションが別のセッションの未完了のトランザクションで使用されているテーブルに対してデータ定義言語(DDL)ステートメントを実行することを許可してはなりません。サーバーは、トランザクション内で使用されるテーブルのメタデータロックを取得し、トランザクションが終了するまでそれらのロックの解放を延期することにより、これを実現します。テーブルのメタデータロックは、テーブルの構造への変更を防ぎます。このロック方法では、トランザクションが終了するまで、1つのセッション内のトランザクションで使用されているテーブルを、他のセッションのDDLステートメントで使用することはできません。
つまり、別のDBセッションがテーブルのロックを保持しているかどうかを判断する必要があります。そのようなセッションが未完了のトランザクションである場合、保留が存在する可能性があります。
ディスク容量をすばやく戻す必要がある場合は、TRUNCATE TABLE
を実行できます。
次のように削除する前に、テーブルの名前を変更してください。
ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;
次のコマンドを実行して、どのクエリがトランザクションロックを引き起こしているかを確認する必要があります。
SHOW ENGINE INNODB STATUS
TRANSACTION
という名前のセクションを参照してください。後でデータベースを削除するには、そのクエリを強制終了する必要があります。