OGG如何拆表1对多

1. 背景说明

有个OGG业务需求如下,源端某张表根据地区ID字段,在目标端上拆分到多个用户里面

2. 实施要点

在这个OGG的实施过程中,一般需要注意以下几点:

2.1 通过AREA_ID字段来拆分数据的方式,可以用多种方法

  • 通过datapump来拆分
  • 需要注意的是:datapump进程不能使用passthru,并且要配置OGG的用户和口令
    如果USER1.T1和USER2.T1在一个数据库上,USER3.T1在另一个库上,这种情况有点麻烦,因为使用FILTER,我没有找到IN的功能,FILTER好像也没有看到OR的写法
    如果谁知道更好的、更简单实现如 FILTER ( AREA_ID IN ( 1, 2 ) ),这种过滤方式,请告诉我。
    想到的办法是:

    TABLE USER.T1, FILTER ( @VALONEOF ( @NUMSTR ( AREA_ID ), "3", "26", "48", "39", "4", "69", "63") = 1 ); 
    

    有个问题是:@VALONEOF只支持字符串,需要将数值型转换成字符串再判断。

  • 另一种呢就不要通过datapump来拆分了,直接把数据全部扔到各个目标端上,由replicat来过滤
  • 写法如下:

    MAP USER.T1, TARGET USER1.T1, FILTER ( AREA_ID = 3 );
    MAP USER.T1, TARGET USER2.T1, FILTER ( AREA_ID = 26 );
    MAP USER.T1, TARGET USER3.T1, FILTER ( AREA_ID = 48 );
    MAP USER.T1, TARGET USER4.T1, FILTER ( AREA_ID = 39 );
    MAP USER.T1, TARGET USER5.T1, FILTER ( AREA_ID = 4 );
    MAP USER.T1, TARGET USER6.T1, FILTER ( AREA_ID = 69 );
    MAP USER.T1, TARGET USER7.T1, FILTER ( AREA_ID = 63 );
    

    把一个服务器上要拆分到多个用户的表,全部写到一个replicat的配置文件中,虽然效率比较差,但也比较直观。

    2.2 需要考虑DELETE的问题

    默认情况,抽取进程捕获DELETE时,只捕获了主键,因为抽取进程不知道在目标端上进行拆表,所以导致目标端上DELETE没有AREA_ID字段进行过滤,就无法DELETE掉记录。
    这种需要在抽取进程中抽取相关表时做一些配置,如下:

    TABLE USER.T1, GETBEFORECOLS ( ON UPDATE KEYINCLUDING (area_id), ON DELETE KEYINCLUDING (area_id) );
    

    这样OGG在抽取DELETE操作时,也会把AREA_ID字段一起抽取出来,目标端就可以顺利FILTER了

    关于紫砂壶

    感悟技术人生
    此条目发表在GoldenGate分类目录,贴了标签。将固定链接加入收藏夹。