数据库锁表排查
问题
客户反馈后台系统信息添加很卡,然后添加失败,无法添加
查看服务日志,发现mysql报错锁表
程序和数据库近期没有改动,所以首先锁定日志排查,确认锁的表和具体原因
解决
根据tomcat输出的日志,确认为mysql报错抛出的问题
根据打印的堆栈,找到对应代码,发现报错处是一个删除方法
查询锁表的SQL线程,是删除语句,删除时耗时较长卡主了
# 查询现有事务,看哪些进程在等待
select * from information_schema.innodb_trx;
# 紧急处理,可以先删除现有事务进程
SELECT CONCAT('kill ',trx_mysql_thread_id,';') FROM INFORMATION_SCHEMA.INNODB_TRX;
1
2
3
4
查看业务后,发现是信息更新时需要删除一些关联表信息,主表200万左右数据,关联表是主表的3倍左右,700多万,没有加索引,查询删除时较慢
由于一直有客户操作,无法添加索引,只能把tomcat服务停掉
tomcat服务停掉后,对关联表的删除查询所需字段public_content_id加了索引,恢复正常
后续
后面又遇到一次,信息删除时报错,查看了下,发现数据量不是特别大,其他业务数据库查询也很正常
追踪了错误日志,也是Lock wait timeout,但是把sql单独执行,发现很快
判断应该是其他业务请求返回很慢,一直挂起等待返回,导致同一个线程的删除服务的SQL执行超时,回滚
查看了具体的业务,删除mysql信息时,需要同步删除elasticsearch的索引信息。删除索引出错,设置的超时时间又很长,比mysql执行超时时间还长,进而一直未报elasticsearch的超时错误而报了mysql的超时错误
对elasticsearch删除问题进行了处理,并将索引操作另起线程,放入线程池执行,问题解决
————————————————
版权声明:本文为CSDN博主「坚持是一种态度」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010882234/article/details/116564545