Oracle-在线重定义dbms_redefinition.sync_interim_table增量同步引发TX行锁问题

news2024/11/20 6:30:56

前言:

近期处理了一起用户使用在线重定义dbms_redefinition增量同步操作引发TX行锁的问题,用户在使用dbms_redefinition.sync_interim_table进行数据增量同步时,在线重定义的原表SQL语句出现了TX行锁等待问题

后面经过分析,发现产生TX行锁问题的原因为在线重定义在完成增量同步之后,会对增量MLOG$_XXX日志进行删除,删除期间为锁定维护MLOG$的原表数据,同时由于原表进行的dml操作会记录到MLOG$_XXX增量日志,也需要维护MLOG$的原表数据,导致操作了MLOG$的同一行数据,出现TX行锁等待问题。

问题:

在Oracle11.2.0.4版本,执行dbms_redefinition.sync_interim_table进行数据增量同步时,产生TX行锁问题

BEGIN
 dbms_redefinition.sync_interim_table(
 uname => 'TEST',
 orig_table => 'TEST_OLD',
 int_table => 'TEST_NEW');
 END;
 /

原因:

产生TX行锁问题的原因为dbms_redefinition.sync_interim_table在线重定义在完成增量同步之后,会对增量MLOG$_TEST_OLD物化视图日志进行删除,删除期间为锁定维护MLOG$的原表数据,同时由于源表进行的dml操作会记录到MLOG$_TEST_OLD物化视图日志,也需要维护MLOG$的原表数据,导致多个会话操作了MLOG$的同一行数据,出现TX行锁等待问题

问题分析:

查询问题时间的TX锁堵塞情况,会话44被会话34所堵塞,堵塞的锁类型为TX行锁,级别为6,独占模式

会话的执行语句为begin p1;end; 存储过程里面的操作语句为insert into test.test_old values

set linesize 400
set pagesize 400
col sample_time for 40
col sql_text for a60
col event for a40
col program for a30 
col sql_text for a20
col CURRENT_OBJECT for a20
col object_type for a15
SELECT  
    TO_CHAR(D.SAMPLE_TIME, 'YYYYMMDD HH24:MI:SS') SAMPLE_TIME,
    D.SESSION_ID,
    D.program,
      D.current_row#,D.EVENT,
      CHR(BITAND(P1, -16777216) / 16777215) ||
      CHR(BITAND(P1, 16711680) / 65535) "Lock",
      BITAND(P1, 65535) "Mode",
      D.BLOCKING_SESSION,
      b.sql_text
 FROM DBA_HIST_ACTIVE_SESS_HISTORY D,dba_hist_sqltext b 
WHERE D.SAMPLE_TIME between to_date('2022-11-12 21:30:00','yyyy-mm-dd hh24:mi:ss') and to_date('2022-11-12 22:30:00','yyyy-mm-dd hh24:mi:ss')
  AND D.EVENT = 'enq: TX - row lock contention'  and d.sql_id=b.sql_id(+)
order by D.BLOCKING_SESSION;

查看会话34的执行语句为删除物化视图日志MLOG$_TEST_OLD:delete from "TEST"."MLOG$_TEST_OLD"

delete from "TEST"."MLOG$_TEST_OLD" 
where rowid in  ( select mas$.rowid      from "TEST"."MLOG$_TEST_OLD" mas$, sys.snap_xcmt$ map$      
where mas$.xid$$ map$.xid and map$.commit_scn <= :1 )

被堵塞会话与堵塞会话涉及的两个表TEST_OLD与MLOG$_TEST_OLD,MLOG$_TEST_OLD为原表TEST_OLD的物化视图日志,TEST_OLD发生DML操作,会往MLOG$_TEST_OLD里面插入增量信息,但insert MLOG$_TEST_OLD与delete MLOG$_TEST_OLD应该是操作不同的行数据,存在行锁冲突的可能很小,发生行锁冲突的表应该是其他表,但由于数据库记录的信息有限,我们无法进一步去获取锁信息

