我正在寻找用于我的开发的 MySQL 数据库的建议。我有一个表被锁定,虽然没有进程处于活动状态。
这里有一些上下文:我是这个 MySQL 开发数据库的开发人员,没有管理权限。所有表都在 MyISAM 上。两天内我第二次发现访问特定表的所有进程都在等待锁定。我正在应用层上运行这 30 个并发进程。这些进程正在对该表进行稳定更新(可能每秒向该表添加 40 行)。此表有一个主键和一个附加索引。它有 6 列,其中 2 列带有 blob。目前,该表包含 2370 万行,大小约为 51GB。
当我发现我的 30 个进程都因为这张表上的锁而被卡住时,我首先将它们全部杀死。SHOW PROCESSLIST
然后我通过为所有会话执行并发布来终止仍然打开的KILL
会话。问题是即使在终止这些会话之后,有问题的表仍然显示SHOW OPEN TABLE
值为IN_USE
2,尽管SHOW PROCESSLIST
是空的。
我无法弄清楚为什么会发生这种情况的合理原因。现在没有进程可以杀死了。REPAIR TABLE
由于等待锁,我无法修复桌子。昨天晚上我遇到了这个问题,今天早上锁像魔术一样消失了。现在它再次出现。
有人知道为什么会发生这种情况吗?对我或我的 DBA 有什么正确的方法来恢复和避免问题再次发生吗?
编辑:奇怪的是,当我写这篇文章的时候,IN_USE
这个表的值从 2 减少到 1。对于同一个数据库中的另一个表,从 0 移动到 1。因为我没有做任何可以解释后者增加的事情,我怀疑 MySQL 可能正在做一些特别的事情。
推测,由于表在 MyISAM 中,因此表中可能存在损坏。由于在线检查服务器时它处于锁定状态,因此如果可能,请在关闭服务器后尝试在卡住的表(可能还有所有表)上使用 myisamchk。51GB 的数据量很大,因此可能需要一段时间。如果可能,建议按照评论者的建议将表转换为 InnoDB;相应地调整服务器配置。
参考:http ://dev.mysql.com/doc/en/myisamchk.html
实际上问题是由日常脚本运行
OPTIMIZE TABLE
语句引起的。我看不到我的用户的进程。此命令使用 MyISAM 和 5.7.4 之前的 InnoDB 锁定表。来源:http ://dev.mysql.com/doc/refman/5.7/en/optimize-table.html