因数据库表被锁死导致服务假死的排查和解决过程
一、背景
某日早上还未到公司,质量部门同事就反馈说有个项目一直报错,我到公司之后发现果然如此,很多接口请求之后没有任何响应,同时另一个系统也有部分功能不可用。
二、排查和解决过程
我把没有响应的接口的代码翻看了一下,发现都和magic-api项目有关,然后就去服务器查看magic-api服务,发现该服务已假死。于是重启该服务,果然那几个有问题的功能都恢复正常了,我以为问题就此彻底解决了。没想到过了不到半小时,又复现了。
于是,我把magic-api服务的日志下载到本地仔细排查,幸好里面记录了每次执行的sql,我就把这些sql从后往前一一在生产环境上执行,发现有两个sql执行了80多秒依然不出结果,可见问题就在这两条sql上了。于是又定位到magic-api上使用这两条sql的接口,再在业务代码中查找调用这两个接口的地方,发现都是在我们一个系统的首页中有调用。当机立断,我决定先把这个系统的首页屏蔽掉以避免用户每次进入首页都访问这两个接口从而导致magic-api项目假死进一步引起其他系统的问题,在解决完问题之后再解除首页的屏蔽。
我仔细研究上面那两个sql,把其中的表一个个的单独访问,发现单独访问某个表时就无法获取执行结果。所以我断定这张表被锁死了。
然后我百度如何查找mysql数据库中有哪些表被锁死,以及解决办法,搜到一个命令:
SHOW PROCESSLIST;
通过上面的这个命令可以查出当前正在执