我们需要重现当时的行锁问题,并记录当时的锁信息,才能进一步的确认原因,跟用户再次确认当时产生行锁的情况,确定当时只是执行在线重定义的增量同步dbms_redefinition.sync_interim_table之后就出现的TX行锁情况

在测试环境,我们对问题进行了重现,并使用10704对锁信息进行跟踪

--为了更好的追踪锁信息,我们对数据库开启了全局的10704跟踪,这样可以更快的跟踪锁和队列的使用情况
alter system set events '10704 trace name context forever, level 12'; 
alter system set events '10704 trace name context off';

在会话A,我们执行了在线重定义的增量同步dbms_redefinition.sync_interim_table

BEGIN
dbms_redefinition.sync_interim_table(
uname => 'TEST', 
orig_table => 'TEST_OLD',
int_table => 'TEST_NEW');
END;
/

同时,在会话B,我们执行关于原表TEST_OLD的DML操作

exec p1;

很快,在会话A的dbms_redefinition.sync_interim_table执行完成之后,我们观察到了会话B出现了TX锁等待,问题得到复现

接下来,分析10704跟踪的会话B的锁信息,可以看到在申请完表锁TM-0000028a-00000000-mode 3之后,申请行锁TX-00030016-000006da-mode 6出现了3分多钟的等待,从08:51:03到08:54:22申请才返回

继续分析会话A的锁信息,可以看到会话A在08:50:39申请了表锁TM-0000028a-00000000-mode 3以及行锁TX-00030016-000006da-mode 6,之后就再也没有释放

会话A直到08:54:22才分别释放了行锁TX,30016,6da以及表锁TM,28a,0

到这里,我们可以确认行锁的堵塞信息为会话A长期持有表TM,28a,0的行锁TX,30016,6da,导致会话B出现了等待,而发生锁的对象object_id(16进制)为0000028a,我们可以查到对象为表SYS.MLOG$,MLOG$为数据库字典物化视图的信息维护表,记录每个物化视图日志的信息

SQL> set linesize 400
SQL> r
  1  select owner,object_name,object_type
  2  from dba_objects
  3* where object_id =to_number('28a','xxx')
​
OWNER                OBJECT_NAME                              OBJECT_TYPE
-------------------- ---------------------------------------- -------------------
SYS                  MLOG$                                    TABLE

接下来,我们还要分析会话A和会话B分别执行了哪些操作语句产生了TX行锁问题,这一步我们会开启10046来跟踪两个会话的SQL执行情况

--为了更好的追踪锁信息,我们对数据库开启了全局的10046跟踪,这样可以更好的跟踪sql的执行情况
alter system set events '10046 trace name context forever, level 12'; 
alter system set events '10046 trace name context off';

分析会话A的sql执行情况

在开始清理"TEST"."MLOG$_TEST_OLD"之前,会执行一个for update的查询锁定操作,锁定表MLOG$的master='TEST_OLD' and mowner='TEST'这行数据

select log, sysdate, youngest, youngest+1/86400,  oldest, oldest_pk, oldest_oid, oldest_new, oldest_seq,  oscn, oscn_pk, oscn_oid, oscn_new, oscn_seq, flag, purge_job  
from sys.mlog$  where master = :2 and mowner = :1 for update
PARSE #140104910940200:c=0,e=29,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,plh=1551139906,tim=1668303489973102
BINDS #140104910940200:
 Bind#0
  oacdty=01 mxl=32(08) mxlc=00 mal=00 scl=00 pre=00
  oacflg=18 fl2=0001 frm=01 csi=852 siz=32 off=0
  kxsbbbfp=7f6cb7729328  bln=32  avl=08  flg=05
  value="TEST_OLD"
 Bind#1
  oacdty=01 mxl=32(04) mxlc=00 mal=00 scl=00 pre=00
  oacflg=18 fl2=0001 frm=01 csi=852 siz=32 off=0
  kxsbbbfp=7f6cb7729360  bln=32  avl=04  flg=05
  value="TEST"

