我试图使用
DROP TABLE IF EXISTS <myTableName>;
然而,即使几个小时后它仍然在运行。有关解决方法的任何建议吗?
答案 0 :(得分:14)
我遇到了同样的问题,它刚刚通过重新启动服务器来解决:
sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql start
也许正在举行一些锁定并重新启动它。
答案 1 :(得分:8)
更好的方法:
假设您要在数据库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;
解决方案完全相同。