oracle 11g归档日志研究_3

记录头(record head)格式:

typedef struct rh0 {
    uint32_t recordlen;
    uint8_t VLD;        //直接决定整个record head大小
    uint8_t unknown0;
    uint16_t rhscnwrapper;
    uint32_t rhscnbase;
    uint16_t subscn;
}Redo_rh0;

typedef struct rh1 {
    uint8_t unknown1[10];
}Redo_rh24;              //VLD = 0x01, 总大小24byte

typedef struct rh5 {
    uint8_t unknown0[50];
    uint32_t rhscntime;
}Redo_rh68;              //VLD = 0x05, 总大小68byte

记录头是变长的,它的长度由VLD决定,而oracle并未明确说明它们的对应关系,幸好大多数记录头的VLD都是1。

 

记录头之后紧接着就是一组change项,一条记录可能对应于我们的一个操作(比如插入),一个操作会被划分为一组change(oracle内部的一组操作),每个change对应一个操作码(opcode)。每个change又分为change头,change向量表,和change数据。change头的格式:

typedef struct oc {
    uint8_t layer;
    uint8_t code;
}Redo_oc;

typedef struct ch {     //24
    Redo_oc opcode;
    uint16_t CLS;       //block class
    uint16_t AFN;       //数据所在文件号
    uint16_t OBJ0;
    uint32_t DBA;       //Data block address, 前10bit文件号, 后22bit块号
    Redo_scn SCN;
    uint8_t SEQ;        //change sequence
    uint8_t TYP;        //数据类型
    uint16_t OBJ1;
}Redo_ch;

change头的长度是固定的(终于有点固定的东西了),第一个元素即为本change的操作码(opcode),opcode通常由5.2、5.1开始,5.4结束,中间出现的才是我们所做的真实操作(比如11.xx、19.1等)。

change头中的OBJ0和OBJ1组合起来得到obj:

#define getobj(obj0, obj1) (((uint32_t)(obj1))|(((uint32_t)(obj0))<<16))

obj为本次操作的表id,可以根据obj从数据字典查到表名、用户、字段等信息用来构建SQL语句。

 

change头之后是一个change向量表,change向量表总长度按4字节对齐,然后其内部每2字节一段,第1个2字节表示向量表总长度(包括自己的2字节)(未进行4字节对齐之前的总长度)。总长度之后剩余的长度(未对齐的总长度减2),划分为每2字节一段,每段表示一个元素的长度,这些元素会按顺序写在向量表之后,向量表中的长度为元素的真实长度,向量表之后的元素将按照4字节对齐方式写入,其超过真实长度的部分应被忽略。

向量表是一个变长的数组,每个元素都是一个unsigned short型数据,故应每次读取2字节进行解析,同时用指针从向量表之后开始,按照向量表长度获取对应元素。获取到的change元素,即为本次change操作的对象,例如本次change为insert,则change元素就是insert的目标字段及内容。

获取到change元素之后,就可以根据数据字典,将当前取得的所有信息综合起来,构建SQL语句。

 

下面详细研究change内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值