数据库锁表MySQLTransactionRollbackException: Lock wait timeout exceeded; try restartin排查过程
问题客户反馈后台系统信息添加很卡,然后添加失败,无法添加查看服务日志,发现mysql报错锁表程序和数据库近期没有改动,所以首先锁定日志排查,确认锁的表和具体原因解决根据tomcat输出的日志,确认为mysql报错抛出的问题根据打印的堆栈,找到对应代码,发现报错处是一个删除方法查询锁表的SQL线程,是删除语句,删除时耗时较长卡主了# 查询现有事务,看哪些进程在等待select * from info
·
问题
- 客户反馈后台系统信息添加很卡,然后添加失败,无法添加
- 查看服务日志,发现mysql报错锁表
- 程序和数据库近期没有改动,所以首先锁定日志排查,确认锁的表和具体原因
解决
- 根据tomcat输出的日志,确认为mysql报错抛出的问题
- 根据打印的堆栈,找到对应代码,发现报错处是一个删除方法
- 查询锁表的SQL线程,是删除语句,删除时耗时较长卡主了
# 查询现有事务,看哪些进程在等待
select * from information_schema.innodb_trx;
# 紧急处理,可以先删除现有事务进程
SELECT CONCAT('kill ',trx_mysql_thread_id,';') FROM INFORMATION_SCHEMA.INNODB_TRX;
- 查看业务后,发现是信息更新时需要删除一些关联表信息,主表200万左右数据,关联表是主表的3倍左右,700多万,没有加索引,查询删除时较慢
- 由于一直有客户操作,无法添加索引,只能把tomcat服务停掉
- tomcat服务停掉后,对关联表的删除查询所需字段
public_content_id
加了索引,恢复正常
后续
- 后面又遇到一次,信息删除时报错,查看了下,发现数据量不是特别大,其他业务数据库查询也很正常
- 追踪了错误日志,也是
Lock wait timeout
,但是把sql单独执行,发现很快 - 判断应该是其他业务请求返回很慢,一直挂起等待返回,导致同一个线程的删除服务的SQL执行超时,回滚
- 查看了具体的业务,删除mysql信息时,需要同步删除elasticsearch的索引信息。删除索引出错,设置的超时时间又很长,比mysql执行超时时间还长,进而一直未报elasticsearch的超时错误而报了mysql的超时错误
- 对elasticsearch删除问题进行了处理,并将索引操作另起线程,放入线程池执行,问题解决
更多推荐
已为社区贡献6条内容
所有评论(0)