informatica 数据库之间的多表数据同步(全量/增量)以及variable的使用问题

两个数据库之间的多表数据同步(增量或全量)

中间有一张control table 表结构大概为
table_name varchar(200),
load_flag int,
利用load_flag来控制需要同步的表
flag为1 则同步
flag为0 则不同步

实现方法为 用一个mapping 将flag为1 的表名过滤出来,在把这些表名 首位加上特殊字符 再一个个拼接起来
如 ~table1~table2~table3~
然后赋值给 $$v_flag ,mp中的变量可以定义长度,因为有很多表所以$$v_flag的长度一定要很长,建议1000以上。

wf中通过这个session将 $$v_flag传到后面的session,进行判断该表名是否在变量中instr($$v_flag,'~table_name~'),如果为真则说明这个表需要同步,否则就不执行session

session
fact表需要按照时间戳进行增量抽取
用parameter file建立两个时间戳变量$$StartDate,$$EndDate
在SQL Qurey中写SQL进行过滤
select * from table where date between '$$StartDate' and '$$EndDate'

workflow
informatica 数据库之间的多表数据同步(全量/增量)以及variable的使用问题_第1张图片

在实际运用的过程中发现:

当表的数量不多的时候,wf可以正常运行没有问题
但是在将所有表进行同步之后,发现有好几张表没有数据,查看log发现,$$V_flag并没有把所有的表名放进去,然后去计算了一下$$v_flag的字符串长度,发现长度为600。但实际所有表名连起来的长度要不止600。
检查了mp,里面的变量长度都是足够的,而wf中无法指定变量的长度,F1里也没有详细的说明。

Google了一下发现的确也有很多人说 wf 的变量长度最大就是600,那我就对mp和wf做了改善

首先因为wf里面的worklet是按照db来分的
所以我在control table中再加一列
table_db varchar(100),
用于记录这张表是在哪一个库里面

然后第一个mp中按照table_db进行分类筛选
将同一个库下的表名对应一个变量
所以有几个库,就有几个$$v_flag
informatica 数据库之间的多表数据同步(全量/增量)以及variable的使用问题_第2张图片

再传入后面的session中,这样wf里也要和mp中的变量同步
informatica 数据库之间的多表数据同步(全量/增量)以及variable的使用问题_第3张图片
把表名按照db来分割,传入各自对应的worklet中进行判断
这样就有效避免了wf变量不够长的问题


你可能感兴趣的:(Informatica)