例行 DROP TABLE history_log_20141017 耗時 15000+ 秒,SHOW PROCESSLIST 顯示 Waiting for table metadata lock。
mysqldump --single-transaction 開啟長事務,期間所有涉及表持有 MDL。MyISAM、InnoDB、Memory 等**所有引擎**共用同一套 MDL 子系統。引擎只負責數據/索引存取,MDL 在 Server 層統一管理。
| 版本 | MDL 釋放時機 | 影響 |
|---|---|---|
| 5.0 / 5.1 | 語句結束即釋放 | DDL 僅阻塞當前語句,影響極小 |
| 5.5+ | **事務結束**才釋放 | 長事務導致 DDL 長時間阻塞,甚至引發連鎖堵塞 |
-- Session 1 BEGIN; SELECT * FROM t_myisam; -- 持有 t_myisam MDL -- Session 2 DROP TABLE t_myisam; -- 阻塞:Waiting for table metadata lock -- Session 1 COMMIT; -- Session 2 瞬間執行成功
--single-transaction --quick --max_allowed_packet=1G。ALTER TABLE ... ALGORITHM=INPLACE, LOCK=NONE 減少鎖表時間(但仍需等待 MDL)。SELECT * FROM information_schema.INNODB_TRX WHERE trx_started < NOW() - INTERVAL 1 MINUTE;
KILL trx_mysql_thread_id。# error.log 11966363, hardcore, localhost, oss_log, Query, 11084, Waiting for table metadata lock, drop table 2014_10_17_oss_abandonquest