argodb锁的查看与释放

  使用配置
内容纲要

概要描述


argodb锁的问题比较常见,最常遇到的报错就是下图中的报错,need wait lock holders:xxx, id:yyy, process lock conflict failed, check and do acquire write locks failed

详细介绍


一. 如何判断这个事务是什么占用的?

报错顾名思义,当前事务id为 yyy,需要等待事务id为 xxx 的释放掉 才能继续执行。

此时我们可以根据 事务id为xxx 在Query页面进行查询,找到占用锁的sql语句。

需要注意的是,如果集群安装了多个quark/compactservice,那么每个都要去查询,一般都能够找到对应占用的sql语句。

二. dbaservice页面找不到怎么办?

如果还是找不到,可以参考如下两种方式获取线索,以 UPDATE dsy.SYS_SMS_BATCH SET XXDM='abcd' WHERE ZJSJWYXBS = '1' 这个sql为例:

a) 登录到tddms master leader节点所在后台服务器,通过类似如下的命令检索 master_main.INFO 日志

[root@kv2/var/log/tddms1]> grep -E 'AcquireLocksProposal.*#140862' master_main.kv2.root.log.INFO.20260826-100830.1
I20260910 09:18:41.375291    38 metadb.cc:222] fire callback for proposal:Name:AcquireLocksProposal:kMutate#140862#default#dsy.sys_sms_batch_d93381a3-4533-4e75-8be9-b532af95a679, IsAccepted:true, HasRpcContext:true
I20260910 09:18:41.522189    38 metadb.cc:222] fire callback for proposal:Name:AcquireLocksProposal:kRead#140862#default#dsy.sys_sms_batch_d93381a3-4533-4e75-8be9-b532af95a679, IsAccepted:true, HasRpcContext:true

可以看到这个sql语句,在 20260910 09:18:41 左右,先后获取了 Mutate 和 Read 锁。结合 Argodb 常见sql对应的锁类型 能够大致判断出是执行了什么sql语句触发的。

b) 登录到dbaservice服务节点所在后台服务器 $dbaservice.persistence.datadir 目录,通过类似如下的命令检索sql语句

[root@kv4/mnt/disk3/dbaservice/dbaservice2/tmp/preserve/20260910]> ls -l
总用量 12
drwxr-xr-x 9 root root 4096 9月  10 00:01 argodbbar1@172.18.131.171:18898
drwxr-xr-x 8 root root 4096 9月  10 09:19 compactservice1@172.18.131.171:4050
drwxr-xr-x 9 root root 4096 9月  10 00:01 quark1@172.18.131.171:8888
[root@kv4/mnt/disk3/dbaservice/dbaservice2/tmp/preserve/20260910]> grep 140862 -R *

可以看到对应的完整sql:

file

三.如何通过API获取锁信息并杀锁

# host为 TDDMS Webserver 节点的ip 
# 获取当前集群中事务信息,默认获取活跃事务:
curl -u shiva:shiva -XGET ':/bulk_transaction?[pretty]'
# 强制终止一个活跃事务:
curl -u shiva:shiva -XDELETE ":/bulk_transaction/"
# 另一种方案,dbaservice 会话页面关闭占用锁的session,简单粗暴

如果报错 NEGOTIATED_ROLE_NOT_EXIST,需要加上 -u shiva:shiva

举例说明

1、创建测试表
DROP TABLE IF EXISTS EMP_HOLO;
CREATE TABLE EMP_HOLO(
       EMPNO int,
       ENAME string,
       JOB string,
       MGR INT,
       HIREDATE DATE,
       SAL INT,
       COMM INT,
       DEPTNO INT
)CLUSTERED BY (empno) INTO 3 BUCKETS
STORED AS HOLODESK;
INSERT INTO EMP_HOLO VALUES (7369,'SMITH','CLERK',7902,tdh_todate('17-12-1980','dd-mm-yyyy'),800,NULL,20);
2、执行锁语句,delete操作
CREATE SEQUENCE test_seq
      INCREMENT BY 1
          START WITH 1
          NOMAXVALUE
          NOMINVALUE
          NOCYCLE
          CACHE 20;

set transaction.type=holodesk;

BEGIN
       begin transaction;
              --前后分别通过sequence值来标记执行顺序
              SELECT test_seq.NEXTVAL FROM system.dual;
              --Action
                    DELETE FROM EMP_HOLO WHERE ENAME ='SMITH';
              --通过睡眠函数控制执行顺序
              dbms_lock.sleep(600);
              --前后分别通过sequence值来标记执行顺序
              SELECT test_seq.NEXTVAL FROM system.dual;
       commit;
END

执行上述plsql块之后,一直处于运行状态。

3、检查活跃事务信息:

可以在DBAService的Query页面,获取到 阻塞事务id ,再结合delete 请求结束。

通过 API 也可以获取到当前所有活跃的事务信息:

[root@argodb1~]$ curl -u shiva:shiva -XGET '172.22.23.1:4567/bulk_transaction?pretty'
{
  "log_id" : 1676003325746,
  "code" : 0,
  "msg" : "ok",
  "transaction_ids" : [ 1493 ],
  "status" : [ "kActiveBulkTransaction" ],
  "bulk_transaction_descriptions" : [ {
    "id" : 1493,
    "status" : "kActiveBulkTransaction",
    "read_write_tables" : [ {
      "table_id" : 24,
      "bulk_loads" : [ {
        "bulk_load_id" : 1478,
        "section_names" : [ "default.emp_holo_3b71d992-e5b5-4bc2-940e-63233830e8cf" ]
      } ],
      "bulk_reads" : [ {
        "section_name" : "default.emp_holo_3b71d992-e5b5-4bc2-940e-63233830e8cf",
        "read_num" : 2
      } ],
      "schema_version" : 3
    } ],
    "policy_version" : 0,
    "retain_si_read" : false,
    "gcable" : false,
    "creator" : {
      "address" : "172.22.23.1:37463",
      "log_id" : 1676007619045
    }
  } ]
}

这个因为是手动开启事务,所以在begin transaction的时候事务ID就已经确定了.

4、手动终止事务

a. 从前面的结果可以看到 "status" : [ "kActiveBulkTransaction" ]ACTIVE 状态的话,可以通过下面的方式终止:

强行结束事务kActive状态事务
# IP和PORT按照tddms webui
# curl -u shiva:shiva -XDELETE "IP:PORT/bulk_transaction/"
curl -u shiva:shiva -XDELETE "172.22.23.1:4567/bulk_transaction/1493"
{"log_id": 1676003325954,"code": 0,"msg": "bulk transaction:1494 is aborted"}

b. 如果事务状态是 "status" : [ "kWaitingBulkTransaction" ] WAITING 状态的话,可以使用下面命令强行终止

强行结束事务kwaitting状态事务
# IP和PORT按照tddms webui
# curl -u shiva:shiva -XPOST "IP:PORT/bulk_transaction/terminate/"
curl -u shiva:shiva -XPOST "172.22.23.1:4567/bulk_transaction/terminate/123788"

c. 如果事务状态是 "status" : [ "kAbortedBulkTransaction" ] ABORTED 状态的话,代表已终止的事务,无须处理

这篇文章对您有帮助吗?

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

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

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

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