【问题标题】:Dropping table makes MySQL hang删除表使 MySQL 挂起
【发布时间】:2012-06-07 22:34:47
【问题描述】:

当我尝试删除表时,MySQL 挂起。我没有任何其他公开会议。如何解决这个问题?我已经等了 10 个小时,这个过程还没有结束。

【问题讨论】:

  • 如果数据库当然在innodb下,请发布SHOW ENGINE INNODB STATUS的结果
  • 看起来您尝试删除的表已在使用中(嗯,我的意思是它已被其他进程锁定),因此它正在等待进程提交。
  • @cool_cs,你运行的是哪个 mysql 版本?这看起来像是旧版本 mysql(mysql 版本:4.1.22、4.1.24)中的错误。看到这个:bugs.mysql.com/bug.php?id=31937
  • 你能运行这 2 个命令并摆出结果吗? 1.show innodb status\G 和 2.show processlist。还有,show open tables;
  • 我已经发布了这些命令的输出。

标签: mysql locks


【解决方案1】:
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

如果这是您的餐桌,请参阅this link

你有一个隐含的死锁。杀死其他事务以释放 drop,或杀死 drop 以释放其他事务。

你可以在sql_plus中使用KILLthread_id。


因为我想出了另一个有趣的经历,所以我正在添加更多信息。

Metadata 在给定表(dropalter...)上的 ddl 操作和对该表的 select 查询之间可能同样发生死锁。

是的,select

因此,如果您在 mysql(或 php,例如 pdo::fetch)中循环游标,并在同一张表上运行 ddl 语句,您将遇到死锁。

这种非典型场景的一种解决方案是在完全获取任何 select 语句后使用 commit 语句系统地释放隐式锁。

【讨论】:

  • 我删除了表,现在我无法创建新表,因为我收到错误代码 (28): cannot sync file '..' to disk。我假设通过放下桌子我会有更多的可用空间。
  • 哪个文件?我认为您应该重新启动服务器,因为锁定持续了很长时间。
  • 当我运行一个包含多个列的非常大的创建表语句时,我收到此错误消息。重新启动服务器是指退出并重新连接吗?你如何明确重启服务器?
  • 重启你的服务器,然后在堆栈溢出中打开一个新的缺陷:-)
  • 我通过使用mysqladmin processlistmysqladmin kill as shown here 解决了这个问题。如果您的 root 用户具有 SUPERprivileges 或者使用拥有阻塞进程的用户登录,则可以完美运行。
【解决方案2】:

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

1) 运行:

SHOW PROCESSLIST

如果你得到类似的东西:

+----+-----------------+-----------------+--------+------------+-----------+---------------------------------+---------------------------------------------------+
| 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                                  |
+----+-----------------+-----------------+--------+------------+-----------+---------------------------------+---------------------------------------------------+

with State : waiting for table metadata lock(官方回答中提到)

2) KILL 13(对应Id的13个)。

如果确实是死锁,后面的所有进程都会正常继续。

【讨论】:

    【解决方案3】:

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

    sudo /etc/init.d/mysql restart
    mysqladmin drop YOURDATABASE
    

    【讨论】:

    • 我不想删除数据库,因为它会删除对该数据库的权限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多