kundb锁监控脚本

  其他常见问题
内容纲要

概要描述


本文主要介绍,如何部署监控脚本,捕捉事务锁信息。

详细说明


测试环境:kundb 3.2.2-final

1.部署监控脚本

上传脚本文件 check_long_trx_wait 并解压,修改连接方式

file

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 {} \;

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。