之后开始清理"TEST"."MLOG$_TEST_OLD"表数据

delete from "TEST"."MLOG$_TEST_OLD" where rowid in    ( select mas$.rowid      
from "TEST"."MLOG$_TEST_OLD" mas$, sys.snap_xcmt$ map$      
where mas$.xid$$ = map$.xid and            map$.commit_scn <= :1 )

清理完之后,再更新表MLOG$的master='TEST_OLD' and mowner='TEST'这行数据

update sys.mlog$ 
set oscn = :1, oscn_pk = :2, oscn_oid = :3,  oscn_new = :4, oscn_seq = :5,  last_purge_date = sysdate, last_purge_status = 0, rows_purged = :8,     purge_job = :9                               
where master = :6 and mowner = :7

分析会话B的sql执行情况

执行对表TEST.TEST_OLD的插入

INSERT INTO TEST.TEST_OLD VALUES(TEST_SEQ.NEXTVAL,:B1 +1,'aaaaaaaaa','bbbbbbbbbbbbbbbb','cccccccccccccc')

将TEST_OLD的增量数据插入物化视图日志"TEST"."MLOG$_TEST_OLD"

INSERT /*+ IDX(0) */ INTO "TEST"."MLOG$_TEST_OLD" (dmltype$$,old_new$$,change_vector$$,xid$$,"ID") VALUES (:d,:o,:c,:x,:1)

更新表MLOG$的master='TEST_OLD' and mowner='TEST'这行数据

update sys.mlog$ 
set flag=flag+131072 
where mowner=:1 and master=:2 and bitand(flag,131072)=0

结合锁信息以及执行的SQL绘制出当时行锁的堵塞情况

T1时刻,会话A执行了对于表MLOG$的for update操作,并一直持有TM,28a,0,TX,30016,6da锁

T2时刻,会话A开始执行删除MLOG$_TEST_OLD的操作delete MLOG$_TEST_OLD,会话B开始执行表TEST_OLD,MLOG$_TEST_OLD的插入操作

T3时刻,会话A继续执行删除MLOG$_TEST_OLD的操作,会话B在执行完表TEST_OLD,MLOG$_TEST_OLD的插入之后,需要更新MLOG$的信息,申请TM,28a,0,TX,30016,6da锁,由于会话A持有,会话B进入等待

T4时刻,会话A执行完成删除MLOG$_TEST_OLD的操作,更新MLOG$的信息,会话B继续等待TM,28a,0,TX,30016,6da锁

T5时刻,会话A释放TM,28a,0,TX,30016,6da锁,会话B获得TM,28a,0,TX,30016,6da锁

问题总结:

综上,执行在线重定义dbms_redefinition.sync_interim_table同步增量数据时,产生TX行锁问题的原因为dbms_redefinition.sync_interim_table在线重定义在完成增量同步之后,会对增量MLOG$_TEST_OLD物化视图日志进行删除,删除期间为锁定维护MLOG$的原表数据,同时由于源表进行的dml操作会记录到MLOG$_TEST_OLD物化视图日志,也需要维护MLOG$的原表数据,导致多个会话操作了MLOG$的同一行数据,出现TX行锁等待问题

问题建议:

1 使用dbms_redefinition.sync_interim_table发生TX锁问题,这个目前在Oracle的11.2.0.4,12.2.0.1版本上都有发现,在19c版本没有发现,因为19c版本使用dbms_redefinition.sync_interim_table并不会清理MLOG$_XXXXX数据,所以,使用在线重定义的方式,最好在19c的版本上

2 TX锁的时间主要取决于清理MLOG$_XXXX物化视图日志的时长,所以要控制每次增量的数据,减少TX锁的锁定时间

3 在原表DML操作较为空闲的时间段进行增量数据的同步,并监控TX锁的情况,一旦发现大面积的TX锁堵塞,可以kill了清理MLOG$_XXXX物化视图日志的操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短链接业务解决方案(附源码项目)

