数据库死锁和慢日志问题导致服务不可用的排查过程

 数据库执行更新失败,查看日志

首先是根据报的Exception进行排查:

org.hibernate.exception.LockAcquisitionException: could not execute statement

很明显,是数据库死锁,导致不能执行我的更新sql。

思路一:查找并杀死死锁的进程

查看进程

-- 查询是否锁表
show OPEN TABLES where In_use > 0;
-- 查询当前用户进程
SHOW PROCESSLIST;
-- 查询当前的事务 
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
-- 查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 
-- 查看当前等锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

查找出占用当前锁的进程id,kill掉即可。

kill 1234;

通过上面方式未查询到死锁的进程,为排除其他进程影响,我将连接该数据库的进程都kill掉,之后重启服务进行重新连接,问题依然存在。

思路二:断开的管道

数据库死锁产生的原因有:

  • 系统资源不足
  • 进程运行推进的顺序不合适
  • 资源分配不当等

通过上面排查基本排除掉是业务代码产生死锁,接下来排查系统资源,通过排查,发现果然是系统资源的原因导致。慢日志占用空间过大,导致数据库所在服务器不能再进行写入,所以报IOException。排查问题时也应该先从IO异常开始的。

接下来就是分析慢日志,确定是业务代码原因还是慢日志配置的原因(执行时间设定等),分析完之后删掉腾出空间。

 

posted @ 2019-06-04 01:47  雪山上的蒲公英  阅读(1700)  评论(2编辑  收藏  举报
/* 返回顶部代码 */