资讯详情

Oracle GoldenGate跨平台同步实战:Windows到Linux的OGG部署与避坑指南

📅 2026/10/11 14:22:02 | 华诺云谱 👁 阅读
Oracle GoldenGate跨平台同步实战:Windows到Linux的OGG部署与避坑指南
简介这份PDF文档面向Oracle DBA与数据同步运维人员系统讲解如何用Oracle GoldenGate 12.2.0.2实现Windows源库到Linux目标库的跨平台数据同步适合具备一定Oracle基础、需要落地异构环境实时复制方案的技术人员参考。资源包仅含1个PDF文件约496KB内容以图文与命令片段结合的方式组织涵盖源库与目标库的归档模式、强制日志、附加日志及goldengate用户赋权等准备配置并延伸至OGG解压安装、Manager、Extractor与Replicat组件配置以及监控、日志管理与故障排查思路。文档结构按概述、准备、安装、组件配置、监控维护、总结分层展开便于按步骤对照实操。目前已有295人学习可作为跨系统OGG部署的速查手册与排错参考。1. 跨平台 OGG 同步从 Windows 到 Linux 的落地路径手里有一套 Windows 上的 Oracle 业务库现在要迁到 Linux 服务器上还要求迁移期间业务不停、数据不丢——这种场景下Oracle GoldenGateOGG几乎是绕不开的选择。它做的是基于日志的实时复制源端抽取、目标端投递中间通过 trail 文件解耦天然适合异构操作系统之间的数据同步。这次我拆的这套资料核心就是 OGG 12.2.0.2 在 Windows 源库到 Linux 目标库之间的完整部署流程从数据库归档配置、附加日志开启到 Extract、DataPump、Replicat 三类进程的搭建再到初始化数据 dump 和增量验证每一步都有可复现的命令和参数。适合正在做 Oracle 跨平台迁移、异构容灾或者实时数据同步的 DBA 和运维工程师尤其是那些第一次接触 OGG、被各种进程配置绕晕的人。下面按实际动手顺序把这份资源里的关键步骤和参数逐个拆开讲。2. 源库与目标库的前置配置归档、附加日志和 OGG 专用用户OGG 能抽取增量数据的前提是源库的 redo 日志里记录了足够的信息。如果归档没开、附加日志没加Extract 进程启动后要么报错要么抽出来的数据缺列同步过去就是脏数据。所以数据库层面的配置是第一步也是最不能省的一步。2.1 源库开启归档与强制日志源库必须处于归档模式否则 OGG 无法持续读取在线日志。操作顺序是先停到 mount 状态改归档模式再打开SQL shutdown immediate; SQL startup mount; SQL alter database archivelog; SQL alter database open;归档开完之后还要强制记录日志。这个参数的作用是让所有操作都写 redo包括那些平时可能被优化掉的 nologging 操作SQL alter database force logging;然后是附加日志。附加日志的作用是在 redo 里补充主键、唯一索引等列的前镜像信息Replicat 端才能准确定位到要更新的行SQL alter database add supplemental log data;执行完用下面这条语句确认两个关键参数都是 YESSQL select SUPPLEMENTAL_LOG_DATA_MIN, FORCE_LOGGING from v$database;如果 SUPPLEMENTAL_LOG_DATA_MIN 显示 NO说明附加日志没生效需要切一次日志SQL alter system switch logfile;注意附加日志分数据库级和表级。数据库级是基础表级用add trandata单独加。如果只开了数据库级但没加表级DDL 同步和某些更新操作仍然可能丢数据。2.2 创建 OGG 专用用户并授权OGG 需要一个独立的数据库用户来连接和操作不建议直接用 sys 或业务用户。源库和目标库都要建但权限略有差异。源库建用户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 管理员所需的全部权限比手动一条条 grant 靠谱得多。最后还要打开 OGG 复制开关SQL alter system set enable_goldengate_replication true scopeboth;目标库的建用户语句基本一致但不需要开附加日志额外需要 DML 权限SQL grant insert any table, update any table, delete any table to goldengate; SQL alter system set enable_goldengate_replication true scopeboth;这里有个容易翻车的地方目标库的enable_goldengate_replication也要开很多人只记得源库开结果 Replicat 进程启动时报 OGG-误排查半天才发现是目标库参数没设。2.3 初始化 OGG 目录与全局参数数据库配好后进入 OGG 安装目录用 ggsci 命令行做初始化。源端和目标端都要执行[oracletest1 ogg]$ ./ggsci GGSCI (test1) 1 create subdirs这个命令会在当前目录下创建 dirprm、dirrpt、dirchk、dirdat 等子目录分别存放参数文件、报告、检查点和 trail 文件。如果目录已存在会提示 already exists不影响。接着配置全局参数文件 GLOBALS源端和目标端都要编辑GGSCI (test1) 2 edit params ./GLOBALS GGSCHEMA goldengate CHECKPOINTTABLE goldengate.ggschkpt SYSLOG NONEGGSCHEMA 指定 OGG 在数据库中的 schemaCHECKPOINTTABLE 指定检查点表名。这个表用来记录 OGG 进程读到哪个位置是断点续传的关键。配完后用 goldengate 用户登录数据库并创建检查点表GGSCI (test1) 4 dblogin userid goldengate password goldengate GGSCI (test1 as goldengatetest1) 6 add CHECKPOINTTABLE goldengate.ggschkptMGR 进程是 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 12PORT 是 MGR 监听端口DYNAMICPORTLIST 是动态端口范围DataPump 投递时会从这里选端口。AUTORESTART 让进程异常退出后自动重试生产环境建议保留。PURGEOLDEXTRACTS 自动清理过期的 trail 文件MINKEEPHOURS 12 表示至少保留 12 小时防止还没投递完就被删掉。配完启动 MGRGGSCI (test1 as goldengatetest1) 8 start mgr源端和目标端都看到Manager started.才算正常。3. 配置 Extract、DataPump 与 Replicat三类进程的拆解与参数说明OGG 的进程模型是链式的Extract 从源库抽数据写到本地 trailDataPump 把本地 trail 投递到目标端Replicat 从目标端 trail 读数据应用到目标库。三个进程各管一段任何一段断了整条链路就停。这一章把每个进程的配置文件和关键参数逐个拆开。3.1 源端 Extract 进程配置先建一张测试表方便后面验证SQL create table t1 as select * from dba_objects; SQL alter table t1 add constraint pk_id primary key(object_id);然后给表加 trandata也就是表级附加日志GGSCI (test1) 3 dblogin userid goldengate password goldengate GGSCI (test1 as goldengatetest1) 13 add trandata test.t1如果表没有主键或唯一索引add trandata会报错需要手动指定一个或多个列作为主键。这一步不做Extract 启动后遇到更新操作会报 OGG-误。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 FETCHWARNLONGTRANS 1H, CHECKINTERVAL 10m DYNAMICRESOLUTION TABLE test.*;几个关键参数逐个说EXTTRAIL ./dirdat/gs指定本地 trail 文件的前缀Extract 写到这里DataPump 从这里读。TRANLOGOPTIONS LOGRETENTION DISABLED关闭日志保留。如果源库归档空间紧张这个参数能避免 OGG 自己保留归档日志。BR, BRINTERVAL 20M开启 Bounded Recovery每 20 分钟做一次边界恢复检查点。长事务场景下这个参数很重要能在进程崩溃后快速恢复不用从头重抽。CACHEMGR CACHESIZE 2GB缓存大小。大事务多的时候适当调大避免写临时文件拖慢速度。GETTRUNCATES同步 truncate 操作。不开的话源端 truncate 了目标端不会跟着清。DDL INCLUDE MAPPED同步 DDL。需要配合前面执行的 ddl_setup 脚本和 marker 表。FETCHOPTIONS MISSINGROW ABEND如果更新时找不到对应的行直接终止进程而不是跳过。生产环境建议 ABEND避免数据不一致被忽略。DYNAMICRESOLUTION动态解析表结构表多的时候能加快启动速度。添加并启动 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 extgsxftranlog, begin now表示从当前时刻开始抽在线日志。megabytes 1024是单个 trail 文件的大小超过就滚动到下一个文件。3.2 源端 DataPump 进程配置DataPump 负责把本地 trail 投递到目标端。它不连数据库只做文件传输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透传模式DataPump 不做任何转换直接把 Extract 写的 trail 转发到目标端。这是标准做法转换逻辑应该放在 Extract 或 Replicat 里。RMTHOST 10.0.100.141, MGRPORT 7809目标端 IP 和 MGR 端口。这里填的是目标库所在 Linux 服务器的地址。RMTTRAIL ./dirdat/gs目标端的 trail 路径。注意这是目标端 OGG 目录下的相对路径。添加并启动GGSCI (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 dpgskfexttrailsource指定 DataPump 从哪个本地 trail 读RMTTRAIL指定写到目标端的哪个 trail。两个路径名可以一样但概念上一个是源一个是目标。3.3 目标端 Replicat 进程配置Replicat 从目标端 trail 读数据解析成 SQL 应用到目标库GGSCI (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假设源端和目标端表结构一致不需要 defgen 生成定义文件。如果两边表结构不同这个参数不能加。DBOPTIONS DEFERREFCONST延迟约束检查避免因为外键顺序导致插入失败。DBOPTIONS SUPPRESSTRIGGERS抑制目标端触发器。如果目标表上有触发器复制过来的数据会再次触发造成重复操作。REPERROR (DEFAULT, ABEND)遇到错误直接终止不跳过。生产环境必须这样否则数据丢了都不知道。GROUPTRANSOPS 1000每 1000 个操作组成一个事务提交减少提交次数提升性能。MAP test.*, TARGET test.*表映射。源端 test schema 下的所有表映射到目标端 test schema。添加并启动GGSCI (test2 as goldengatetest1) 14 add replicat repgs1, exttrail ./dirdat/gs, checkpointtable goldengate.ggschkpt GGSCI (test2 as goldengatetest1) 15 start replicat repgs1到这里增量同步链路就通了。源端对 t1 表的增删改几秒内会同步到目标端。4. 初始化数据同步dump 与 OGG 两种方式的取舍增量链路配好了但源端已有的历史数据还没过去。初始化数据同步有两种做法一种是用 expdp/impdp 做静态 dump另一种是用 OGG 的 initial load 功能。两种方式各有适用场景选错了要么锁表影响业务要么数据对不上。4.1 expdp flashback_scn 方式这是最常用的方式适合源表可以短暂锁定的场景。核心思路是先记下当前 SCN用 expdp 导出这个 SCN 下的数据导入目标端后让 Replicat 从这个 SCN 之后开始应用增量。查当前 SCNSQL select to_char(current_scn) from v$database; CURRENT_SCN ----------- 1085057导出时指定 flashback_scn保证导出的是那个时间点的数据expdp test/test TABLEStest.t1 DUMPFILEt1.dmp flashback_scn1085057dump 文件拷到目标端后导入impdp test/test dumpfilet1.dmp然后启动 Replicat指定 aftercsnGGSCI (test2 as goldengatetest1) 20 start replicat repgs1, aftercsn 1085057aftercsn告诉 Replicat 从 1085057 之后的增量开始应用这样 dump 里的数据和增量数据正好衔接不会重复也不会丢。注意expdp 导出期间源表如果有 DDL 操作flashback_scn 可能对不上。生产环境建议在业务低峰期做或者配合 OGG 的 DDL 同步一起用。4.2 OGG initial load 方式如果源表不能锁或者数据量特别大expdp 跑不完可以用 OGG 自带的 initial load。它的原理是起一个特殊的 Extract 进程直接用 SQL 查询源表并写到远程 trail目标端用特殊 Replicat 直接加载。源端配置 initial ExtractGGSCI (test1) 1 edit param init_t1 EXTRACT init_t1 USERID ogg, PASSWORD ogg RMTHOST 10.1.200.99, MGRPORT 7809 RMTFILE ./dirdat/i1, maxfiles 999, megabytes 500 TABLE TEST1.TEST1, SQLPREDICATE AS OF SCN 2497559;SQLPREDICATE AS OF SCN 2497559是关键它让查询读到指定 SCN 的一致性数据。RMTFILE指定远程 trail 文件maxfiles 999 表示最多 999 个文件每个 500MB。目标端配置 initial ReplicatGGSCI (localhost) 1 ADD replicat ri1, specialrun GGSCI (localhost) 2 edit params ri1 SPECIALRUN END RUNTIME REPLICAT ri1 USERID goldengate, PASSWORD oggpwd EXTFILE ./dirdat/i1 MAP TEST1.TEST1, TARGET TEST1.TEST1;SPECIALRUN表示这是一次性任务跑完自动结束。END RUNTIME让 Replicat 处理完 trail 里的数据就退出不会一直挂着。启动顺序GGSCI start EXTRACT init_t1 ./replicat paramfile dirprm/ri1.prm GGSCI start replicat rp1, aftercsn 2497559先起 initial Extract 抽数据再手动跑一次 replicat 加载最后起常规 Replicat 应用增量。这个方式不需要 expdp但配置比 dump 方式复杂适合有经验的人用。4.3 增量验证insert、delete、truncate 三步确认初始化做完后必须验证增量同步是否正常。在源端做三类操作目标端确认结果。插入验证-- 源端 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) -------------- 87365truncate 验证-- 源端 SQL truncate table t1; -- 目标端 SQL select count(*) from test.t1; COUNT(*) ---------- 0三步都通过说明 Extract、DataPump、Replicat 链路正常truncate 也同步过去了。如果 truncate 没同步检查 Extract 和 Replicat 参数里有没有加GETTRUNCATES。5. 避坑与排查OGG 部署中最容易翻车的五个点OGG 的坑大多不在配置本身而在环境差异和参数遗漏。下面这五个是我在实际部署中反复遇到的每个都按现象、原因、解决来写。5.1 Extract 启动报 OGG-误提示无法找到表现象start extgsxf后进程立刻 ABENDggserr.log 里报 OGG-误说 table not found 或 no unique key。原因表没有主键或唯一索引add trandata没加成功或者加了但没生效。解决先用info trandata test.t1确认附加日志状态。如果没有主键手动指定列add trandata test.t1, cols(object_id)。加完后切一次日志alter system switch logfile再重启 Extract。5.2 DataPump 投递失败目标端收不到 trail现象Extract 正常写本地 trail但目标端 dirdat 目录下没有文件DataPump 报告连接超时。原因目标端 MGR 没启动或者防火墙挡了 7809 端口或者 RMTHOST 里的 IP 写错了。解决先在源端telnet 目标IP 7809确认端口通不通。不通就检查目标端 MGR 是否在跑info mgr以及防火墙规则。如果 MGR 正常但端口不通大概率是防火墙。5.3 Replicat 报 OGG-误提示唯一键冲突现象Replicat 应用增量时频繁报 unique key violation进程 ABEND。原因初始化数据没对齐。expdp 的 flashback_scn 和 Replicat 的 aftercsn 不一致导致 dump 里已经有的数据又被增量插了一遍。解决确认 expdp 用的 SCN 和start replicat, aftercsn用的是同一个值。如果已经不一致需要重新做初始化停 Replicat清目标表重新 dump 和导入再用正确的 aftercsn 启动。5.4 DDL 同步不生效目标端表结构没变现象源端加了一列目标端表结构没跟着变Replicat 报 invalid column。原因ddl_setup 脚本没执行或者 marker 表没建或者 Extract 参数里没加DDL INCLUDE MAPPED。解决在源端用 sys 执行/u01/app/ogg/marker_setup和/u01/app/ogg/ddl_setup然后/u01/app/ogg/ddl_enable。确认 Extract 和 Replicat 参数里都有DDL INCLUDE MAPPED。执行ddl_pin goldengate把 DDL 相关对象 pin 到共享池提升性能。5.5 目标端数据比源端少但进程状态正常现象info all显示所有进程 RUNNING但目标端 count 比源端少。原因Replicat 参数里REPERROR (DEFAULT, ABEND)没加遇到错误跳过了。或者GROUPTRANSOPS设得太大事务还没提交。解决检查 Replicat 参数确保REPERROR (DEFAULT, ABEND)存在。查 ggserr.log 里有没有被跳过的错误记录。如果是 GROUPTRANSOPS 的问题等一会儿再看或者调小这个值。6. 进阶技巧用 info 和 stats 快速定位同步延迟OGG 跑起来之后日常运维最关心的是两件事进程有没有挂同步延迟有多大。ggsci 里的info和stats命令能覆盖大部分场景但很多人只会用info all遇到延迟问题就不知道从哪查了。先看进程状态GGSCI (test1 as goldengatetest1) 1 info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT RUNNING EXTGSXF 00:00:00 00:00:03 EXTRACT RUNNING DPGSKF 00:00:00 00:00:01Lag at Chkpt 是检查点延迟00:00:00 表示没有积压。如果这个值持续增大说明同步跟不上源端的变化速度。看 Extract 的详细统计GGSCI stats extgsxf, total Extract Statistics for EXTGSXF Extracts Started: 1 Records Processed: 86264 Records Extracted: 86264 Bytes Extracted: 12582912Records Processed 和 Records Extracted 应该相等。如果 Processed 远大于 Extracted说明有大量记录被过滤掉了检查 TABLE 映射是不是写窄了。看 Replicat 的统计GGSCI stats repgs1, total Replicat Statistics for REPGS1 Records Processed: 86264 Records Applied: 86264Applied 和 Processed 相等才正常。如果 Applied 小于 Processed说明有操作被跳过或报错了查 ggserr.log。还有一个实用技巧用send命令动态调整参数不用重启进程。比如发现 Extract 延迟大临时调大缓存GGSCI send extgsxf, cachecages 4或者让 Replicat 报告当前正在处理的事务GGSCI send repgs1, report这个命令会触发一次即时报告写到 dirrpt 目录下能看到当前读到哪个 trail 文件、哪个位置。日志文件 ggserr.log 在 OGG 根目录下所有进程的报错和警告都在里面。排查问题时先看这个文件的最后 50 行大部分错误都能直接定位。我一般会配一个定时任务每小时 grep 一次 ERROR 和 WARNING有异常就发邮件。从那以后我每次部署 OGG都会在启动所有进程后先跑一遍info all和stats确认三个进程都是 RUNNING 且统计数字对得上再去做增量验证。这个习惯帮我省了很多事后排查的时间。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