问题:线上接口无响应,无法获取数据
排查:执行mysql命令show processllist查询数据库中哪些线程正在执行
- .先怀疑是数据库操作死锁了,把程序代码反复也为发现可能出现死锁的地方
- 后各种百度查询,看到大神的问题怀疑是数据库引擎myisam的问题(myisam读写的时候会加表锁),查看数据库引擎是innodb,这就怀疑人生了又是各种百度,看到MDL元数据锁会提示‘waiting for level lock’,但是程序中也没有执行操作更改表结构的操作呀;
- 又是各种百度的也未找到原因,偶然间发现线上环境的一些表引擎是myisam,而本地是innodb,真是醉了了。。。又去修改线上表引擎
- 另外执行linux命令df -h 发现/dev/vda1使用了98%,又去清除了一些没有用的日志文件
总结:waiting for level lock的出现在myisam引擎的数据表上面,
优化方案:
①减少查询myisam表时间比较长的连表操作,长时间查询会锁住表,其他的操作此表会出现锁等待的情况;
②粗暴一点直接修改表引擎,innodb这里需要注意的是innodb默认是支持行锁的,通过索引来加锁,如果未使用索引将会变为表锁;
另外还需注意磁盘的剩余空间