
1. 项目缘起为什么在Oracle 19c时代GoldenGate依然不可或缺最近在帮一个客户做数据中台架构升级核心数据库从Oracle 11g迁移到了19c。迁移本身很顺利但随之而来的一个“历史遗留”问题摆在了面前原先依赖Oracle Streams实现的几个关键业务系统的实时数据同步在19c上彻底不兼容了。客户的需求很明确需要一个稳定、高效、对源库影响小并且能支持异构环境未来可能对接Kafka、MySQL的实时数据同步方案。几乎没有太多犹豫我和团队就把目光投向了Oracle GoldenGateOGG。尽管现在开源CDC工具和云服务层出不穷但在复杂的Oracle-to-Oracle尤其是涉及大量DDL变更和业务高可用的场景下OGG依然是那个最“扛打”的老兵。你可能听说过OGG知道它很强大但也被其复杂的安装和配置过程劝退过。网上的教程要么年代久远对应老版本Oracle要么步骤跳跃关键细节一笔带过照着做十有八九会卡在某个环节。这次我就以在Oracle Linux 7.9上为Oracle Database 19c单机非RAC环境部署OGG 19c为例把从零开始安装、配置核心进程、到实现基础单向同步的完整链路连同我踩过的那些“坑”毫无保留地拆解给你。这不是一个简单的命令罗列而是一个资深DBA/架构师在真实生产环境下的实战复盘。你会发现只要理解了其核心逻辑和几个关键检查点OGG的部署并没有想象中那么可怕。2. 战前准备理解OGG架构与部署规划在动手敲命令之前我们必须先搞清楚OGG到底是怎么工作的以及我们打算把它部署成什么样子。盲目安装是灾难的开始。2.1 GoldenGate核心进程拆解你可以把OGG想象成一个高效的数据“搬运工翻译官”组合。它主要依赖两类进程抽取进程Extract驻守在源端数据库。它的工作就像矿工持续地从Oracle的重做日志Redo Log和归档日志Archive Log中“挖掘”出数据变更增、删、改以及DDL语句。它并不直接读取表数据因此对源库的性能影响极小。抽取到的数据会以一种高效的、压缩的队列格式写入到本地的“轨迹文件”Trail File中。投递进程Pump/Data Pump这是一个可选的但强烈建议使用的进程也位于源端。你可以把它理解为“快递分拣中心”。它的任务是从本地的轨迹文件中读取数据通过网络将其投递到目标端服务器。使用Pump进程的好处在于它将网络传输任务从核心的Extract进程中剥离即使网络出现波动或中断Extract进程也能不受影响地继续采集数据数据会堆积在本地轨迹文件中待网络恢复后由Pump继续发送。复制进程Replicat驻守在目标端数据库。它的角色是“装配工”负责读取从源端传送过来的轨迹文件按照相同的顺序在目标数据库中将数据变更或DDL语句重新执行一遍从而保证两端数据最终一致。本次我们的部署目标就是在同一台服务器模拟源端和目标端分离的场景但实际物理机为一台上配置一个最简单的单向同步链路从源数据库ORCL的SCOTT.EMP表同步到目标数据库ORCL的SCOTT.EMP_TARGET表。这个简单的例子足以打通全流程理解所有核心概念。2.2 环境与软件清点我的实验环境如下你的环境可能不同但核心要求一致操作系统Oracle Linux Server 7.9数据库Oracle Database 19c (19.3.0.0.0) 单机版已安装完毕并正常运行。数据库实例名ORCLGoldenGate软件Oracle GoldenGate 19.1.0.0.4 for Oracle on Linux x86-64。务必注意版本兼容性OGG 19c 可以与Oracle 11g, 12c, 18c, 19c协同工作但从官方文档选择对应版本总是最稳妥的。规划目录源端OGG安装目录/u01/app/ogg_src目标端OGG安装目录/u01/app/ogg_tgt源端轨迹文件目录/u01/app/ogg_src/dirdat目标端轨迹文件目录/u01/app/ogg_tgt/dirdat关键经验强烈建议将OGG安装在独立的文件系统或目录不要与Oracle数据库的ORACLE_HOME混在一起。这有利于权限管理、软件升级和故障隔离。轨迹文件目录dirdat所在磁盘需要预留充足空间其大小取决于数据变更量和保存周期。3. 步步为营OGG软件安装与基础环境搭建安装OGG本身并不复杂复杂的是满足其运行所需的前置条件。很多安装失败都源于此。3.1 操作系统级依赖检查与配置首先以root用户执行以下检查与配置关闭防火墙与SELinux仅用于实验环境生产环境需制定严格策略systemctl stop firewalld systemctl disable firewalld setenforce 0 # 永久关闭需修改 /etc/selinux/config设置 SELINUXdisabled安装必要的依赖包 OGG需要一些基础的系统库。使用yum安装以下包部分可能在安装Oracle时已装yum install -y glibc libaio libnsl gcc make sysstat glibc-devel libstdc-devel特别要注意compat-libcap1这个包在Oracle 19c的预检查中也可能被要求。如果你的系统没有需要找到对应版本的rpm包进行安装。这常常是安装卡壳的点。创建OGG专属用户与组可选但推荐 为了安全和管理方便我们创建一个专门运行OGG进程的用户和组。groupadd ogg useradd -g ogg -m -d /home/ogg -s /bin/bash ogg passwd ogg # 设置密码创建安装目录并授权mkdir -p /u01/app/ogg_src /u01/app/ogg_tgt chown -R ogg:ogg /u01/app/ogg_src /u01/app/ogg_tgt chmod -R 755 /u01/app/ogg_src /u01/app/ogg_tgt3.2 数据库端关键配置OGG需要与数据库深度交互因此数据库端的配置至关重要。以oracle用户登录数据库服务器进行操作。启用归档日志与强制日志记录 OGG依赖归档日志进行数据捕获因此源数据库必须开启归档模式并启用强制日志。-- 以sysdba身份登录sqlplus sqlplus / as sysdba -- 查看当前日志模式 SELECT log_mode FROM v$database; -- 如果未开启归档按以下步骤操作需在mount状态下 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; -- 启用强制日志确保所有操作包括nologging操作都记录到redo ALTER DATABASE FORCE LOGGING; -- 确认更改生效 SELECT force_logging FROM v$database;配置补充日志Supplemental Logging 这是OGG工作的基石。默认的redo日志只记录行数据被修改的事实但为了在目标端唯一地定位和重放这条修改需要记录更多信息如主键值、唯一键值。必须为需要同步的表启用最小补充日志并为表级启用主键/唯一键补充日志。-- 启用数据库级最小补充日志必须 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- 为准备同步的表SCOTT.EMP启用表级数据补充日志 -- 这里使用主键补充日志。如果表无主键需使用唯一索引或所有列补充日志但后者性能影响较大。 ALTER TABLE SCOTT.EMP ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;核心原理(PRIMARY KEY) COLUMNS意味着在redo日志中除了被修改的列还会额外记录该行主键的所有列在修改前的值。这样无论目标端该行的其他列如何变化OGG都能凭借主键值精准定位到目标行进行更新。创建OGG管理用户并授权 需要一个专门的数据库用户来管理OGG的元数据检查点、进程状态等。这个用户权限很大需妥善保管。CREATE USER oggadmin IDENTIFIED BY “YourStrongPassword123”; GRANT CONNECT, RESOURCE TO oggadmin; GRANT ALTER ANY TABLE TO oggadmin; GRANT ALTER SYSTEM TO oggadmin; GRANT SELECT ANY DICTIONARY TO oggadmin; GRANT SELECT ANY TABLE TO oggadmin; GRANT FLASHBACK ANY TABLE TO oggadmin; -- OGG 19c 需要以下关键权限 GRANT EXECUTE ON DBMS_FLASHBACK TO oggadmin; GRANT CREATE SEQUENCE TO oggadmin; -- 如果同步包含DDL还需要GRANT EXECUTE ON DBMS_GOLDENGATE_ADM TO oggadmin; 等更多权限此处暂不展开。3.3 OGG软件解压与安装现在切换到我们创建的ogg用户来安装软件。上传并解压软件包su - ogg cd /u01/app # 假设安装包已上传至当前目录 unzip 191004_fbo_ggs_Linux_x64_Oracle_services_shiphome.zip -d ogg_install运行响应文件静默安装 OGG提供了命令行静默安装方式通过响应文件指定参数非常适合自动化部署。cd /u01/app/ogg_install/fbo_ggs_Linux_x64_Oracle_services_shiphome/Disk1 ./runInstaller -silent -responseFile /u01/app/ogg_install/fbo_ggs_Linux_x64_Oracle_services_shiphome/response/oggcore.rsp -showProgress你需要编辑oggcore.rsp文件关键参数如下oracle.install.responseFileVersion/oracle/install/rspfmt_ogginstall_response_schema_v19_1_0 INSTALL_OPTIONORA19c SOFTWARE_LOCATION/u01/app/ogg_src # 源端安装目录 START_MANAGERfalse DATABASE_LOCATION/u01/app/oracle/product/19c/dbhome_1 # 你的ORACLE_HOME执行安装程序等待完成。然后用同样的方法将OGG也安装到目标端目录/u01/app/ogg_tgt。虽然源和目标在同一机器但两个独立的OGG实例有助于概念清晰也模拟了分布式部署。配置环境变量 为ogg用户配置环境变量分别指向源端和目标端的OGG Home。# 编辑 ~/.bash_profile添加以下内容 # 源端OGG环境 export OGG_HOME_SRC/u01/app/ogg_src export PATH$OGG_HOME_SRC:$PATH export LD_LIBRARY_PATH$OGG_HOME_SRC/lib:/u01/app/oracle/product/19c/dbhome_1/lib:$LD_LIBRARY_PATH # 目标端OGG环境可通过脚本切换 export OGG_HOME_TGT/u01/app/ogg_tgt # 通常一次只操作一端所以可以写两个单独的脚本 source_ogg.sh 和 target_ogg.sh 来分别设置执行source ~/.bash_profile使环境变量生效。4. 核心配置实战构建你的第一条数据同步链路软件就绪现在进入最关键的配置环节。我们将在源端配置Extract和Pump进程在目标端配置Replicat进程。4.1 源端OGG管理器与Extract进程配置首先切换到源端OGG环境。启动GGSCI命令行并创建子目录cd $OGG_HOME_SRC ./ggsci GGSCI CREATE SUBDIRS这个命令会创建dirchk,dirpcs,dirrpt,dirdat等子目录用于存放检查点文件、进程状态、报告和轨迹文件。配置全局参数GLOBALSGGSCI EDIT PARAMS ./GLOBALS输入以下内容保存退出。这里指定了检查点表所用的schema方便后续管理。GGSCHEMA oggadmin配置管理器进程MGR 管理器进程是OGG的控制中心负责启动、监控和管理其他进程。GGSCI EDIT PARAMS MGR输入以下配置PORT 7809 DYNAMICPORTLIST 7810-7820 PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 2 LAGREPORTHOURS 1 LAGINFOMINUTES 30 LAGCRITICALMINUTES 45PORT: 指定MGR监听端口。DYNAMICPORTLIST: 动态端口范围供其他进程通信使用。PURGEOLDEXTRACTS: 自动清理旧的轨迹文件策略USECHECKPOINTS表示只清理已被所有进程处理完的文件MINKEEPHOURS表示至少保留2小时。LAG相关参数设置延迟报告阈值超过设定时间会生成警告或严重警告。启动管理器进程GGSCI START MGR GGSCI INFO MGR查看状态确认为RUNNING。在数据库中创建检查点表 检查点表用于持久化Extract和Replicat进程的读取和提交位置是进程恢复的关键。GGSCI DBLOGIN USERID oggadminORCL, PASSWORD “YourStrongPassword123” GGSCI ADD CHECKPOINTTABLE oggadmin.checkpointtabORCL是Oracle的本地网络服务名确保你的tnsnames.ora配置正确或使用EZConnect语法如//localhost:1521/ORCL。配置主抽取进程Extract 我们创建一个名为EXTORA的进程负责初始加载和后续增量抽取。GGSCI ADD EXTRACT EXTORA, INTEGRATED TRANLOG, BEGIN NOW GGSCI EDIT PARAMS EXTORA参数文件内容EXTRACT EXTORA SETENV (NLS_LANG “AMERICAN_AMERICA.AL32UTF8”) SETENV (ORACLE_SID “ORCL”) USERID oggadminORCL, PASSWORD “YourStrongPassword123” EXTTRAIL ./dirdat/et -- 需要捕获DDL的话需额外配置此处仅同步DML TABLE SCOTT.EMP;INTEGRATED TRANLOG: 使用集成捕获模式这是Oracle 11.2.0.4之后推荐的方式性能更好直接与数据库日志挖掘服务交互。BEGIN NOW: 从添加进程的时刻开始抓取变化。如果是初始化历史数据可能需要指定SCN或时间点。EXTTRAIL: 指定本地轨迹文件的前缀和路径。文件会自动命名为et000000,et000001...为Extract进程添加本地轨迹文件GGSCI ADD EXTTRAIL ./dirdat/et, EXTRACT EXTORA, MEGABYTES 100这表示轨迹文件每个最大100MB写满后自动滚动到下一个。配置投递进程Pump 虽然源和目标在同一主机但我们依然配置Pump进程来模拟标准流程。GGSCI ADD EXTRACT PUMPORA, EXTTRAILSOURCE ./dirdat/et, BEGIN NOW GGSCI EDIT PARAMS PUMPORA参数文件内容EXTRACT PUMPORA SETENV (NLS_LANG “AMERICAN_AMERICA.AL32UTF8”) RMTHOST localhost, MGRPORT 7809 RMTTRAIL ./dirdat/rt PASSTHRU TABLE SCOTT.EMP;RMTHOST: 目标端MGR的主机和端口。因为是本地所以用localhost。RMTTRAIL: 指定在目标端的轨迹文件路径和前缀。注意这个路径是目标端OGG实例视角的路径。PASSTHRU: 指示Pump进程不对数据做任何转换直接传递。这能提升性能。在目标端为Pump进程添加远程轨迹文件 这个命令需要在目标端的GGSCI中执行。我们先切换到目标端环境假设通过另一个终端或脚本。# 在另一个终端或切换环境变量后 cd $OGG_HOME_TGT ./ggsci GGSCI ADD RMTTRAIL ./dirdat/rt, EXTRACT PUMPORAlocalhost, MEGABYTES 100EXTRACT PUMPORAlocalhost指明了这个远程轨迹文件由源端名为PUMPORA的进程投递。4.2 目标端OGG管理器与Replicat进程配置现在配置目标端OGG来接收和应用数据。启动目标端管理器并创建子目录cd $OGG_HOME_TGT ./ggsci GGSCI CREATE SUBDIRS GGSCI EDIT PARAMS ./GLOBALS GGSCHEMA oggadmin GGSCI EDIT PARAMS MGR PORT 7909 # 使用与源端不同的端口 DYNAMICPORTLIST 7910-7920 PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 2 GGSCI START MGR配置检查点表GGSCI DBLOGIN USERID oggadminORCL, PASSWORD “YourStrongPassword123” GGSCI ADD CHECKPOINTTABLE oggadmin.checkpointtab在目标库创建测试表 确保目标表存在。表结构最好与源表一致。-- 在目标数据库执行 CREATE TABLE SCOTT.EMP_TARGET AS SELECT * FROM SCOTT.EMP WHERE 10; -- 或者确保有相同结构的表配置复制进程Replicat 我们使用集成应用模式性能更优。GGSCI ADD REPLICAT REPORA, INTEGRATED, EXTTRAIL ./dirdat/rt, BEGIN NOW GGSCI EDIT PARAMS REPORA参数文件内容REPLICAT REPORA SETENV (NLS_LANG “AMERICAN_AMERICA.AL32UTF8”) SETENV (ORACLE_SID “ORCL”) USERID oggadminORCL, PASSWORD “YourStrongPassword123” ASSUMETARGETDEFS MAP SCOTT.EMP, TARGET SCOTT.EMP_TARGET;INTEGRATED: 使用集成应用模式。ASSUMETARGETDEFS: 假设目标端表定义与源端一致。如果结构不同需要使用SOURCEDEFS参数指定源端的定义文件。MAP: 定义源表和目标表的映射关系。这是OGG配置的核心语法。5. 启动、测试与排错验证你的同步链路配置完成后激动人心的启动和测试环节来了。5.1 按顺序启动进程启动顺序很重要目标端Replicat要在源端Extract和Pump之前启动以避免一开始就丢失数据。但更常见的流程是先启动源端捕获再启动目标端应用。启动源端Extract和Pump# 在源端GGSCI GGSCI START EXTRACT EXTORA GGSCI START EXTRACT PUMPORA GGSCI INFO ALL查看状态两个进程都应为RUNNING。启动目标端Replicat# 在目标端GGSCI GGSCI START REPLICAT REPORA GGSCI INFO ALL5.2 进行数据同步测试现在在源表SCOTT.EMP中进行一些DML操作。-- 在源数据库执行 INSERT INTO SCOTT.EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (9999, ‘TEST’, ‘CLERK’, 7902, SYSDATE, 1000, NULL, 20); COMMIT; UPDATE SCOTT.EMP SET SAL SAL 100 WHERE EMPNO 9999; COMMIT; DELETE FROM SCOTT.EMP WHERE EMPNO 9999; COMMIT;5.3 使用GGSCI命令监控与验证查看进程状态与延迟GGSCI INFO ALL GGSCI STATS EXTRACT EXTORA, TOTAL GGSCI STATS REPLICAT REPORA, TOTAL GGSCI SEND EXTRACT EXTORA, REPORT GGSCI VIEW REPORT EXTORAINFO ALL查看所有进程状态。STATS查看处理的记录数统计。SEND REPORT可以生成更详细的报告。查看目标表数据 在目标数据库查询SCOTT.EMP_TARGET你应该能看到与源端完全相同的插入、更新和删除操作结果。关键日志文件定位进程报告$OGG_HOME/dirrpt/目录下如EXTORA.rpt,REPORA.rpt。GGSCI命令日志$OGG_HOME/ggserr.log所有GGSCI命令和系统消息都会记录在此。轨迹文件内容查看高级调试./logdump Logdump OPEN ./dirdat/et000000 Logdump DETAIL ON Logdump GHDR ON Logdump NEXT 10可以查看轨迹文件中的原始数据记录。5.4 常见问题排查锦囊即使步骤再详细第一次部署也难免遇到问题。这里分享几个我踩过的坑问题1Extract进程状态为ABENDED(异常终止)排查立即查看报告文件VIEW REPORT EXTORA。最常见的原因是数据库连接失败或权限不足。可能原因与解决USERID/PASSWORD错误或TNS配置不对。确保DBLOGIN能成功。补充日志未正确启用。回到数据库确认SELECT supplemental_log_data_min, force_logging FROM v$database;以及SELECT log_pk FROM all_log_groups WHERE owner‘SCOTT’ AND table_name‘EMP’;。集成捕获模式需要的数据库权限未授予。确保oggadmin用户拥有GRANT EXECUTE ON DBMS_GOLDENGATE_ADM TO oggadmin;如果使用集成捕获。问题2Replicat进程报错无法找到目标表或列排查查看REPORA的报告文件。错误信息通常很明确。可能原因与解决目标表不存在或表名/列名大小写问题。Oracle默认大写在MAP语句中建议使用大写。使用了ASSUMETARGETDEFS但目标表结构列顺序、类型与源表不完全一致。对于结构不同的情况必须使用SOURCEDEFS参数。先用DEFGEN工具在源端生成定义文件传到目标端然后在参数文件中指定SOURCEDEFS ./dirdef/emp.def。问题3数据不同步但进程状态是RUNNING排查检查延迟GGSCI LAG EXTRACT EXTORA和GGSCI LAG REPLICAT REPORA。如果延迟很大可能是网络或目标端应用性能问题。如果无延迟但数据没过去检查Pump进程是否正常以及目标端RMTTRAIL是否正确添加。可能原因源端DML操作没有提交Commit。OGG只捕获已提交的事务。问题4轨迹文件快速增长磁盘空间告急排查检查目标端Replicat进程是否停止。如果Replicat停止Pump投递的数据无人消费会堆积在目标端的dirdat目录。解决首先恢复Replicat进程。OGG具有断点续传能力恢复后会自动从停止的位置继续应用不会丢失数据。这也体现了检查点表的重要性。6. 生产环境考量与进阶配置指引通过以上步骤你已经成功搭建了一条最基本的OGG单向同步链路。但对于生产环境这仅仅是起点。下面是一些你必须考虑的进阶问题初始数据加载Initial Load 我们上面的配置只处理增量数据。对于已有大量数据的表需要先进行一次性全量同步初始加载再切换到增量同步。OGG提供了多种初始加载方法使用Extract直接导出文件再由Replicat导入配置特殊的初始加载Extract和Replicat参数。使用数据库原生工具如Oracle Data Pump (expdp/impdp) 导出导入然后在导入结束时记录SCN再让增量Extract从这个SCN开始抓取。这是最常用、最高效的方式。操作要点初始加载期间必须确保源表的数据变化被持续捕获并暂存我们的EXTORA进程一直在运行待加载完成后让增量Replicat从暂存的轨迹文件开始应用实现无缝衔接。DDL同步配置 默认配置不同步DDL如CREATE, ALTER, DROP。要同步DDL步骤非常复杂且风险较高需要在数据库端启用全局DDL捕获。在OGG参数中启用DDL参数。仔细处理DDL过滤和映射因为不同数据库对象依赖关系复杂。个人建议生产环境慎用DDL同步。更稳妥的方案是通过变更管理流程在维护窗口内先在目标端手动执行DDL再短暂停止并重启OGG进程。性能调优Extract调整TRANLOGOPTIONS参数如INTEGRATEDPARAMS (parallelism 4)提高集成捕获并行度。Replicat调整BATCHSQL参数开启批处理操作调整GROUPTRANSOPS和MAXTRANSOPS来优化事务分组应用。网络确保源端Pump和目标端MGR之间的网络带宽和稳定性。对于跨机房场景轨迹文件压缩(COMPRESS)功能很有用。高可用与监控进程自动重启在MGR参数中加入AUTORESTART ER进程异常退出后会自动重启。告警集成配置LAG告警并可以通过脚本调用INFO ALL解析状态集成到Zabbix、Prometheus等监控系统。备份策略定期备份OGG安装目录、参数文件(dirprm)和检查点表。轨迹文件一般无需备份可通过重新初始化从SCN点拉取。整个部署过程从环境准备到链路打通最耗费时间的往往不是敲命令而是理解每个参数背后的含义以及遇到问题时如何有条理地排查。OGG就像一个精密的瑞士钟表每个齿轮都必须就位。这次分享的是一条最简链路但它包含了所有核心组件和思想。当你需要配置双向同步、过滤转换、投递到Kafka等更复杂的拓扑时其底层逻辑是相通的。记住多查看view report善用logdump官方文档Oracle GoldenGate Documentation永远是你最好的朋友。