在很多业务场景中,在使用 OGG (Oracle GoldenGate) 进行数据同步时,为已有的同步进程新增需要同步的表。这是一个非常常见的运维操作。 在原有同步进程里新增同步表的时候,考虑到源端表上可能会有事务,数据是实时变化的,不能单纯的使用expdp直接导出再导入,这样可能会导致丢失数据或者数据重复冲突。针对这种情况,有两种方法可以实现在原有同步进程里添加新表并且可以保证数据一致性。
一种是基于SCN的expdp导出。
另一种是基于SCN的flashback query和dblink远程插入(适用于表数据量不大的情况)。
下面我将为您提供一个详细、规范的步骤指南。 整个过程的核心思想是:先添加抽取进程的配置,确保新表有增量日志被捕获,然后再在投递进程中配置投递规则,最后在目标端复制进程中配置应用规则。为了清晰起见,我们假设一个典型的单向同步环境:源端: EXTRACT(抽取进程) -> DATAPUMP(投递进程)目标端: REPLICAT(复制进程)新增的表名为 SCOTT.TESTOGG。整体操作流程概览: 1.准备阶段: 在源库和目标库创建新表,并获取初始数据。 2.配置修改阶段: 依次停止相关进程,修改 OGG 参数文件。 3.初始化阶段: 使用初始数据装载工具(如 Data Pump, Oracle Streams, 或 OGG 本身)初始化目标表。 4.启动与验证阶段: 按正确顺序启动 OGG 进程,并验证同步是否正常。 案例流程: 1.使用基于SCN的expdp导出方法新增表的同步: 1.1 登录主库,添加该表的附加日志
GGSCI (pxbogg) 1> dblogin USERID username@tnsstr PASSWORD userpw Successfully logged into database. GGSCI (pxbogg) 2> ADD TRANDATA,SCOTT.TESTOGG; 查看附加日志是否添加成功: GGSCI (pxbogg) 3> INFO TRANDATA,SCOTT.TESTOGG 2025-10-30 10:24:31 INFO OGG-26035 Logical replication for table SCOTT.TESTOGG is ENABLED. 2025-10-30 10:24:32 INFO OGG-06480 Schema level supplemental logging, excluding non-validated keys, is enabled on schema "TEST". 2025-10-30 10:24:32 INFO OGG-10471 ***** Oracle Goldengate support information on table SCOTT.TESTOGG ***** Oracle Goldengate support native capture on table SCOTT.TESTOGG. Oracle Goldengate marked following column as key columns on table SCOTT.TESTOGG: NAME. Logging of supplemental redo log data is enabled for table SCOTT.TESTOGG. Columns supplementally logged for table SCOTT.TESTOGG: "NAME". Prepared CSN for table SCOTT.TESTOGG: 6129208295301 GGSCI (pxbogg) 4>
1.2 编辑抽取进程添加该表,重启抽取进程
GGSCI (pxbogg) 5> edit params ext1 EXTRACT ext1 setenv (NLS_LANG = AMERICAN_AMERICA.ZHS16GBK) USERID user@tnsstr PASSWORD userpw TRANLOGOPTIONS MININGUSER user MININGPASSWORD userpw TRANLOGOPTIONS INTEGRATEDPARAMS (downstream_real_time_mine Y) TRANLOGOPTIONS INTEGRATEDPARAMS (max_sga_size 3072) DISCARDFILE ./dirrpt/ext1.dsc, APPEND, MEGABYTES 1024 LOGALLSUPCOLS UPDATERECORDFORMAT FULL DBOPTIONS ALLOWUNUSEDCOLUMN REPORTCOUNT EVERY 1 MINUTES, RATE WARNLONGTRANS 2h,CHECKINTERVAL 300 DDL INCLUDE MAPPED, EXCLUDE OBJTYPE 'tablespace',EXCLUDE OBJTYPE 'JOB', EXCLUDE OBJTYPE 'TRIGGER', EXCLUDE OBJTYPE 'SNAPSHOT', EXCLUDE OBJTYPE 'SNAPSHOT LOG', EXCLUDE INSTR 'shrink space CHECK' DDLOPTIONS ADDTRANDATA TRANLOGOPTIONS FETCHPARTIALLOB getUpdateBefores NOCOMPRESSDELETES EXTTRAIL ./dirdat/lt TABLE SCOTT.TEST1; -- 新增加的表 TABLE SCOTT.TESTOGG; 停止抽取进程 GGSCI (pxbogg) 6> stop ext1 Sending STOP request to EXTRACT ext1 ... STOP request pending end-of-transaction (1 records so far).. 启动抽取进程 GGSCI (pxbogg) 7> start ext1 Sending START request to MANAGER ... EXTRACT ext1 starting
1.3编辑pump进程,添加该表
GGSCI (pxbogg) 9> edit param pscott EXTRACT PSCOTT setenv (NLS_LANG = AMERICAN_AMERICA.ZHS16GBK) PASSTHRU RMTHOST 192.168.16.3, MGRPORT 7809 RMTTRAIL /oradata/ggs_data/dirdat/cs DYNAMICRESOLUTION TABLE SCOTT.TEST1; -- 新增加的表 TABLE SCOTT.TESTOGG; 停止pump进程 GGSCI (ngppdg as ogg@ngpdb2) 14> stop pscott Sending STOP request to EXTRACT PSCOTT ... Request processed. GGSCI (ngppdg as ogg@ngpdb2) 15> start pscott Sending START request to MANAGER ... EXTRACT PSCOTT starting
目标端: 1.4 查看当前复制进程状态,确认无延迟后,停止复制进程,查询主库当前的SCN
GGSCI (pxbogg) 2> lag rscott 2025-10-30 10:45:50 INFO OGG-14054 Lag from heartbeat table requires DBLOGIN. Sending GETLAG request to REPLICAT RSCOTT ... Last record lag 7 seconds. --停止复制进程 GGSCI (pxbogg) 2> stop rscott Sending STOP request to REPLICAT RSCOTT ... STOP request pending end-of-transaction (196 records so far).
1.5 查询主库当前的SCN
[oracle@pxboracle ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Oct 30 10:57:57 2025 Version 19.25.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.25.0.0.0 SQL> select to_char(current_scn) from v$database; TO_CHAR(CURRENT_SCN) ---------------------------------------- 6131734467265 SQL>
1.6 在主库执行基于SCN的expdp导出,并上传到目标数据库服务器上进行导入
expdp '"/ as sysdba"' directory=DATA_PUMP_DIR dumpfile=scott20251030.dump logfile=exp_20251030.log tables=scott.testogg flashback_scn=6131734467265 传输dump文件到目标服务器上 [oracle@pxboracle ~]$ scp -r /dbbackup/dumpbak/scott20251030.dump oracle@192.168.16.3:/oradata/dumpfile
1.7 在目标服务器上导入数据
impdp '"/ as sysdba"' directory=DATA_PUMP_DIR dumpfile=scott20251030.dump logfile=imp_20251030.log
1.8编辑复制进程,添加同步表的映射关系
GGSCI (pxbogg) 13> edit param RSCOTT
REPLICAT RSCOTT
setenv (NLS_LANG = AMERICAN_AMERICA.ZHS16GBK)
setenv (ORACLE_SID=testogg)
DISCARDFILE ./dirrpt/newrlis.dsc, APPEND, MEGABYTES 2048
DBOPTIONS ENABLE_INSTANTIATION_FILTERING
ASSUMETARGETDEFS
ALLOWNOOPUPDATES
USERID user, PASSWORD userpw
REPERROR DEFAULT ABEND
REPERROR 942 DISCARD
DDL INCLUDE MAPPED,EXCLUDE OPTYPE GRANT,EXCLUDE OBJTYPE 'SYNONYM',EXCLUDE OBJTYPE 'PACKAGE',EXCLUDE OBJTYPE 'PACKAGE BODY'
DDLOPTIONS REPORT
MAP SCOTT.TEST1, TARGET SCOTT.TEST1;
--映射新增加的表
MAP SCOTT.TESTOGG, TARGET SCOTT.TESTOGG,FILTER ( @GETENV ('TRANSACTION', 'CSN') >6131734467265);
--添加如下内容,注意标红的部份,添加导出时的SCN号,这样启动进程后,该表会从该SCN往后应用trail日志,实现数据的一致性
MAP SCOTT.TESTOGG, TARGET SCOTT.TESTOGG,FILTER ( @GETENV ('TRANSACTION', 'CSN') >6131734467265);
1.9 启动复制进程
GGSCI (pxbogg) 14> start RSCOTT Sending START request to MANAGER ... REPLICAT RSCOTT starting GGSCI (pxbogg) 15> info * REPLICAT RSCOTT Last Started 2025-10-30 10:55 Status RUNNING Checkpoint Lag 00:00:00 (updated 00:00:01 ago) Process ID 7647 Log Read Checkpoint File /oradata/ggs_data/dirdat/cs000000867 2025-10-30 11:21:54.981081 RBA 171641182
INFO ALL检查所有进程状态是否为
RUNNING。STATS EXTRACT EXT1,
STATS EXTRACT PSCOTT,
STATS REPLICAT RSCOTT查看进程统计信息,确认新表
SCOTT.TESTOGG有数据在处理。INSERT,
UPDATE,
DELETE操作,然后在目标端查询,验证变更是否被实时同步。
重要注意事项与最佳实践
MAP SCOTT.*, TARGET SCOTT.*;。但这需要谨慎,因为它会同步所有符合规则的表,包括可能不想同步的系统表。
