暂无图片
请问,ORACLE ADG 的 redo apply 如何理解?
我来答
分享
梦灵
2021-03-22
请问,ORACLE ADG 的 redo apply 如何理解?

ORACLE ADG 的 redo apply 如何理解?

我来答
添加附件
收藏
分享
问题补充
8条回答
默认
最新
JiekeXu
暂无图片

理解一下 DG 的原理就差不多了。

f.png

暂无图片 评论
暂无图片 有用 0
梦灵

谢谢,不过不行,得希望知道具体的实现逻辑。

暂无图片 评论
暂无图片 有用 0
你好我是李白

下面这个不知道符合不符合你想了解的:

(1)主库事务
HR@honor1 > insert into test_roll values(2,‘test1’);
HR@honor1 > commit;

(2)主库redo record

下面redo record格式会受Oracle版本,以及是否使用IMU有所不同。

下面可通过alter system dump logfile ‘redo log’;获取

REDO RECORD - Thread:1 RBA: 0x000716.0000003e.0078 LEN: 0x01c4 VLD: 0x01
SCN: 0x0000.01aac748 SUBSCN:  2 03/23/2021 09:22:35
CHANGE #1 TYP:0 CLS:33 AFN:3 DBA:0x00c00100 OBJ:4294967295 SCN:0x0000.01aac58f SEQ:1 OP:5.2 ENC:0 RBL:0
ktudh redo: slt: 0x000f sqn: 0x00003d42 flg: 0x0012 siz: 136 fbi: 0
            uba: 0x00c0034b.0ce5.13    pxid:  0x0000.000.00000000
CHANGE #2 TYP:0 CLS:34 AFN:3 DBA:0x00c0034b OBJ:4294967295 SCN:0x0000.01aac58e SEQ:5 OP:5.1 ENC:0 RBL:0
ktudb redo: siz: 136 spc: 4086 flg: 0x0012 seq: 0x0ce5 rec: 0x13
            xid:  0x0009.00f.00003d42  
ktubl redo: slt: 15 rci: 0 opc: 11.1 [objn: 101468 objd: 101468 tsn: 4]
Undo type:  Regular undo        Begin trans    Last buffer split:  No 
Temp Object:  No 
Tablespace Undo:  No 
             0x00000000  prev ctl uba: 0x00c0034b.0ce5.0e 
prev ctl max cmt scn:  0x0000.01aabcb6  prev tx cmt scn:  0x0000.01aabd60 
txn start scn:  0xffff.ffffffff  logon user: 84  prev brb: 12583754  prev bcl: 0 BuExt idx: 0 flg2: 0
KDO undo record:
KTB Redo 
op: 0x03  ver: 0x01  
compat bit: 4 (post-11) padding: 1
op: Z
KDO Op code: DRP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x0100141e  hdba: 0x0100141a
itli: 2  ispac: 0  maxfr: 4858
tabn: 0 slot: 1(0x1)
CHANGE #3 TYP:2 CLS:1 AFN:4 DBA:0x0100141e OBJ:101468 SCN:0x0000.01aac744 SEQ:1 OP:11.2 ENC:0 RBL:0
KTB Redo 
op: 0x01  ver: 0x01  
compat bit: 4 (post-11) padding: 1
op: F  xid:  0x0009.00f.00003d42    uba: 0x00c0034b.0ce5.13
KDO Op code: IRP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x0100141e  hdba: 0x0100141a
itli: 2  ispac: 0  maxfr: 4858
tabn: 0 slot: 1(0x1) size/delt: 12
fb: --H-FL-- lb: 0x2  cc: 2
null: --
col  0: [ 2]  c1 04
col  1: [ 5]  74 65 73 74 31
CHANGE #4 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:0 OP:5.20 ENC:0
session number   = 24
serial  number   = 113
transaction name = 
version 186647552
audit sessionid 14780946
Client Id = 
login   username = HR

REDO RECORD - Thread:1 RBA: 0x000716.0000003a.0010 LEN: 0x00d0 VLD: 0x05
SCN: 0x0000.01aac744 SUBSCN:  1 03/23/2021 09:22:31
(LWN RBA: 0x000716.0000003a.0010 LEN: 0001 NST: 0001 SCN: 0x0000.01aac743)
CHANGE #1 TYP:0 CLS:27 AFN:3 DBA:0x00c000d0 OBJ:4294967295 SCN:0x0000.01aac742 SEQ:1 OP:5.4 ENC:0 RBL:0
ktucm redo: slt: 0x0018 sqn: 0x00004046 srt: 0 sta: 9 flg: 0x2 ktucf redo: uba: 0x00c01ac1.0c91.07 ext: 3 spc: 6536 fbi: 0 
CHANGE #2 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:0 OP:24.4 ENC:0

(3)redo内容解析对应事务操作步骤

第一个redo record:
CHANGE # 1   OP:5.2    --Update rollback segment header - KTURDH 事务开始
CHANGE # 2   OP:5.1    --Undo block or undo segment header - KTURDB。
CHANGE # 3   OP:11.2   --Insert Row Piece
CHANGE # 4   OP:5.20   --Transaction continue audit log record

第二个redo record:
CHANGE #1   OP:5.4     -- commit transaction

上图OP代码可以参考:

(4) 备库应用大致过程
–不同模式,不同设置会有所不同

  1. 主库写redo record的同时,如果备库有standby log,则RFS会写standby redo log。
  2. 如果备库开启了实时应用,则MRP进程会同时读redo log进行一条一条redo record应用。
  3. 只需要按照redo record更新相应数据块即可(可能Oracle内部会对这个过程有自己优化吧)。

(5)传输跟应用过程上图JiekeXu大佬已经给出图,可参照图

再详细的内部原理就不知道啦。

暂无图片 评论
暂无图片 有用 0
梦灵

谢谢。其实里面一直理解不到的就是mrp通过redo record怎么去直接修改块,因为sql语句执行容易理解,但是用redo record去直接修改块就理解不到

谢谢

暂无图片 评论
暂无图片 有用 0
你好我是李白

里面有dba定位数据块,有改变向量改变数据,物理备库嘛,dba源端是这个块,目标端还是,按照信息改就可以啦,当然,oracle肯定对这个过程会有自己优化,大致应该是这样。

暂无图片 评论
暂无图片 有用 0
梦灵

谢谢,具体是如何去修改块的呢

暂无图片 评论
暂无图片 有用 0
你好我是李白

定位到块,定位到row piece,根据redo record里记录的更新后的值,往里写呗,插入就写进去,删除就标记,update就用新值替代旧值,再深入就回答不了了,希望有大佬来回答你。

你要问我计算机如何翻译每条指令,我估计得问源码跟编译器了,哈哈

暂无图片 评论
暂无图片 有用 0
梦灵

谢谢,感谢感谢,又多明白了一层。虽然明白的不彻底

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