现场环境边缘库上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
如有问题,欢迎大家评论指正

