关键字:
KingbaseFlySync、KFS、同步程序、replicator、标记、筛选
1.功能描述
KFS在目标端为指定的表添加标记列,为指定表所产生的DML业务进行标记添加功能,主要添加标记列与时间列,以便后续ETL对目标端的数据进行筛选。
2.使用场景介绍
在具体业务中,需要对同步数据进行标记跟踪,方便后续的三方应用对同步数据进行筛选使用。.
3.配置使用方式介绍
1、在目标端flysync.ini文件中添加以下参数:
svc-remote-filters=datamark
#忽略增加标记的表(格式:模式.表名或模式.*,多个值用“,”分割)
property=replicator.filter.datamark.markignore=
#指定增加标记的表(格式:模式.表名;模式.* ,多个值用“,”分割)
property=replicator.filter.datamark.markdo=
#指定需要增加标记的DML类型【默认值为:insert,update,delete】
property=replicator.filter.datamark.dmltype=insert,update,delete
#指定增加标记的列(modtype为DML类型标记列,modtime为时间标记列)【默认值为: modtype,modtime】
property=replicator.filter.datamark.markcolumn=modtype,modtime
#指定delete操作更换标记的情况DU|DI【默认值为:DU】
property=replicator.filter.datamark.deltype=DU
#指定DML类型标记的列名【默认值为:mod_type】(与repdatamark工具添加的列名保持一致,列名长度不能超过数据库允许的最大长度,不支持中文和特殊字符)
property=replicator.filter.datamark.modtypename=mod_type
#指定DML类型标记的列值【默认值为:I,U,D】(可自定义,最长支持50个字符,不支持中文和特殊字符。)
property=replicator.filter.datamark.modtypeval=I,U,D
指定时间标记列的列名【默认值为:mod_time】(与repdatamark工具添加的列名保持一致,列名长度不能超过数据库允许的最大长度,不支持中文和特殊字符)
property=replicator.filter.datamark.modtimename=mod_time
- 几个特殊参数的使用备注:
replicator.filter.datamark.deltype=
该参数主要用于处理delete类型的语句的标记情况,提供DU和DI两个参数值,其中:
DU:主要用于目标端存在数据的情况下,对应的delete操作,实际上不会将数据删除,而是会将目标端对应数据保留,然后DML的标记改为D(默认情况下)。
DI:主要用于目标端没有数据的情况(一张空表),用以记录delete的操作信息,标记默认为D
注意:上述两个参数值互斥使用,使用上需要注意如下场景:
对于delete来说,不管是DI场景还是DU场景,如果出现源端删除数据后再次插入同样的数据,在有主键的情况下,同步到目标端都会造成主键冲突的问题。
对于DI的情况而言,由于KFS的同步现有机制,其delete的语句中仅含有key值信息,如果要存在多列表,对其进行删除时,其余列的信息在delete的kufl中无法获取。(该问题建议采取bic过滤器获取前项值进行处理)
该参数需要在replicator.filter.datamark.dmltype中声明了delete后才会启动,默认为DU
replicator.filter.datamark.modtypeval=
该参数主要用于对DML类型标记列的列值进行自定义设置,对应顺序严格按照
insert,update,delete这个顺序进行设定,最长支持50个字符,不支持中文和特殊字符。
例:
property=replicator.filter.datamark.modtypeval=1,2,3
该设置意为:insert操作用1标记,update操作用2标记,delete操作用3标记
2、使用命令行repdatamark工具为目标端添加标记列

4.示例
4.1前置条件
1)目标端需要将源端T_MARK表添加标记
| 源端 | 目标端 | |
|---|---|---|
| 模式名 | TEST | test |
| 表名 | T_MARK | t_mark |
| 列名 | C1,C2,C3 | c1,c2,c3,type_mark,time_mark |
4.2操作步骤
1)部署目标端KFS时,在flysync.ini文件中添加数据标记相关参数。
[defaults]
︙
[xxx]
︙
svc-remote-filters=casetransform,datamark
#datamark参数
property=replicator.filter.datamark.markdo=test.t_mark*
property=replicator.filter.datamark.dmltype=insert,update,delete
property=replicator.filter.datamark.markcolumn=modtype,modtime
property=replicator.filter.datamark.deltype=DU
property=replicator.filter.datamark.modtypename=type_mark
property=replicator.filter.datamark.modtypeval=insert_mark,update_mark,delete_mark
property=replicator.filter.datamark.modtimename=time_mark
#casetransform参数
property=replicator.filter.casetransform.to_upper_case= false
︙
说明:多个过滤器联合使用时,需根据过滤器先后顺序对配置文件进行调整。如上述示例中先进行了大小写转换(casetransform)再进行数据标记(datamark),所以标记的列名需按照大小写转换后的结果进行配置。示例是将DML转换为小写,所以列名配置为小写。
2)使用命令行repdatamark工具为目标端对应的表添加标记列
repdatamark -dbtype kingbase8 -host 10.10.0.149 -port 54321 -user system -pass 123 -db test -appendMarkDataColumn test.t_mark -columnType modtype,modtime -typename type_mark -timename time_mark
3)参考《Kingbase FlySync 安装部署手册》完成安装部署
- 其他说明
若需要将delete操作在目标端进行记录并标记(deltype=DI),需在源端配置前置项,这样才能保证有主键的表在记录delete操作时包含了所有列的信息,而不是只有主键列和标记列。
通常为了将delete操作记录到另外一张表时,才会在目标端将delete操作标记为DI,可与操作类型过滤一起配合只同步DELETE操作(参考《金仓KFS支持基于操作类型(INSERT/UPDATE/DELETE)过滤DML功能介绍与配置使用说明》),示例仅介绍启基本功能。
源端flysync.ini文件中添加以下配置
svc-extractor-filters= skipeventbytype
#前置项获取
property=replicator.extractor.dbms.beforeColsFile=/home/oracle/beforeColsRule.json
property=replicator.extractor.dbms.getBeforeCols=true
property=replicator.filter.bic.includeAllCols=true
beforeColsRule.json文件内容如下:
{
"TEST.T_MARK2":"ID"
}
上述配置表示,获取TEST用户下T_MARK2表的前置项,“ID”处可为任意值。(注意大小写)
4.3结果展示
delete标记为DU
1)目标端表结构

2)目标端标记后的数据

delete标记为DI
1)目标端标记后的数据
注:与rename过滤器配合,目标端对t_mark2_delete表进行标记(参考《人大金仓KFS支持对象名映射(修订)功能介绍与配置使用说明》)





