ITPub博客

首页 > 数据库 > Oracle > 第77期 ogg实现REPLICAT进程FILTER数据过滤

第77期 ogg实现REPLICAT进程FILTER数据过滤

原创 Oracle 作者:pxbibm 时间:2026-07-30 09:13:13 0 删除 编辑

今天的目标是在ogg的目标端通过REPLICAT进程FILTER数据过滤的目的, OGG 过滤函数, 满足条件才执行应用到目标库;不满足直接丢弃这条 trail 记录。把过滤后的数据推送到ActiveMQ中。

一、语句完整解析

主要实现的方式,是在目标端的ogg REPLICAT进程中配置如下参数

MAP TEST.LCCONT, TARGET TEST.LCCONT,FILTER(@STREQ("CONTTYPE",'1') > 0);

1、语法拆分

  • MAP TEST.LCCONT, TARGET TEST.LCCONT

  • 源表: TEST.LCCONT,目标表: TEST.LCCONT(同表同步,常见单向复制、双活其中一侧)

  • FILTER():OGG 过滤函数, 满足条件才执行应用到目标库;不满足直接丢弃这条 trail 记录
  • @STREQ:OGG 内置函数 @STREQ(字段,常量) → 字符串相等比较
@STREQ = String Equals,区分大小写
@STREQ("CONTTYPE",'1') > 0
等价逻辑:
当 CONTTYPE = '1' 返回1(true),否则返回0(false)
✅ 最终业务逻辑: 只同步 CONTTYPE 字段字符串值等于 '1' 的 DML 变更;其余 CONTTYPE 不等于 '1' 的数据变更直接丢弃,不写入目标库。
⚠️重点坑点 1:字段引号写法 "CONTTYPE" 在 OGG 语法代表 字段名 '1' 代表字符串常量

2、等价 SQL 语义

WHERE CONTTYPE = '1'

3、关键注意事项(极易踩坑)

① 区分 @STREQ vs @NUMEQ

  • @STREQ: 字符串比较如果 CONTTYPE 是数字类型 NUMBER,数据库里值是 1(数字), @STREQ(CONTTYPE,'1') 依然可以匹配;
  • @NUMEQ: 数值比较 @NUMEQ(CONTTYPE,1)

② NULL 处理

如果 CONTTYPE IS NULL @STREQ("CONTTYPE",'1') 返回 0 → 数据被过滤丢弃

③ DML 全部生效:INSERT / UPDATE / DELETE 统一过滤

只要该行 CONTTYPE≠'1',不管新增、修改、删除,全部丢弃。

👉 场景风险:一条 UPDATE 操作:原数据 CONTTYPE='1' → 更新后 CONTTYPE='2'源端执行 UPDATE,这条变更会被 FILTER 过滤;目标库数据不会同步变更,源和目标出现不一致!

④ Filter 执行时机

Replicat 进程读取 trail 之后, 应用到目标库之前过滤。
数据已经传输到 trail,只是 Replicat 丢弃;不能减少网络、trail 文件大小。
如果想要源头过滤,需要把 FILTER 写在 Extract 端。

二、优化写法规范(推荐调整)

标准规范,空格美化,避免解析歧义:
MAP TEST.LCCONT, TARGET TEST.LCCONT,
FILTER (@STREQ(CONTTYPE, '1') > 0);
可以省略字段双引号 CONTTYPE,没有特殊字符不需要 ""
也可以简化写法(OGG 支持布尔判断)
FILTER (@STREQ(CONTTYPE, '1'));

三、常见需求扩展

需求 1:多个条件,CONTTYPE='1' 或者 CONTTYPE='3'

FILTER (@STREQ(CONTTYPE, '1') OR @STREQ(CONTTYPE, '3'));

