Oracle GoldenGate 12.2.0.2 跨平台同步实战:Windows到Linux环境配置与避坑指南 简介这份资源面向需要在异构操作系统间完成Oracle数据同步的DBA与运维工程师聚焦Oracle GoldenGateOGG从Windows源库到Linux目标库的安装部署全流程。内容涵盖源库与目标库的归档模式、强制日志、附加日志及goldengate用户授权配置OGG 12.2.0.2版本的解压与可视化安装以及Manager、Extractor、Replicat等核心组件的参数配置并延伸至监控、日志管理与故障排查思路适合具备一定Oracle基础、希望掌握跨平台实时复制技能的中高级技术人员。资源包共1个PDF文件约496KB以图文步骤与SQL命令示例为主便于对照实操。目前已有296人学习下载。通过这份文档读者可系统梳理OGG部署的关键环节与权限要点快速搭建Windows到Linux的同步链路并积累日志分析与问题定位的实战经验。1. OGG 12.2.0.2 跨平台同步从 Windows 到 Linux 的安装前环境清单跨平台数据同步这件事装之前觉得就是解压、跑安装脚本、配几个参数真动手才发现坑全埋在环境差异里。这次要落地的是 Oracle GoldenGate 12.2.0.2源端 Windows 上的 Oracle目标端 Linux 上的 Oracle中间隔着操作系统、字符集、路径风格三层差异。OGG 本身不挑平台但它的抽取进程读的是源库 redo投递进程写的是目标库 trail任何一端环境没对齐同步链路就是断的。我见过最典型的翻车是源库没开附加日志Extract 进程起来后报 OGG-00868日志里只写“missing supplemental log data”不告诉你是哪张表缺排查半天。这套环境适合已经在用 Oracle 11g/12c、需要做异构迁移或实时容灾的团队新手照着走能跑通熟手可以重点看参数取舍和跨平台路径处理。下面按“装什么版本 → 数据库怎么配 → OGG 进程怎么起 → 坏了怎么救”的顺序拆开。2. 安装 OGG 12.2.0.2Linux 端解压与可视化安装2.1 版本选择与安装包确认这次用的安装包是122022_fbo_ggs_Linux_x64_shiphome.zip对应 OGG 12.2.0.2 的 Linux x64 版本。选这个版本的原因很直接源端 Windows 上的 Oracle 是 11.2.0.x目标端 Linux 也是 11g/12c 混用12.2.0.2 对 11g 的兼容性比 19c 稳而且fbo前缀表示这是 Foundation Base 版本不带 WebLogic 那些额外组件装完就是纯命令行ggsci适合运维场景。下载后先确认文件完整性常见做法是比对官方提供的 checksum但这次输入里没给我一般会直接看解压后Disk1目录里有没有runInstaller和response目录缺一个就重新下。安装前用oracle用户登录 Linux 目标机把 zip 包放到/u01/app/ogg这类独立目录下不要跟 Oracle Home 混在一起。解压命令su - oracle cd /u01/app/ogg unzip 122022_fbo_ggs_Linux_x64_shiphome.zip解压后目录结构是fbo_ggs_Linux_x64_shiphome/Disk1/里面runInstaller是图形化安装入口。如果目标机没装 X11 转发./runInstaller会直接报Cant connect to X11 window server这时候要么配DISPLAY变量要么用静默安装。静默安装的 response 文件在Disk1/response/下改INSTALL_OPTION和ORACLE_HOME两个参数就行但这次输入里走的是可视化安装所以下面按图形界面说。2.2 可视化安装步骤与数据库版本匹配进入Disk1目录执行cd fbo_ggs_Linux_x64_shiphome/Disk1 ./runInstaller图形界面第一步是选择 Oracle Home这里要选目标端 Oracle 数据库的 Home比如/u01/app/oracle/product/11.2.0/db_1。第二步是选择数据库版本OGG 12.2.0.2 的安装器会列出 11g、12c、18c、19c 几个选项必须跟目标库实际版本一致。选错版本的后果是ggsci能起来但dblogin时报ORA-24909或OGG-01004因为 OGG 的数据库接口库版本对不上。安装路径我一般设成/u01/app/ogg跟解压目录分开方便后续升级时直接换 Home。安装完成后/u01/app/ogg下会出现ggsci、extract、replicat等可执行文件。验证安装是否成功cd /u01/app/ogg ./ggsci如果进入GGSCI提示符且版本显示Version 12.2.0.2.2 OGGCORE_12.2.0.2.0_PLATFORMS_170630.0419_FBO说明二进制没问题。这时候先别急着配进程源端 Windows 那边也要装同版本 OGG跨平台同步要求两端 OGG 版本一致或至少大版本相同12.2.0.2 对 12.2.0.2 是最稳的组合。提示Windows 端安装包是122022_fbo_ggs_Windows_x64_shiphome.zip安装过程跟 Linux 类似但路径风格是C:\ogg后面配参数时要注意路径分隔符。3. 源库与目标库配置归档、附加日志与 OGG 用户3.1 源库开启归档与附加日志源库配置是整条链路的地基少一步后面全白搭。先确认数据库在归档模式SQL startup mount SQL alter database archivelog; SQL alter database open;然后开强制日志和附加日志SQL alter database force logging; SQL alter database add supplemental log data;force logging的作用是让所有操作都写 redo哪怕表设了nologging也强制记录OGG 抽取依赖 redo不开这个遇到批量加载就会丢数据。add supplemental log data是加最小附加日志把主键、唯一索引的前像写进 redoReplicat 端才能定位到具体行。查看结果SQL Select SUPPLEMENTAL_LOG_DATA_MIN, FORCE_LOGGING from v$database; SUPPLEME FOR -------- --- YES YES两个都是 YES 才算过。然后切一次日志让附加日志生效SQL alter system switch logfile;这一步容易被跳过结果是add trandata时报OGG-00755说 supplemental logging 没启用其实就是当前 redo 还没带上附加信息。3.2 创建 goldengate 用户与权限授予源库和目标库都要建 OGG 专用用户不要用 sys 或 system。建表空间和用户SQL create tablespace goldengate datafile /u01/app/oracle/oradata/test1/ogg01.dbf size 300m autoextend on; SQL create user goldengate identified by goldengate default tablespace goldengate; SQL grant connect, resource, create session, alter session to goldengate; SQL grant flashback any table to goldengate; SQL exec dbms_goldengate_auth.grant_admin_privilege(GOLDENGATE);grant_admin_privilege是 OGG 12c 之后必须的一步它把 OGG 需要的内部包权限一次性授给用户不执行的话dblogin能过但 Extract 进程启动时报OGG-02027提示缺dbms_goldengate_auth相关权限。flashback any table是给 Replicat 做闪回查询用的当日志信息不足时 OGG 会直接读表比对。目标库额外需要 DML 权限SQL grant insert any table, update any table, delete any table to goldengate;源库不需要这三条因为 Extract 只读不写。两端都要开enable_goldengate_replicationSQL alter system set enable_goldengate_replication true scopeboth;这个参数是 12c 引入的不开的话 OGG 进程起不来报OGG-00868或ORA-02097。scopeboth表示内存和 spfile 都改重启后依然生效。3.3 目标库配置差异与注意事项目标库不需要开附加日志因为 Replicat 是写操作不依赖 redo 里的前像。但目标库的enable_goldengate_replication必须开否则 Replicat 进程启动时报OGG-01004。另外目标库的goldengate用户要有create table权限吗不需要Replicat 只做 DML不建表。但如果配了 DDL 同步目标库用户需要create any table等 DDL 权限这次输入里 DDL 同步是源端配的目标端只做 DML 复制所以按上面的权限就够。注意源库和目标库的goldengate用户密码要一致因为 OGG 参数文件里写的是明文密码两端不一致会导致 DataPump 投递时认证失败。4. OGG 进程配置从 GLOBALS 到 Replicat 的完整链路4.1 初始化子目录与全局参数两端都进入 OGG 安装目录执行ggsci后创建子目录[oracletest1 ogg]$ ./ggsci GGSCI (test1) 1 create subdirscreate subdirs会在当前目录下生成dirprm、dirrpt、dirchk、dirdat等目录dirprm放参数文件dirdat放 trail 文件。如果目录已存在会提示already exists不影响。然后配全局参数文件GLOBALSGGSCI (test1) 2 edit params ./GLOBALS内容GGSCHEMA goldengate CHECKPOINTTABLE goldengate.ggschkpt SYSLOG NONEGGSCHEMA指定 OGG 在数据库里的 schemaCHECKPOINTTABLE指定 checkpoint 表名SYSLOG NONE是关掉系统日志输出避免日志文件被 OGG 消息刷爆。两端都要配且GGSCHEMA和CHECKPOINTTABLE必须一致。用goldengate用户登录数据库并创建 checkpoint 表GGSCI (test1) 4 dblogin userid goldengate password goldengate GGSCI (test1 as goldengatetest1) 6 add CHECKPOINTTABLE goldengate.ggschkptadd CHECKPOINTTABLE会在数据库里建一张ggschkpt表记录每个进程的检查点。两端都要执行表名跟GLOBALS里写的一致。4.2 MGR 进程配置与启动MGR 是 OGG 的管理进程负责启动、停止、监控其他进程。编辑参数GGSCI (test1 as goldengatetest1) 7 edit params mgr内容PORT 7809 DYNAMICPORTLIST 7800-7810 USERID goldengate,PASSWORD goldengate AUTORESTART ER *,RETRIES 3, WAITMINUTES 5, RESETMINUTES 60 LAGREPORTMINUTES 10 LAGCRITICALMINUTES 10 PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 12 PURGEDDLHISTORY MINKEEPDAYS 7, MAXKEEPDAYS 14, FREQUENCYHOURS 3 PURGEMARKERHISTORY MINKEEPDAYS 7, MAXKEEPDAYS 14, FREQUENCYHOURS 3PORT 7809是 MGR 监听端口DataPump 投递时连的就是这个端口。DYNAMICPORTLIST是动态端口范围Extract 和 Replicat 之间通信会用。AUTORESTART ER *是自动重启所有 ER 进程RETRIES 3表示最多重试 3 次WAITMINUTES 5是每次重试间隔 5 分钟RESETMINUTES 60是 60 分钟后重置重试计数。PURGEOLDEXTRACTS是自动清理 trail 文件MINKEEPHOURS 12表示至少保留 12 小时防止还没投递完就被删。启动 MGRGGSCI (test1 as goldengatetest1) 8 start mgr两端都要启动目标端 MGR 端口也是 7809DataPump 参数里RMTHOST指定的就是目标端 IP 和这个端口。4.3 源端 Extract 与 DataPump 配置先建测试表并加主键SQL create table t1 as select * from dba_objects; SQL alter table t1 add constraint pk_id primary key(object_id);然后加表级附加日志GGSCI (test1) 3 dblogin userid goldengate password goldengate GGSCI (test1 as goldengatetest1) 13 add trandata test.t1add trandata是给表加附加日志有主键的表直接加没主键的表要指定列。输出里Logging of supplemental redo data enabled for table TEST.T1表示成功。配 Extract 进程参数GGSCI (test1) 1 edit param extgsxf内容EXTRACT extgsxf SETENV (ORACLE_HOME/u01/app/oracle/product/11.2.0/db_1) SETENV (ORACLE_SIDtest1) SETENV (NLS_LANGAMERICAN_AMERICA.AL32UTF8) USERID goldengate,PASSWORD goldengate EXTTRAIL ./dirdat/gs TRANLOGOPTIONS LOGRETENTION DISABLED BR ,BRINTERVAL 20M TRANLOGOPTIONS BUFSIZE 2048000 GETREPLICATES CACHEMGR CACHESIZE 2GB GETTRUNCATES DDL INCLUDE MAPPED , OBJTYPE TABLE INCLUDE MAPPED OBJTYPE INDEX DDLOPTIONS ADDTRANDATA RETRYOP RETRYDELAY 10 MAXRETRIES 10 DDLOPTIONS REPORT DISCARDFILE ./dirrpt/extgsxf.dsc,APPEND,MEGABYTES 1000 DISCARDROLLOVER AT 6:00 REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 1 HOURS,RATE FETCHOPTIONS FETCHPKUPDATECOLS REPORT AT 0:01 FETCHOPTIONS MISSINGROW ABEND STATOPTIONS REPORT FETCHWARN LONGTRANS 1H,CHECKINTERVAL 10m DYNAMICRESOLUTION TABLE test.*;SETENV里的ORACLE_HOME和ORACLE_SID必须跟源库一致NLS_LANG要跟数据库字符集匹配不然中文数据会乱码。EXTTRAIL ./dirdat/gs是本地 trail 路径TRANLOGOPTIONS LOGRETENTION DISABLED是关掉 log retention避免源库归档被 OGG 锁住。BR ,BRINTERVAL 20M是 Bounded Recovery20 分钟一个间隔防止长事务把内存撑爆。CACHEMGR CACHESIZE 2GB是缓存大小大事务多的话可以调大。DDL INCLUDE MAPPED是同步 DDLDDLOPTIONS ADDTRANDATA是自动加附加日志。添加并启动 ExtractGGSCI (test1) 2 add extract extgsxf tranlog, begin now GGSCI (test1) 3 add exttrail ./dirdat/gs, extract extgsxf, megabytes 1024 GGSCI (test1 as goldengatetest1) 56 start extgsxfadd extract ... tranlog, begin now表示从当前时间开始抽 redoadd exttrail绑定 trail 路径和大小megabytes 1024是每个 trail 文件 1GB。配 DataPump 进程GGSCI (test1 as goldengatetest1) 60 edit param dpgskf内容EXTRACT dpgskf PASSTHRU DYNAMICRESOLUTION RMTHOST 10.0.100.141,MGRPORT 7809 RMTTRAIL ./dirdat/gs DISCARDFILE ./dirrpt/dpgskf.dsc,APPEND,MEGABYTES 100 DISCARDROLLOVER AT 6:00 REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 1 HOURS,RATE TABLE test.*;PASSTHRU表示不做任何转换直接投递RMTHOST是目标端 IPMGRPORT 7809是目标端 MGR 端口RMTTRAIL是目标端 trail 路径。添加并启动 DataPumpGGSCI (test1 as goldengatetest1) 61 add extract dpgskf, exttrailsource ./dirdat/gs GGSCI (test1 as goldengatetest1) 62 add RMTTRAIL ./dirdat/gs, extract dpgskf, megabytes 1024 GGSCI (test1 as goldengatetest1) 63 start dpgskf4.4 目标端 Replicat 配置目标端配 ReplicatGGSCI (test2 as goldengatetest1) 13 edit param repgs1内容REPLICAT repgs1 SETENV (ORACLE_HOME /u01/app/oracle/product/11.2.0/db_1) SETENV (ORACLE_SID test1) SETENV (NLS_LANG AMERICAN_AMERICA.AL32UTF8) USERID goldengate password goldengate ASSUMETARGETDEFS DBOPTIONS DEFERREFCONST DBOPTIONS SUPPRESSTRIGGERS DISCARDFILE ./dirrpt/repgs1.dsc, APPEND, MEGABYTES 1000 DISCARDROLLOVER AT 6:00 REPERROR (DEFAULT, ABEND) DDL INCLUDE MAPPED , OBJTYPE TABLE INCLUDE MAPPED OBJTYPE INDEX DDLOPTIONS REPORT REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 30 MINUTES, RATE REPORT AT 0:01 STATOPTIONS RESETREPORTSTATS NUMFILES 150 GETTRUNCATES DYNAMICRESOLUTION ALLOWNOOPUPDATES GROUPTRANSOPS 1000 MAP test.* , TARGET test.*;ASSUMETARGETDEFS表示源和目标表结构一致不用单独传定义文件。DBOPTIONS DEFERREFCONST是延迟约束检查SUPPRESSTRIGGERS是屏蔽触发器防止同步时触发器重复执行。REPERROR (DEFAULT, ABEND)是遇到错误直接终止方便排查。GROUPTRANSOPS 1000是每 1000 个操作提交一次提高性能。添加并启动 ReplicatGGSCI (test2 as goldengatetest1) 20 add replicat repgs1, exttrail ./dirdat/gs, checkpointtable goldengate.ggschkpt GGSCI (test2 as goldengatetest1) 21 start replicat repgs15. 避坑与排查OGG 跨平台同步的 5 个血泪教训5.1 Extract 启动报 OGG-00868现象start extgsxf后进程立刻 ABENDggserr.log里写OGG-00868 Oracle GoldenGate Capture for Oracle, extgsxf.prm: Missing supplemental log data。原因源库没开附加日志或者开了但没切日志当前 redo 里没有前像信息。解决确认v$database里SUPPLEMENTAL_LOG_DATA_MIN是 YES然后alter system switch logfile切一次再add trandata给表加附加日志。5.2 DataPump 投递报 OGG-01224现象dpgskf进程运行但目标端收不到数据ggserr.log里写OGG-01224 TCP/IP error 111 (Connection refused)。原因目标端 MGR 没启动或者防火墙挡了 7809 端口。解决目标端start mgr然后telnet 目标IP 7809确认端口通。跨平台场景下 Windows 防火墙和 Linux iptables 都要放行。5.3 Replicat 报 ORA-01403 或 OGG-01161现象Replicat 进程 ABEND报ORA-01403: no data found或OGG-01161 Bad column index。原因源和目标表结构不一致或者ASSUMETARGETDEFS用错了。跨平台同步时 Windows 和 Linux 的 Oracle 字符集可能不同导致列长度解释不一致。解决确认两端NLS_LANG和数据库字符集一致表结构用desc比对。如果结构确实不同去掉ASSUMETARGETDEFS改用SOURCEdefs文件。5.4 中文数据乱码现象源端插入中文目标端查出来是问号或乱码。原因源端和目标端NLS_LANG不一致或者 OGG 参数里没设SETENV (NLS_LANG...)。解决两端 OGG 参数文件里都加SETENV (NLS_LANGAMERICAN_AMERICA.AL32UTF8)跟数据库字符集匹配。Windows 端要注意NLS_LANG格式是AMERICAN_AMERICA.AL32UTF8不是SIMPLIFIED CHINESE_CHINA.AL32UTF8。5.5 长事务导致 Extract 延迟现象Extract 的LAG越来越大ggserr.log里写Long transaction detected。原因源库有大事务长时间不提交OGG 要把整个事务缓存在内存或磁盘超过CACHEMGR CACHESIZE就会写临时文件性能骤降。解决调大CACHEMGR CACHESIZE或者配LONGTRANS 1H,CHECKINTERVAL 10m让 OGG 定期检查长事务。根本办法是让应用拆小事务。6. 装完怎么验证从初始化数据到增量同步的完整测试装完不验证等于没装。我一般按“初始化数据 → 增量插入 → 删除 → truncate”四步走每步都在源端操作、目标端查结果。先看源端当前 SCNSQL select to_char(current_scn) from v$database; CURRENT_SCN ----------- 1085057用expdp导出源表带上flashback_scnexpdp test/test TABLEStest.t1 DUMPFILEt1.dmp flashback_scn1085057把 dump 文件拷到目标端用impdp导入impdp test/test dumpfilet1.dmp然后目标端启动 Replicat指定aftercsnGGSCI (test2 as goldengatetest1) 20 start replicat repgs1,aftercsn 1085057aftercsn表示从指定 SCN 之后开始复制这样初始化数据和增量数据不会重叠。增量测试第一步源端插入SQL insert into t1 (object_id) values(87366); SQL commit;目标端查SQL select max(object_id) from test.t1; MAX(OBJECT_ID) -------------- 87366第二步源端删除SQL delete from t1 where object_id87366; SQL commit;目标端查SQL select max(object_id) from test.t1; MAX(OBJECT_ID) -------------- 87365第三步源端 truncateSQL truncate table t1;目标端查SQL select count(*) from test.t1; COUNT(*) ---------- 0三步都过说明 Extract、DataPump、Replicat 链路全通。最后看ggserr.log有没有 ERROR我一般会tail -f ggserr.log盯几分钟确认没有反复重试或 ABEND。从那以后我每次配完 OGG都强制走一遍这四步验证哪怕客户催着上线也不跳过——初始化数据没对齐后面增量全是脏数据回滚比重配还麻烦。希望帮到你。本文还有配套的精品资源点击获取