专栏文章 锁表导致的程序卡死

会飞的猪 · 2020年04月22日 · 984 次阅读

问题现象
程序日志不打印了,停留在某个位置,也没有任何报错,进程时启动状态,执行其他任务无反应

第一反应
三板斧中的一个:
重启应用,但是没有解决问题。
测试环境的代码没有问题,生产和测试之间的差别即为数据差别。所以怀疑是数据库出了问题。

解决方法使用命令
查询 mysql 数据库是否存在假死的 sql,果然发现了。
show processlist

查看 state 中存在这样的描述
(当时没有保留现场,所以找了另一张图)
Waiting for table metadata lock

解决办法
kill id 杀掉这个进程。
日志就继续打印,程序就继续运行了。

问题原因
在进行 alter table 操作时,有时会出现 Waiting for table metadata lock 的等待场景。而且,一旦 alter table TableA 的操作停滞在 Waiting for table metadata lock 的状态,后续对 TableA 的任何操作(包括读)都无法进行,也会在 Opening tables 的阶段进入 Waiting for table metadata lock 的队列。如果是产品环境的核心表出现了这样的锁等待队列,就会造成灾难性的后果。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册