一行式检查OceanBase 4.x锁信息

现场环境边缘库上ob421版本越来越多了,昨天业务在某个时间点update语句异常卡顿了下,登录数据库检查锁信息已经被释放了,这样需要通过日志来过滤关键信息,网上一大堆,主要是给出过滤conflict关键字信息,然后匹配出来trans_id和lock_trans_id信息,然后去数据库里面再检索gv$Ob_sql_audit视图信息,如果gv$ob_sql_audit记录的信息已经被刷掉了,是不是就费劲点,还需要一点点的看日志,想着自己对perl语言相对熟悉,就通过perl来写了一个一行式脚本

比较乌龙,昨天其实已经写了一版perl脚本,但是实际运行起来还是有问题,今天修复了下,可能还有未知问题,如果遇到其他不准确问题,大家可以留言评论

perl脚本

grep “-6005” /home/admin/oceanbase/log/observer.log.2026011615*|perl -nle ‘if(/([^]]+?]).([YB.?]).(trans_id={txid:\d+?}).(ls_id=\d+).(lock_trans_id:{txid:\d+?}).(first_dml.).update_since_compact.(max_trans_id=\d+).max_elr_trans_version/){$a=$1;$b=$2;$c=$3;$d=$4;$e=$5;$f=$6;$g=$7};if(/ob_data_access_service.cpp/&& /6005/ && /\Q$b\E/){if(/ob_data_access_service.?(tenant_id:\d+).?(session_id:\d+).?(tablet_id:{id:\d+}).?(ls_id:{id:\d+}).?data_table:{(table_id:\d+),\s+schema_version:\d+,\s+table_type:3/){$h=$1;$j=$2;$k=$4;$l=$3;$q=$5}};if(/ob_query_retry_ctrl/ && /\Q$b\E/){if(/sql:"(.)?"/){print “$a $b $c $d $e $1 $h $j $k $l $q”}}’

案例演示

回话一插入一条数据

insert into tlock values(101,‘test101’,‘test101’);

回话二插入一条数据

–这个时候回话2 hang死

insert into tlock values(101,‘test101’,‘test101’);

通过日志过滤信息

打印如下关键信息:

  • 时间列
  • trace_id
  • 被阻塞事务id:trans_id
  • 阻塞事务id:lock_trans_id
  • 阻塞事务SQL语句
  • tenant_id
  • 被阻塞session_id
  • 问题表tablet_id
  • 问题表table_id

如有问题,欢迎大家评论指正

8 个赞


参考此图

3 个赞

一行命令锁定对应的锁冲突语句,简单粗暴,给大佬点赞

2 个赞

厉害!学习了

3 个赞

学习下

3 个赞

egrep “ob_data_access_service.cpp” observer.log|awk -F " " ‘{delete sn;rst="";for(i=1;i<=NF;i++){if(!sn[$i]++){if(i~/^(1|2|7)$/||$i~/^data_table/||$i ~/^tx_id:{txid:/||$i ~/^cflict_txs/||$i~/^addr/||$i~/^scheduler_addr/){rst=rst $i " “;}}} gsub(/,|:[{tx_id|data_table:{|}]/,”",rst);print rst;}’

我也写了一个仅供参考

5 个赞

这个得学习提高一下,特别是perl脚本

3 个赞

888

3 个赞

学习下

2 个赞

学习下了

2 个赞

厉害:+1:t2:

1 个赞