暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

内存解锁方案

IT那活儿 2024-08-15
123

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!   




问题场景



1.1 场景描述

业务进程有持续锁,需要解锁。
1.2 检查方法
通过dmdb_status -l db31查询acctxxx.md_xxx_procws_xxx_his_cc01表被锁,正常锁30min会自动释放,经排查锁相关的业务进程不存在。

步骤1:

直接从内存库端kill该会话。
登录内存库:
dmsql system/xxxx@dmdb
kill session 16000 @db31;

查看释放sessions的形式是否成功:
select * from dba_locks @db31

步骤2:

如果kill session异常,直接强制解锁。
登录内存库:
dmsql system/xxxx@dmdb
sys unlock table acctxxx.md_xxx_procws_xxx_his_cc01;

如果强制解锁,建议重建索引,步骤如下:
登录内存库:
1)对索引进行检擦看索引记录数和表记录是否一致
imsql acctxxx/xxxx@xxx.xxx.9.39:3910
sys check table acctxxx.MD_xxx_procws_xxx_HIS_CC01;
select count(*) from acctxxx.MD_xxx_procws_xxx_HIS_CC01;

结果为索引记录数比表记录数多一条(p2=1多一条锁记录)
2)如果不一致,创建索引,一致就不需要创建了
CREATE or replace INDEX MD_xxx_procws_xxx_HIS_CC01_1 ON MD_xxx_procws_xxx_HIS_CC01(BATCHSN,WSSEQ) HASH 1000000;

重建完索引,记录数还是不一致。




解决方案



方案一:

除索引重建 (报错):
imsql system/xxxx@10.xxx.x.39:3910

drop INDEX MD_xxx_procws_xxx_HIS_CC01_1 on acctxxx.MD_xxx_procws_xxx_HIS_CC01;
MDB-03035: cannot delete all indexes when there is a primary key

方案二实际方案

重建表 (需要imsql单点登录获取表结构):
imsql system/xxxx@10.xxx.x.39:3910

iMSQL> rename table acctxxx.MD_xxx_procws_xxx_HIS_CC01 to acctxxx.MD_xxx_procws_xxx_HIS_CC01bak;
Table renamed
iMSQL> CREATE TABLE acctxxx.MD_xxx_procws_xxx_HIS_CC01(
       BATCHSN VARCHAR(64) NOT NULL,
       WSSEQ VARCHAR(25) NOT NULL,
       RLB_DISP VARCHAR(18),
       STATUS VARCHAR(2) NOT NULL,
       ID_NO NUMERIC(14) NOT NULL,
       PHONE_NO VARCHAR(20),
       CONTRACT_NO NUMERIC(14),
       DAY_BILLCYCL VARCHAR(8) NOT NULL,
       CONTENT VARCHAR(230),
       GEN_TIME VARCHAR(17) NOT NULL,
       DEAL_TIME VARCHAR(17) NOT NULL,
       DEAL_CODE VARCHAR(5),
       PRIMARY KEY(BATCHSN,WSSEQ,ID_NO)
       );
Table MD_xxx_procws_xxx_HIS_CC01 created
iMSQL> CREATE INDEX MD_xxx_procws_xxx_HIS_CC01_1 ON acctxxx.MD_xxx_procws_xxx_HIS_CC01(BATCHSN,WSSEQ) HASH 1000000;
Index md_xxx_procws_xxx_his_cc01_1 created

insert into acctxxx.MD_xxx_procws_xxx_HIS_CC01 select * from acctxxx.MD_xxx_procws_xxx_HIS_CC01bak;
commit;

表重建后需要授权:
imsql acctxxx/xxxx@10.xxx.x.39:3910
grant all on all to acctopr;
grant select on all to acctqry;
grant select on all to bdsopr;
commit;

通知业务侧起进程,检查主备同步是否正常:
dmsql dmsql system/xxxx@dmdb
select count(*) from acctxxx.MD_xxx_procws_xxx_HIS_CC01 @db31;
select count(*) from acctxxx.MD_xxx_procws_xxx_HIS_CC01 @db31_bak;
select count(*) from acctxxx.MD_xxx_procws_xxx_HIS_CC01 @db31_bak2;

方案三:

重建索引修改hash值 (待验证)
imsql acctxxx/xxxx@10.xxx.x.39:3910

CREATE or replace INDEX MD_xxx_procws_xxx_HIS_CC01_1 ON MD_xxx_procws_xxx_HIS_CC01(BATCHSN,WSSEQ) HASH 1000001;
CREATE or replace INDEX MD_xxx_procws_xxx_HIS_CC01_1 ON MD_xxx_procws_xxx_HIS_CC01(BATCHSN,WSSEQ) HASH 1000000;


END


本文作者:付青启(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论