删除表使MySQL挂起

coo*_*_cs 20 mysql locks

当我试图删除一个表时,MySQL挂起了.我没有任何其他公开会议.怎么解决这个?我等了10个小时,这个过程还没有结束.

Seb*_*bas 17

Waiting for table metadata lock
drop table tableA name

SELECT l1.lat, l1.lon, l2.zipcode FROM tableA l1, tableBl2 where l1.lat = l2.latitude and l1.lon = l2.longitude limit 10
Run Code Online (Sandbox Code Playgroud)

如果这是您的表格,请参阅此链接

你有一个隐含的死锁.杀死其他事务以释放丢弃,或者杀掉drop以释放其他事务.

您可以在sql_plus中使用KILL thread_id.


自从我想出另一个有趣的经历后,我正在添加更多信息.

Metadata死锁可能同样发生在给定表(drop,alter...)上的ddl操作和该表上的选择查询之间.

是的,select.

因此,如果您在mysql(或php,例如with pdo::fetch)中循环游标,并在同一个表上运行ddl语句,则会出现死锁.

这种非典型场景的一个解决方案是在commit完全提取任何select语句之后系统地释放带有语句的隐式锁.


小智 17

我正在尝试为新手提供更简单的答案,因为我是:

1)运行:

SHOW PROCESSLIST
Run Code Online (Sandbox Code Playgroud)

如果你得到类似的东西:

+----+-----------------+-----------------+--------+------------+-----------+---------------------------------+---------------------------------------------------+
| Id | User            | Host            | db     | Command    | Time      | State                           | Info                                              |
+----+-----------------+-----------------+--------+------------+-----------+---------------------------------+---------------------------------------------------+
|  4 | event_scheduler | localhost       | NULL   | Daemon     | 580410103 | Waiting on empty queue          | NULL                                              |
| 13 | root            | localhost:50627 | airbnb | Sleep      |     10344 |                                 | NULL                                              |
| 17 | root            | localhost:50877 | NULL   | Query      |      2356 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`characteristics` |
| 18 | root            | localhost:50878 | airbnb | Query      |      2366 | Waiting for table metadata lock | DROP TABLE `airbnb`.`characteristics`             |
| 21 | root            | localhost:51281 | airbnb | Query      |      2305 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`bed_type`        |
| 22 | root            | localhost:51282 | airbnb | Query      |      2301 | Waiting for table metadata lock | SHOW INDEXES FROM `airbnb`.`characteristics`      |
| 23 | root            | localhost:51290 | airbnb | Query      |      2270 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`property_type`   |
| 24 | root            | localhost:51296 | airbnb | Query      |      2240 | Waiting for table metadata lock | SHOW INDEXES FROM `airbnb`.`property_type`        |
| 26 | root            | localhost:51303 | NULL   | Query      |      2212 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`characteristics` |
| 27 | root            | localhost:51304 | NULL   | Query      |      2218 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`bed_type`        |
| 29 | root            | localhost:51306 | NULL   | Query      |      2176 | Waiting for table metadata lock | SHOW INDEXES FROM `airbnb`.`characteristics`      |
| 30 | root            | localhost:51308 | NULL   | Query      |      2122 | Waiting for table metadata lock | DROP TABLE `airbnb`.`characteristics`             |
| 34 | root            | localhost:51312 | NULL   | Query      |      2063 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`characteristics` |
| 35 | root            | localhost:51313 | NULL   | Query      |      2066 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`bed_type`        |
| 39 | root            | localhost:51338 | NULL   | Query      |      2004 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`characteristics` |
| 40 | root            | localhost:51339 | NULL   | Query      |      2008 | Waiting for table metadata lock | SHOW FULL COLUMNS FROM `airbnb`.`bed_type`        |
| 45 | root            | localhost       | airbnb | Field List |       997 | Waiting for table metadata lock |                                                   |
| 46 | root            | localhost       | airbnb | Field List |       798 | Waiting for table metadata lock |                                                   |
| 53 | root            | localhost       | airbnb | Query      |         0 | starting                        | SHOW PROCESSLIST                                  |
+----+-----------------+-----------------+--------+------------+-----------+---------------------------------+---------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

with State:等待表元数据锁(如官方回答中所述)

2) KILL 13 (13 对应于 Id)。

如果确实是死锁,那么后面的所有过程都会正常进行。


fif*_*nce 13

重启MySQL可能不是最漂亮的解决方案,但它对我有用:

sudo /etc/init.d/mysql restart
mysqladmin drop YOURDATABASE
Run Code Online (Sandbox Code Playgroud)