Answers:
如果通过SELECT或DML(INSERT,UPDATE,DELETE)完全访问InnoDB表,则应该正确地期望元数据锁定。
为了确保事务可序列化,服务器不得允许一个会话对另一个会话中未完成事务中使用的表执行数据定义语言(DDL)语句。服务器通过获取事务中使用的表上的元数据锁并将这些锁的释放推迟到事务结束之前来实现。表上的元数据锁可防止更改表的结构。这种锁定方法的含义是,在一个事务内的事务正在使用的表不能在事务结束之前由其他会话在DDL语句中使用。
话虽如此,您应该确定另一个数据库会话是否在表上持有锁。如果这样的会话是未完成的事务,则可能存在延迟。
如果您只需要快速返回磁盘空间,则可以运行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