GoldenGate安装部署 联系客服

发布时间 : 星期一 文章GoldenGate安装部署更新完毕开始阅读20063d6f011ca300a6c3903e

table ddw.aatest, FILTER (@STRFIND(NAME, \***/

FILTER参数的优势是还可以指定只在某种DML操作下才过滤,比如: /***

table ddw.aatest, FILTER((ON UPDATE, ON DELETE, (num1*num2)>1000);

--只在UPDATE和DELETE操作时过滤num1*num2不大于1000的值 ***/

5.4.3 调用执行SQL或存储过程

在GlodenGate指令库中有个SQLEXEC指令,可以用来调用执行数据库存储过程或者自定义的SQL语句,可以指定输入参数,输出参数可以作为字段与目标表映射。使用这个指令,可以实现将源表做简单连接(table join)然后将连接后结果同步到目标表,达到简单的转换目的。

在复制端配置如下(以SQL为例,procedure是一样的,改成过程名即可): /***

replicat repjoin

userid ddw,password ddw

sourcedefs d:\\tools\\GG\\gg10g\\dirdef\\extjo.ref reperror default,discard

discardfile D:\\repjoin.dsc,append,megabytes 100 gettruncates

map ddw.a1test, target ddw.a12test,

sqlexec (id testid, --自定义执行语句的唯一标识 query \ --:id_param为输入参数 params (id_param = NAME_ID)), --将输入参数指定为源表中某列 如果没有输入参数,则这部分改为NOPARAMS colmap (USEDEFAULTS, name = testid.name, value1 = testid.value1);

--新的字段映射,testid.name表示语句输出参数name

***/

上面的配置案例,实现了将ddw.a1test表中name_id字段通过字典表a2test转换为对应的真实name值,并增加了一个value字段,然后映射到ddw.a12test表中。ddw.a12test表中的记录实际就是前面ddw.a1test表和a2test表连接生成的记录。

但是,这里存在一个问题:字典表a2test是在源数据库呢,还是在目标数据库?显而易见,配置在复制进程的配置文件中,那条语句是在目标端数据库执行的(如果执行procedure那么这个过程也必须建立在目标端),字典表a2test在目标端(在我这个例子中)。而且同步是由表ddw.a1test上的事务触发的,字典表a2test中的数据无论怎么改都不会引起这个数据同步。这种情况下,可以考虑将字典表a2test也进行同步,来解决这个问题。

25

SQLEXEC指令也可以在提取进程中使用。如果有输出参数作为额外的映射列,这个时候需要将查询结果也一并传输过去。可以通过参数TOKENS进行传递,然后再在目标端映射。

以下对TOKENS的使用进行说明。

使用USER TOKENS AREA

可以使用TOKENS参数,在提取端将自定义的数据放入trail中,传递到目标端,映射到目标端的表中。这里针对前面SQLEXEC提出的问题示例。

提取端extract的TABLE配置: /***

TABLE ddw.test, sqlexec (id sqlid,

query \TOKENS (TK_CODE = sqlid.codeid); --将提取端查询出的node_id字段值,标识为TK_CODE放入ddw.test

表的trail文件中,一起传递 ***/

目标端replicat的MAP配置: /***

MAP ddw.test, TARGET ddw.testother,

COLMAP (USEDEFAULTS,SITE_CODE = @TOKEN(\--将TK_CODE值映射给目标字段 ***/

5.4.4 数据库DML操作过滤

数据库DML操作过滤,这里是指选择是否捕获INSERT、UPDATE、DELETE。在某些业务场景下,只需要捕获某一种特定的DML操作即可,比如业务数据库往数据仓库的数据同步,往往只需要捕获INSERT操作,而对于UPDATE、DELETE则不允许同步目标库。 默认下,INSERT、UPDATE、DELETE都是捕获的,可以分别在Extract进程的配置文件中加入IGNOREINSERTS、IGNOREUPDATES、IGNOREDELETES进行忽略。当然,在这种情况下,业务上需要做相应的限制。比如忽略DELETE操作时,源数据库应禁止重复插入DELETE掉的键值。 参数使用示例(表示只捕获INSERT): /*** IGNOREUPDATES IGNOREDELETES ***/ TRUNCATE是一种特殊的删除操作,默认配置下GoldenGate不进行捕获,一般需要在Extract进程的配置文件中加入GETTRUNCATES来指定捕获。

26

5.5 关于目标端高数据安全性下的GoldenGate配置方案

5.5.1 配置方案

因为GoldenGate的标准配置下,是通过源端抓取进程向目标端发送队列文件的方式传输数据的,但在实际应用中,会出现这么一个关于安全方面的问题:如果上级机器的安全策略不允许外网直接往里发送数据,如何进行数据同步配置? GoldenGate是有提供一个由目标端主动“申请”源端进行数据传输的方式,以保证内外网不同安全域下的数据安全保障。 解决方案的体系架构如下:

主要是通过目标端一个额外的alias Extract进程,实现由目标端(可信任域)主动请求、向源端(未信任域)提供数据传输的连接的过程。

具体的驱动模式如下(翻译自官方文档,可能表述得不准确): (1) 启动可信任域的alias Extract进程

(2) 可信任域的GGSCI向未信任域mgr主进程发送消息,以启动相应的passive Extract

进程。消息包含可信任域的主机名或IP,以及一个可信任域mgr主进程的端口号。

(3) 未信任域接受消息后,启动passive Extract进程,并打开一个可用的端口号。 (4) 未信任域mgr主进程将该端口号返回给可信任域的GGSCI。

(5) 可信任域的GGSCI向本地mgr主进程发送请求以启动Collector进程。

(6) 本地mgr启动Collector进程,通过未信任域提供的端口号对未信任域进行监听。 (7) Collector进程打开与未信任域passive Extract进程的连接。

(8) 同步数据通过连接从未信任域passive Extract进程传输到Collector进程,然后写入

本地trail,被Replicat进程应用。

这里未信任域的passive Extract进程,即是源端的data pump Extract进程,所以只需要

27

改动源端的data pump Extract进程、新增一个alias Extract进程即可(Collector进程由目标端mgr自动配置)。

5.5.2 配置案例

1.源端配置(146上)

(1)创建提取进程(与普通情况下完全一样) GGSCI> add extract exta,tranlog,begin now 配置文件exta.prm: /***

extract exta

SETENV (ORACLE_SID = ORCL)

userid COSS360,password COSS360 exttrail C:\\ggoracle\\dirdat\\ea

dynamicresolution gettruncates

TABLE COSS360.per_test, keycols (sampletime, objectid); ***/

创建本地队列:

GGSCI> ADD EXTTRAIL C:\\ggoracle\\dirdat\\ea,extract exta

(2)pump进程(passive extract进程) 创建passive pump:

GGSCI> ADD EXTRACT pumpa, exttrailsource C:\\ggoracle\\dirdat\\ea, begin now, passive, desc \ --passive表示为passive extract process 配置文件pumpa.prm: /***

extract pumpa

userid COSS360,password COSS360

--rmthost 192.168.0.142, mgrport 7801 --原先的rmthost需要被注释 RMTHOSTOPTIONS compress --passive extract专有参数 rmttrail D:\\ggoracle\\dirdat\\trail146\\ea NOPASSTHRU gettruncates

TABLE COSS360.per_test, keycols (sampletime, objectid); ***/

创建远端队列:

add rmttrail D:\\ggoracle\\dirdat\\trail146\\ea extract pumpa

2.目标端配置(142上) (1)添加aliad extract进程

28