4

当我尝试删除数据库时,它会挂起。进程列表显示:

20045 | root | localhost | NULL | Query | 4 | Waiting for table metadata lock | drop database dbname1

整个数据库中没有外键,也没有锁定。以下是相同的详细信息:

mysql>
mysql> select * from INNODB_LOCKS ;
Empty set (0.00 sec)

mysql> select * from INNODB_LOCK_WAITS ;
Empty set (0.01 sec)

我不知道为什么会发生这种情况,有人对此问题有任何想法吗?我正在使用 MySQL 5.5.31-0ubuntu0.12.04.1-log (Ubuntu)。

4

3 回答 3

5

如果您想立即解决问题,只需重新启动 mysql,然后再尝试删除数据库。我也遇到过类似的问题,上述技巧对我总是有效的。

于 2013-08-27T12:18:08.870 回答
0

感谢大家的回复。所有方法都可以很好地解决这个问题。

其实我知道如何克服,但我希望它有一些相同的预防方法。

实际上,每当我遇到此问题时,只需杀死所有睡眠线程并重新运行 alter 或 drop 即可解决它,或者您解释的任何方法也将起作用。

但是看看我们需要一些停机时间的所有方法,你知道这对生产数据库意味着什么。

我观察到的主要事情是,一些早期的命令/事务使用了该表,现在它们处于睡眠模式,这一次又一次地导致了这些情况。

应该有一些预防方法。我还在寻找它。
一个简单的解决方案,我目前使用的是,我创建了一个 bash 脚本,它定期检查(每隔几分钟)MySQL 进程列表,如果有任何线程,即等待元数据锁定并且时间超过 30 秒,它会发送警报电子邮件或执行上述所有步骤来克服这些情况。

我知道这不是完整的解决方案,但是每当数据库遇到相同的情况时,脚本总是会向我发送警报。
我仍然在寻找最佳解决方案,每当我得到时,我都会在这里发布。

于 2014-03-06T05:47:50.413 回答
0

有多种原因:

  • 有时您的数据库正在使用>>可能是您尝试删除时正在执行某些事务/查询。
  • 可能是查询窗口打开并选择了数据库名称。在这种情况下,它会告诉查询窗口正在使用数据库,因此您不能删除数据库。
于 2014-03-05T19:04:33.133 回答