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