内容纲要
概要描述
本文主要介绍,如何部署监控脚本,捕捉事务锁信息。
详细说明
测试环境:kundb 3.2.2-final
1.部署监控脚本
上传脚本文件 check_long_trx_wait 并解压,修改连接方式
kundb的连接方式,有多种方式可供选择:
1.如果是 直连kungate(默认连接到shard1),参考截图
2.如果是 通过socket连接底层 shard2/shard3...,参考:
mysql_conn="mysql --socket=/mnt/disk5/kundb1/shard1/kundbdata/mysql.sock"
3.如果是 连接高可用kundb:
passwd='TEwD8*9#Qm!Pd&AG'
mysql_conn="mysql --socket=/mnt/disk3/kundb5/kundbdata/mysql.sock -p${passwd}"
注意:
1.min_wait_time
锁等待时长阈值,只有超过该时间才会被记录。如果要排查的sql执行时长少于5s,需要降低该阈值
2.check_time
检查次数,设置了脚本运行的次数上限,如果想让程序一直运行,可修改脚本while为true保证持续运行。同时需保证脚本输出不会占用过多的磁盘空间。
3.如果只关注对某张表的操作,可以修改脚本,对events_statements_current
/events_statements_history
表做where lower(sql_text) like '%testtb%'
的过滤。
chmod +x check_long_trx_wait.sh
nohup sh check_long_trx_wait.sh &
保证脚本后台运行
2. 运行测试demo
-session1:
begin
update lkw.testtb set name='zhangsan' where id=1;
-session2:
update lkw.testtb set name='lisi' where id=1;
这里session2一般会持续运行一段时间,最终报错 Lock wait timeout exceeded; try restarting transaction
3. 分析脚本输出
解读下 long_wait_lock_info_20250106_113018 【这里贴上日志附件供大家参考】 日志输出,
----------------------------------------------------------------------------------------------
=======================begin check====================
...
2025-01-06 11:30:33.483
REQUESTING_THREAD_ID: 168
REQUESTING_ENGINE_TRANSACTION_ID:24804
BLOCKING_THREAD_ID: 126
BLOCKING_ENGINE_TRANSACTION_ID:24803
# TIMER_WAIT_SECONDS 会持续增长,直至临近 innodb_lock_wait_timeout (默认180秒)
TIMER_WAIT_SECONDS: 7.0410 REQUESTING_WAIT_SQL: update lkw.testtb set name='lisi' where id=1
OBJECT_SCHEMA: lkw
OBJECT_NAME: testtb
INDEX_NAME: PRIMARY
LOCK_DATA: 1
REQUESTING_PROCESSLIST:
PROCESSLIST_ID: 114
PROCESSLIST_USER: sysdba
PROCESSLIST_HOST: 172.22.23.1
BLOCK_PROCESSLIST:
PROCESSLIST_ID: 72
PROCESSLIST_USER: sysdba
PROCESSLIST_HOST: 172.22.23.1
# 阻塞进程的历史sql(events_statements_history 默认记录每个线程最近的十条SQL信息,由全局参数performance_schema_events_statements_history_size决定,默认是10。所以检查间隔check_interval
为5秒的情况下,一般是可以捕捉到sql语句的。)
BLOCKING THREAD HISTORY:
*************************** 1. row ***************************
...
...
*************************** 7. row ***************************
SQL_TEXT: update lkw.testtb set name='zhangsan' where id=1
EVENT_ID: 28
END_EVENT_ID: 28
TIMER_WAIT_SECONDS: 0.0213
LOCK_TIME_SECONDS: 0.0000
...
这里能够看到阻塞的具体sql语句。
可以部署到后台定期执行,记得定期清理日志输出文件
#kundb长事务监控脚本
#kundb1 shard1 master
*/30 * * * * nohup /bin/sh /mnt/disk5/kundb1/shard1/kundbdata/check_long_trx_wait_kundb1.sh &
0 * * * * find /mnt/disk5/kundb1/shard1/kundbdata/long_track_kundb1 -type f -name 'long_wait_lock_info*log' -ctime +7 -exec rm -rf {} \;