KFS支持Gbase8s增量解析数据封装逻辑
关键字:
Kingbase FlySync、Gbase8s、增量解析、人大金仓
Gbase8s增量数据封装模型
与其他数据库增量数据同步一样,Gbase8s数据库中insert、delete和update等DML操作中对表中数据的变更记录需要进行封装,封装成DBMSEvent后才能在流水线程序中做数据流转。DBMSEvent主要由eventId、DBMSData组成的链表、时间戳以及标识符组成,其中eventId用于表示当前DBMSEvent封装的事务中最早的RSN和提交RSN,链表中封装主要数据,标识符用来标识大事务分片。在DBMSData链表中,主要封装DBMSdata的子类RowChangeData,RowChangeData中有用来表示DML类型的标识和存储数据的链表,链表中存放的是OneRowChange,顾名思义OneRowChange表示的是对一行数据的更改记录,即insert、delete或者update操作中对数据库表中一行数据的更改。值得注意的是,对不同的操作类型,OneRowChange记录的内容有所不同,尤其对于主键列和数据列的描述这两个内容,在insert语句中,默认插入的数据不需要主键,因此只需要记录所有列的描述和列值即可,无需关注主键列和主键列的描述,对于update操作来说,因为需要有主键或者where后面的条件做更新数据的匹配,因此必须要有主键列和主键列描述信息,对于无主键表来来说,OneRowChange中默认将全列记录为主键列和主键列描述,对于有主键表来说,将主键或者where后面的条件作为主键列值和主键列描述;对于delete来说,同样需要主键或者where后面的条件标识数据,因此也需要记录主键列和主键列描述信息。
Gbase8s增量数据Record结构
想要正确解析Gbase8s数据库增量数据,需要明确增量获取的Record结构。以CDC_REC_INSERT为例:
CDC_REC_INSERT 记录由以下字段组成:
・公共标题。
・记录特定标题。
・字段,列出行中每个可变长度列的大小(如果有)。
・每个固定长度列的v 列数据(如果有)。
・每个可变长度列的v 列数据(如果有)。
公共标头的标头大小字段中的值表示公共标头、记录特定标头和列出可变长度列大小的字段的组合所占用的字节数。公共标头中有效负载大小字段中的值表示固定长度列和可变长度列的列数据字节数。
特定于记录的标题:
特定于CDC_REC_INSERT 记录的报头位于公共报头之后。
表1 CDC_REC_INSERT 记录头
可变长度列大小字段:
如果要插入的行中有可变长度的列,则会显示每个列的4 字节字段,其中包含列大小。列大小字段的顺序与CDC_REC_TABSCHEMA 记录中列的顺序相同。
固定长度列数据:
来自固定长度列的数据(如果有的话)按照相应列在CDC_REC_TABSCHEMA记录中列出的顺序显示。
可变长度列数据:
来自可变长度列的数据(如果有)按照相应列在CDC_REC_TABSCHEMA 记录中列出的顺序显示。
Gbase8s增量数据封装方法
parseRowEvent()方法内做了对Gbase8s增量数据的封装,其中最主要的实现是连个判断和四个循环,其中两个判断是根据isKeySpec来判断封装在OneRowChange中的数普通列值和普通列信息还是全列值和全列信息。判断好后将specs
和colValues 封装在对应的oneRowChange.getKeySpec()或oneRowChange.getColumnSpec()以及oneRowChange.getKeyValues()和oneRowChange.getColumnValues()中。随后进行四个循环,前两个循环分别是对表元信息的固定长度列和可变长度列的列描述进行封装,后两个循环是按照顺序在byte数组中获取固定长度列和可变长度列的列值进行解析并封装。




