Oracle OGG根据时间字段过滤数据

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> 

正常。