zoukankan      html  css  js  c++  java
  • GoldenGate中使用FILTER,COMPUTE 和SQLEXEC命令

    本文主要介绍OGG中一些过滤或计算函数的用法,以及sqlexec的基本用法

    SQLPREDICATE

    在使用OGG初始化时,可以添加此参数到extract中,用于选择符合条件的记录,下面是OGG官方文档中的描述 :

    “在用OGG初始化数据时,使用SQLPredicate是比where或filter更好的一个选项。使用此语句比其它参数初始化更快,因为它直接作用于SQL语句,告诉OGG不应该取所有数据之后再过滤(这正是其它参数的运行方式),而是应该只取需要的部分。”

    如下

    TABLE ggs_owner.emp_details, SQLPREDICATE “where ename=’Gavin’”;

    针对目标端的数据过滤,仍然可以在replicat上使用where条件进行数据过滤,即只取extract出来的部分数据进行投递,如下:

    MAP ggs_owner.emp_details, TARGET ggs_owner.emp_details, WHERE (ename=”Gavin”);

    FILTER

    Filter的功能远比where强大,你可以在任何有字段转换的地方使用它进行数据过滤,而where只能使用基本的操作符。比如,我们可以在OGG的这些函数(@COMPUTE, @DATE, @STRFIND, @STRNUM等)中使用数值运算符:

    ‘+’,’-’,’/’,’*’或比较操作符‘>’,’<', '='。

    下面的配置示例中我们在extract中使用STRFIND函数,捕获ename字段中只符合相应条件的记录,配置如下:

    TABLE ggs_owner.emp_details,FILTER (@STRFIND (ename, “Gavin”) > 0);

    COMPUTE

    接下来的示例讲解如何使用@COMPUTE函数,本示例中基于某原始字段值,计算同一张表中其它字段的值。

    在本示例中的目标表EMP与源表结构不同,目标表上有多出来的一个字段COMM。COMM字段的值由源字段SAL*1.1计算得到。由于两边表结构不同,因此,我们需要先用defgen程序创建一个定义文件。

    首先,我们在目标端上基于EMP表创建defgen参数文件:

    edit params defgen

    DEFSFILE /home/oracle/goldengate/dirsql/emp.sql
    USERID ggs_owner, PASSWORD ggs_owner
    TABLE ggs_owner.emp;

    然后在OGG安装目录下执行:

    [oracle@linux02 goldengate]$ ./defgen paramfile ./dirprm/defgen.prm

    目标端的replicat参数文件定义如下,里面用到了colmap和compute。colmap中的useDefaults告诉OGG,源和目标表的字段按名称自动匹配,而目标表的comm字段,则由源端的sal字段运算得到。

    REPLICAT rep1
    USERID ggs_owner, PASSWORD *********
    SOURCEDEFS /home/oracle/goldengate/dirsql/emp.sql
    MAP ggs_owner.emp_details, TARGET ggs_owner.emp_details,
    COLMAP (usedefaults,
    comm= @compute(sal +sal *.10));

    基于上面的配置进行数据同步测试,可以看到目标表中comm的字段值是sal字段值的1.1倍,如下:

    SQL> select * from emp;

         EMPNO ENAME                    DEPTNO        SAL       COMM

    ---------- -------------------- ---------- ---------- ----------

          1001 Gavin                        10       1000       1100

          1002 Mark                         20       2000       2200

          1003 John                         30       3000       3300

    SQLEXEC

    SQLEXEC可以在extract或replicat中用于执行SQL语句、存储过程或SQL函数。比如,针对大批量的数据加载,我们可以先将表的索引删除,待数据加载完成之后,再重建索引,从而提高数据同步的性能。在下面replicat示例中,可以看到类似的配置示例:

    REPLICAT rep1
    USERID ggs_owner, PASSWORD ggs_owner
    ASSUMETARGETDEFS
    sqlexec “drop index loc_ind”;
    MAP ggs_owner.emp_details, TARGET ggs_owner.emp_details, WHERE (location=”Sydney”);
    sqlexec “create index loc_ind on emp_details(location)”;

  • 相关阅读:
    mongoDB BI 分析利器
    如何定位 Node.js 的内存泄漏
    如何对MySQL数据库中的数据进行实时同步
    [有奖活动进行中]阿里数据库专家曾文旌为你解决数据库那些事
    如何实现Docker应用的自定义弹性伸缩
    vue methods 中方法的相互调用
    vue 实现部分路由组件缓存
    SSH框架之一详解maven搭建多模块项目
    GitHub Pages 搭建流程-基于jekyll-bootstrap
    ExtJs 4 中的MVC应用架构
  • 原文地址:https://www.cnblogs.com/quanweiru/p/4957633.html
Copyright © 2011-2022 走看看