开源地址 https://github.com/lcy19930619/short-link 一个单节点短链接项目&#xff0c;有需要的拿去改改就行了&#xff0c;如果方便&#xff0c;可以帮忙点点star 什么是短链接 蓝色部分就是短链接 为什么要用短链接&#xff1f; 因为短信是按照字符去计算条数的&#x…

12月21日 OpenCV 实战基础学习笔记——背景建模、光流估计

文章目录前言一、背景建模1、帧差法2、混合高斯模型二、光流估计前言 本文为12月21日 OpenCV 实战基础学习笔记&#xff0c;分为两个章节&#xff1a; 背景建模&#xff1b;光流估计。 一、背景建模 1、帧差法 由于场景中的目标在运动&#xff0c;目标的影像在不同图像帧中…

Redis哨兵机制以及发布订阅

Redis哨兵机制1 哨兵Sentinel机制2 哨兵架构原理3 搭建哨兵架构4 通过springboot操作哨兵Redis发布订阅1 哨兵Sentinel机制 Sentinel&#xff08;哨兵&#xff09;是Redis 的高可用性解决方案&#xff1a;由一个或多个Sentinel 实例组成的Sentinel 系统可以监视任意多个主服务…

海格里斯HEGERLS深度解析|重型四向穿梭车的轨道换向组件及轨道系统

随着自动化仓储物流系统的广泛应用&#xff0c;物流设备也更趋于多样化&#xff0c;比如在货架轨道上可四向行走的穿梭车应运而生&#xff0c;重型四向穿梭车作为一种新型的物流存储设备&#xff0c;通常在轨道平面上有行走方向相互垂直的两个行走系统&#xff0c;通过两个行走…

gRPC学习Go版(一)

文章目录微服务入门gRPC是什么proto 服务定义gRPC 优势gRPC入门简单使用一元RPC服务流RPC客户流RPC双工流RPCgRPC底层原理RPC流长度前缀的消息分帧请求消息响应信息通信模式下的消息流微服务入门 现在的软件很少是一个孤立的单体应用运行的&#xff0c;相反更多是通过互联网连接…

玩以太坊链上项目的必备技能(错误处理以及异常-Solidity之旅十四)

错误处理 作为开发者的我们知道&#xff0c;我们所编写出来的程序难免会出现 bug &#xff0c;而要做的是捕获异常&#xff0c;给用户抛出一个友好地错误提示。 而在 Solidity 中&#xff0c;根据状态恢复异常来处理错误&#xff0c;该异常将撤销在当前调用中对状态所做的所有…

[思维模式-9]:《如何系统思考》-5- 认识篇 - 改变开环、组合逻辑的线性思考,实施闭环、时序逻辑的动态思考。

目录 第1章 因果关系 1.1 因果关系 1.2 因果关系的特点 1.3 因果关系的类型 第2章 线性思考遇到的问题&#xff1a;开环思维、组合逻辑 2.1 开环系统 2.2 组合逻辑 2.3 线性关系 2.4 什么是线性思维&#xff1a;线性因果关系 2.5 线性思维的数学本质 2.6 线性思维的…

自动化药房出药升降机选型设计

一、 运动规划、运动参数的确定 1、 运动参数计算 运动参数主要通过速度规划确定&#xff0c;速度规划采用直线速度特性&#xff0c;如图所示。 运动方程为&#xff1a; 2、 X方向的速度和加速度的估算 已知参数&#xff1a; X方向行程:1…

stream_component_open函数分析

stream_component_open() 函数主要作用是打开 音频流或者视频流 对应的解码器&#xff0c;开启解码线程去解码。 流程图如下&#xff1a; stream_component_open() 的函数定义如下&#xff1a; /* open a given stream. Return 0 if OK */ static int stream_component_open(…

K8S知识点及dashboard操作

