V2.2版本有用户遇到接口自动化调试出现死锁的问题,问题现象:除了接口自动化模块,单接口用例、用例执行都是正常的。此处简单记录下死锁出现及排查过程。
1、参考历史出现死锁问题https://github.com/metersphere/metersphere/issues/17972查询了相关数据库相关死锁事务,未发现具体死锁错误
a、查看正在锁的事务, select * from performance_schema.data_locks;
b、查看等待锁的事务,select * from performance_schema.data_lock_waits;
c、查看正在运行中的事务 SELECT * FROM information_schema.innodb_trx;
d、查看是否锁表,show open tables where IN_use > 0
e、查看正在进行的进程 show processlist
f、show status like "%lock%"
2、配置并开启mysql的BinLog日志
参考了一篇博文《MySQL死锁系列-线上死锁问题排查思路》https://www.cnblogs.com/remcarpediem/p/13843180.html
给数据库配置了binlog日志方法,通过相关的binlog 日志会完整记录事务执行的所有 SQL,借助它找到最终获取锁事务所执行的全部 SQL。然后再进行具体的锁冲突分析。
(1)通过navicat 连接工具执行如下命令,开启binlog开关
- 执行相关sql即可看到记录的binlog日志:
-- 开启标准监控
set GLOBAL innodb_status_output=ON;
-- 关闭标准监控
set GLOBAL innodb_status_output=OFF;
-- 开启锁监控
set GLOBAL innodb_status_output_locks=ON;
-- 关闭锁监控
set GLOBAL innodb_status_output_locks=OFF;
set GLOBAL innodb_print_all_deadlocks=ON;
-- 查询binglog日志数据
show master logs;
(2)当死锁出现时,可以进入mysql容器/var/lib/mysql/下找到最近时间的死锁binlog日志。可以相关命令将文件转换为文本格式方便查看Mysqlbinlog -h127.0.0.1 -u root -p --read-from-remote-server binlog.000001 --base64-output=decode-rows -v
- 因为此处MeterSphere没有默认安装Mysqlbinlog命令,我的处理方式是将容器日志拷贝出来,用windows上安装的mysql8.0自带的Mysqlbinlog 命令转换为log日志
- docker cp mysql:/var/lib/mysql/mysql-bin.000040 ./
- mysqlbinlog.exe --base64-output=decode-rows -v "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql-bin.000024" >mysqlbin.log