需求 2:数字字段安全写法(推荐 @NUMEQ

如果 CONTTYPE 是 NUMBER:
FILTER (@NUMEQ(CONTTYPE, 1));

需求 3:过滤 DELETE,只同步 INSERT/UPDATE(搭配使用)

FILTER (@GETENV ('GGHEADER', 'OPTYPE') <> 'DELETE' AND @STREQ(CONTTYPE, '1'))

四、运维排查:如何验证过滤是否生效

  1. 查看 Replicat 报告文件

  2. Stats replicat 查看统计:

[oracle@zlf-ogg-test-1 ggsmq191]$ ./ggsci
Oracle GoldenGate for Big Data
Version 19.1.0.0.13 (Build 003)
Oracle GoldenGate Command Interpreter
Version 19.1.0.0.220118 OGGCORE_19.1.0.0.0OGGBP_PLATFORMS_220111.1823
Linux, x64, 64bit (optimized), Generic  on Jan 11 2022 19:42:00
Operating system character set identified as UTF-8.
Copyright (C) 1995, 2022, Oracle and/or its affiliates. All rights reserved.
GGSCI (zlf-ogg-test-1.novalocal) 1> info all
Program     Status      Group       Lag at checkpt  Time Since checkpt
MANAGER     RUNNING                                           
REPLICAT    RUNNING     NEWRMQ      00:00:00      00:00:07    
GGSCI (zlf-ogg-test-1.novalocal) 2> stats newrmq
Sending STATS request to REPLICAT NEWRMQ ...
Start of Statistics at 2026-07-29 12:37:08.
DDL replication statistics:
*** Total statistics since replicat started     ***
	Operations                		           3.00
	Mapped operations         		           0.00
	Unmapped operations         		           3.00
	Other operations         		           0.00
	Excluded operations         		           0.00
	Errors                    		           0.00
	Retried errors            		           0.00
	Discarded errors          		           0.00
	Ignored errors            		           0.00
Replicating from TEST.LCCONT to TEST.LCCONT:
*** Total statistics since 2026-07-28 16:42:17 ***
    Total inserts                   	         773.00
    Total updates                   	        1937.00
    Total deletes                   	         384.00
    Total upserts                   	           0.00
    Total discards                  	           0.00
    Total operations                	        3094.00

观察: Filtered 指标,代表被过滤丢弃的记录数量,验证过滤是否生效。

五、结合你当前环境提醒

你的 NEWRMQ 是 Replicat + UserExit 推送 ActiveMQ这条 FILTER 生效逻辑:被过滤的数据 不会进入 UserExit 代码,不会发送 MQ完全符合预期:只有 CONTTYPE='1' 的数据才投递 MQ。

六、重大风险提醒

如果业务后续会更新 CONTTYPE 的值(比如从 1 改成其他值),会引发源目标不一致,设计同步方案时务必评估!

示例场景:源库:

UPDATE LISMAN.LCCONT SET CONTTYPE='2' WHERE ...;
这条更新会被 filter 丢弃,目标库 CONTTYPE 依旧是 '1',数据不一致。

七、所有ogg配置的脚本

GGSCI (zlf-ogg-test-1.novalocal) 4> view param mgr
PORT 4002
ACCESSRULE, PROG REPLICAT, IPADDR 100.100.120.100, ALLOW
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, minkeepdays 7
GGSCI (zlf-ogg-test-1.novalocal) 5> view param newrmq
REPLICAT newrmq
setenv (NLS_LANG = AMERICAN_AMERICA.ZHS16GBK)
GetEnv (JAVA_HOME)
GetEnv (PATH)
GetEnv (LD_LIBRARY_PATH)
GetEnv (LIBPATH)
TARGETDB LIBFILE libggjava.so SET property=dirprm/javaue.properties 
sourceDefs /oradata/ggsmq191/dirdef/defgennewmq.def override
MAP TEST.LCCONT, TARGET TEST.LCCONT,FILTER(@STREQ("CONTTYPE",'1') > 0);
javaue.properties
### javaue.properties (GoldenGate Java Extract properties file)
gg.handlerlist=advjms,advjmslp
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=failover:(tcp://100.100.12.193:61616,tcp://100.100.12.194:61616)
gg.handler.advjms.type=jms
gg.handler.advjms.destination=dynamicQueues/oggjmsQueue
gg.handler.advjms.connectionFactory=ConnectionFactory
gg.handler.advjms.format=xml
gg.handler.advjms.excludeTables=TEST.DDCLAIMUSER,TEST.DDREGISTER
gg.handler.advjmslp.type=jms
gg.handler.advjmslp.destination=dynamicQueues/oggjmsQueuelp
gg.handler.advjmslp.connectionFactory=ConnectionFactory
gg.handler.advjmslp.format=xml
### native library config ###
goldengate.userexit.nocheckpt=TRUE
goldengate.userexit.timestamp=utc
goldengate.log.logname=cuserexit
goldengate.log.level=INFO
goldengate.log.tofile=true
#goldengate.userexit.writers=javawriter
#javawriter.stats.time=3600
#javawriter.stats.numrecs=10000
#javawriter.stats.full=TRUE
#javawriter.stats.display=TRUE
jvm.bootoptions=-Xmx10240m -Xms10240m -Djava.class.path=ggjava/ggjava.jar:dirprm:/oradata/ActiveMQ/jar/activemq-all-5.14.5.jar:/oradata/ActiveMQ/jar/log4j-1.2.17.jar:/oradata/ActiveMQ/jar/slf4j-log4j12-1.7.13.jar  -Dlog4j.configuration=log4j.properties





来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12798004/viewspace-3177049/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
【DBAplus社群】联合发起人。ACOUG核心成员,Oracle用户组年轻专家。熟悉Oracle的体系结构,擅长Oracle数据库架构规划、SQL优化、OWI方面性能的优化。曾服务于航天、航空、机车、大型制造行业数据库的维护以及系统开发工作,开发过基于Oracle数据库的大型ERP系统。
  • 博文量
    341
  • 访问量
    2469360