问题

  • 客户反馈后台系统信息添加很卡,然后添加失败,无法添加
  • 查看服务日志,发现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删除问题进行了处理,并将索引操作另起线程,放入线程池执行,问题解决
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