1.什么是K8S&#xff1f; K8S是一组服务器集群&#xff0c;可以在集群的各个节点上运行特定的容器。 K8S所管理的是&#xff1a;集群节点上的容器 特性&#xff1a; 自我修复&#xff0c;弹性伸缩&#xff08;根据实时服务器的并打情况&#xff0c;增加或收缩容器数量&…

网络编程套接字Socket(通过两个用例,逐行注释,详细理解)干活满满建议收藏

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1.分类1.流套接字2.数据报套接字3.原始套接字2.Socket通信模型 3.UDP套接字编程1. DatagramSocket API1.构造方法1.DatagramSocket()2.DatagramSocket(int port)…

C语言之复合类型上卷(十八)(阴阳两极)

上一篇: C语言之内存管理&#xff08;十七&#xff09;&#xff08;转世灵童现世&#xff09; 逐梦编程&#xff0c;让中华屹立世界之巅。 简单的事情重复做,重复的事情用心做,用心的事情坚持做&#xff1b; 文章目录前言一、什么是结构体&#xff1f;二、结构体的定义及初始化…

USB TO SPI(上海同旺电子)调试器调试MCP3201 A/D 转换器

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、MCP3201 12 位A/D 转换器; 特性 • 12 位分辨率 • 1 LSB DNL &#xff08;最大值&#xff09; • 1 LSB INL &#xff08;最大值&#xff09;&#xff08;MCP3201-B&#xff09; • 2 LSB INL &#xff…

pdf文件太大怎么变小,如何压缩pdf大小

pdf文件太大怎么变小&#xff1f;如果你是Windows电脑&#xff0c;可以使用PDF编辑器来减小PDF文件的大小&#xff0c;比如这款出色的PDF压缩工具-易我PDF编辑器&#xff0c;它的“压缩”功能提供了两种减小文件大小的方法&#xff0c;这使得它既适合那些只想获得更小的PDF的人…

【vscode】c++程序的自动编译及调试(环境centos)

目录1.新增配置文件&#xff08;1&#xff09;c_cpp_properties.json&#xff08;2&#xff09;files.associations&#xff08;3&#xff09;tasks.json(4)CMakeLists.txt2.断点调试1.新增配置文件 VS Code的配置文件一般是指特定目录下的JSON文件。所谓JSON是一种文本格式&a…

LCF-ATEPC(2020 Elsevier)面向中文的方面级提取和分类

论文题目&#xff08;Title&#xff09;&#xff1a;A Multi-task Learning Model for Chinese-oriented Aspect Polarity Classification and Aspect Term Extraction &#xff08;面向中文的方面极性分类和方面项提取的多任务学习模型) 研究问题&#xff08;Question&#…

适用于 Windows 10/11 电脑 的 5 大好用的离线录屏软件

屏幕录制应用程序可以数字记录出现在任何设备或 PC 屏幕上的内容&#xff0c;并同时以高清流式传输音频和视频。 因此&#xff0c;他们帮助创建营销视频、跟踪客户行为、设计产品演示、监控员工活动、录制教育内容、网络研讨会内容和业务会议内容。 现在您已经意识到屏幕录…

VS系列多通道振弦传感器无线采发仪的数据发送说明

每次设备启动后会将采集到的传感器数据进行内部存储&#xff0c;并在设置好的时间间隔将数据发送出去&#xff0c;通过修改“数据发送方式”参数&#xff0c;监测数据可由数据接口输出也可经由无线网络发送。在发送监测数据时&#xff0c;可通过修改“数据包协议”参数来设置所…

函数和数组习题

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C语言基础习题】 文章目录知识点习题2.实现一个整型数组的冒泡排序&#xff08;编程体&#xff09;。3.编程题&#xff1a;创建一个整型…

springcloud,springboot各个版本之间的关系

1 版本关系 在实际的开发中如果要自己搭建矿建&#xff0c;发现springcloud&#xff0c;springboot的版本可能是首先需要确定的&#xff0c;那么他们之间的关系是什么呢&#xff1f;看官网&#xff0c;地址 Spring Cloud 左侧是cloud的版本&#xff0c;右侧是对应的文档&…