MySQL:Slow Drop table命令

时间:2014-06-30 18:49:51

标签: mysql

我试图使用

DROP TABLE IF EXISTS <myTableName>;
然而,即使几个小时后它仍然在运行。有关解决方法的任何建议吗?

2 个答案:

答案 0 :(得分:14)

我遇到了同样的问题,它刚刚通过重新启动服务器来解决:

sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql start

也许正在举行一些锁定并重新启动它。

答案 1 :(得分:8)

更好的方法:

杀死所有执行DROP操作的进程

假设您要在数据库table中删除表database

1)在并行会话中登录到mysql,最好以root用户身份登录。 问题:

SHOW PROCESSLIST;

您将在db * 上看到所有进程的列表:

+-------+-----------+-----------+----------+---------+------+---------------------------------+------------------------------+----------+
| Id    | User      | Host      | db       | Command | Time | State                           | Info                         | Progress |
+-------+-----------+-----------+----------+---------+------+---------------------------------+------------------------------+----------+
| 38239 | username  | 10.0.0.1  | database | Sleep   |  591 |                                 | NULL                         |    0.000 |
| 38240 | username  | 10.0.0.1  | database | Sleep   |  590 |                                 | NULL                         |    0.000 |
| 38245 | username  | 10.0.0.1  | database | Query   | 2636 | Waiting for table metadata lock | DROP TABLE IF EXISTS `table` |    0.000 |
| 38257 | username  | localhost | database | Query   |    0 | init                            | SHOW PROCESSLIST             |    0.000 |
+-------+-----------+-----------+----------+---------+------+-------+---------------------------------+----------------------+----------+

2)如果在DROP之前 处有任何活动进程,则应等待它们完成(如果确定,请终止它们)。

3)然后在等待的那个进程之前杀死所有“休眠”的进程:

KILL 38239;
KILL 38240;

4)之后,被阻止的进程应继续执行DROP操作。

DROP之前的等待是InnoDB中的一个已知问题。


更新:还注意到非排他性更新(受影响记录的数量可能有所不同的更新)上的此行为,例如:

# may update any number of customers, from 0 to all
UPDATE customers SET `active` = 'N' WHERE `last-payment-date` < 2018-01-01;

解决方案完全相同。


  • 提供的表摘自现实生活中的场景,为了安全和演示目的,对数据进行了混淆和略微编辑。