Oracle OGG根据时间字段过滤数据
在某些场景下,需要用OGG同步生产数据到目标端,且生产端的数据表比较大的情况下,目标端可能不需要全部的表数据,这个时候就需要过滤同步部分数据了。
OGG提供了过滤相关的函数来实现这个功能。
以下是案例:
OGG版本:18.1
源端:Oracle 12.1
目标端:Oracle 19.3
抽取进程配置
--根据时间字段抽取同步部分数据
--添加抽取进程
add extract ett02,TRANLOG,BEGIN NOW
add exttrail ./dirdat/t3,extract ett02
edit params ett02
EXTRACT ett02
USERIDALIAS s_yksf
NUMFILES 300
EOFDELAYCSECS 10
DISCARDFILE ./dirrpt/ett02.dsc, APPEND, MEGABYTES 1024
DISCARDROLLOVER AT 05:30 ON MONDAY
EXTTRAIL ./dirdat/t3
TRANLOGOPTIONS LOGRETENTION DISABLED
TRANLOGOPTIONS DBLOGREADER
TRANLOGOPTIONS DBLOGREADERBUFSIZE 1048576
WARNLONGTRANS 4H, CHECKINTERVAL 300
GETTRUNCATES
GETUPDATEBEFORES
NOCOMPRESSDELETES
CACHEMGR, CACHESIZE 128MB
-- TABLES
TABLE sjzt.ttab1 FILTER(@COMPUTE(@DATEDIFF ('DD',create_time,'2025-06-01') ) <=0 );
--源端添加trandata
dblogin USERIDALIAS s_yksf
add trandata sjzt.ttab1
info trandata sjzt.ttab1
delete trandata sjzt.ttab1
应用进程配置
--根据时间字段只同步部分数据
--登录目标镜像库创建checkpoint table
dblogin USERIDALIAS tn_yksf
add checkpointtable ogguser.checkpoint_2
--添加复制进程
add replicat rtt02,exttrail ./dirdat/t3, checkpointtable ogguser.checkpoint_2
--编辑参数
edit params rtt02
REPLICAT rtt02
USERIDALIAS tn_yksf
NUMFILES 300
EOFDELAYCSECS 10
DISCARDFILE ./dirdsc/rtt02.dsc, APPEND, MEGABYTES 512
DISCARDROLLOVER AT 00:00
ASSUMETARGETDEFS
ALLOWNOOPUPDATES
GETTRUNCATES
GETUPDATEBEFORES
--TABLES
MAP sjzt.ttab1, TARGET sjzt.ttab1_date FILTER(@COMPUTE(@DATEDIFF ('DD',create_time,'2025-06-01') ) <=0 );
--删除应用进程(如果需要)
dblogin USERIDALIAS tn_yksf
delete REPLICAT rtt02
--启动抽取进程和应用进程
源端测试插入数据
SQL> INSERT INTO ttab1 VALUES(13,'casedata',to_date('2025-06-01 10:00:33','yyyy-mm-dd hh24:mi:ss'));
1 row created.
SQL> INSERT INTO ttab1 VALUES(14,'casedata',to_date('2024-06-03 10:33:12','yyyy-mm-dd hh24:mi:ss'));
1 row created.
SQL> INSERT INTO ttab1 VALUES(15,'casedata',to_date('2024-06-05 10:33:12','yyyy-mm-dd hh24:mi:ss'));
1 row created.
SQL>
SQL> commit;
Commit complete.
SQL>
SQL> INSERT INTO ttab1 VALUES(16,'casedata',to_date('2026-06-01 10:00:33','yyyy-mm-dd hh24:mi:ss'));
1 row created.
SQL> INSERT INTO ttab1 VALUES(17,'casedata',to_date('2026-06-03 10:33:12','yyyy-mm-dd hh24:mi:ss'));
1 row created.
SQL> INSERT INTO ttab1 VALUES(18,'casedata',to_date('2026-06-05 10:33:12','yyyy-mm-dd hh24:mi:ss'));
1 row created.
SQL>
SQL> commit;
Commit complete.
SQL>
SQL>
目标端查询数据
SQL> /
RID RNAME BOTHDAY
---------- -------------------- -------------------
11 casedata 2025-06-02 10:00:33
13 casedata 2025-06-01 10:00:33
16 casedata 2026-06-01 10:00:33
17 casedata 2026-06-03 10:33:12
18 casedata 2026-06-05 10:33:12
SQL>
正常。