Oracle GoldenGate的实时同步链路通常包括源端主抽取进程、本地队列文件、数据泵进程、目标端投递队列以及复制进程。这套架构的好处是抽取与传输分离,即使目标端临时不可用,本地队列也能继续积累数据,不会阻塞源库交易。

一、部署环境与前置条件检查
源端数据库必须运行在归档模式并开启补充日志,否则GoldenGate无法通过日志挖掘完整还原事务。登录源库执行下面的查询,确认force_logging和supplemental_log_data_min的状态。
SELECT force_logging, supplemental_log_data_min FROM v$database;
如果supplemental_log_data_min显示为NO,需要以SYSDBA身份执行以下命令打开最小补充日志和全列补充日志。全列补充日志会记录所有列的旧值,适当增加日志量,但能避免同步UPDATE时丢失未更新列的数据。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;
数据库账号同样不能马虎。GoldenGate连接数据库使用普通账号即可,但该账号需要具备日志挖掘、字典查询和闪回权限。源端和目标端建议使用相同名称的账号,便于参数文件统一维护。创建账号参考如下SQL。
CREATE USER ogg_src IDENTIFIED BY "Ogg_Src_2024"; GRANT CONNECT, RESOURCE TO ogg_src; GRANT SELECT ANY DICTIONARY TO ogg_src; GRANT EXECUTE ON DBMS_FLASHBACK TO ogg_src; GRANT FLASHBACK ANY TABLE TO ogg_src; GRANT SELECT ANY TRANSACTION TO ogg_src;
网络方面,如果使用数据泵跨主机传输,目标端的MGR端口默认7809必须能够连通。可以用telnet快速验证,如果不通则检查防火墙和监听地址。源端和目标端的时间最好保持一致,或者都接入NTP,否则检查延迟时容易误判。
二、GoldenGate安装与采集传输配置
将安装包解压到独立目录,例如/u01/app/ogg。该目录不要包含空格和中文,否则某些脚本解析路径会出错。解压完成后需要设置环境变量,然后执行ggsci确认可以进入命令行界面。
export OGG_HOME=/u01/app/ogg export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$OGG_HOME cd $OGG_HOME ./ggsci
首次进入GGSCI后先创建子目录,这些目录用于存放参数文件、队列文件、报告和丢弃文件。随后编辑MGR参数,MGR作为管理进程负责启动其他进程并监控运行状态。
GGSCI> create subdirs GGSCI> edit params mgr
MGR参数文件中的AUTOSTART和AUTORESTART可以帮助进程在数据库或主机重启后自动拉起,减少人工干预。PURGEOLDEXTRACTS用于定期清理过期的本地队列,避免磁盘被占满。参数内容如下。
PORT 7809 DYNAMICPORTLIST 7810-7890 AUTOSTART EXTRACT * AUTORESTART EXTRACT *, RETRIES 3, WAITMINUTES 5 PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3
保存后启动MGR并确认状态。接着添加主抽取进程ext1,它负责从数据库在线日志和归档日志中读取变化数据,写入本地队列文件。
GGSCI> start mgr GGSCI> info mgr GGSCI> add extract ext1, tranlog, begin now GGSCI> add exttrail ./dirdat/et, extract ext1
主抽取参数文件需要指定数据库连接账号和需要同步的表。生产环境建议使用加密密码,而不是明文写入参数文件。这里的示例只保留核心配置,便于理解。需要同步多张表时可以直接列出多行TABLE,也可以使用通配符。
EXTRACT ext1 USERID ogg_src, PASSWORD Ogg_Src_2024 EXTTRAIL ./dirdat/et TABLE hr.employees; TABLE hr.departments;
随后配置数据泵进程pump1,它读取本地队列et,将数据投递到目标端的远程队列rt。数据泵的存在让抽取和传输解耦,目标端网络抖动时主抽取仍能继续工作。
GGSCI> add extract pump1, exttrailsource ./dirdat/et GGSCI> add rmttrail ./dirdat/rt, extract pump1
数据泵参数文件中使用RMTHOST指定目标端主机和MGR端口。注意目标端已经创建了相同的子目录和MGR进程,RMTTRAIL的路径是相对于目标端OGG_HOME的。
EXTRACT pump1 USERID ogg_src, PASSWORD Ogg_Src_2024 RMTHOST 192.168.1.100, MGRPORT 7809 RMTTRAIL ./dirdat/rt TABLE hr.employees; TABLE hr.departments;
三、目标端初始化与Replicat进程配置
GoldenGate只复制增量变化,不会自动把存量数据搬到目标端。如果源表已经有大量历史数据,必须先用数据泵或RMAN做一次全量初始化。这里以expdp和impdp为例,导出时使用flashback_time保证数据一致性。
expdp system/*** directory=DATA_PUMP_DIR dumpfile=hr.dmp schemas=hr flashback_time=systimestamp
将转储文件传输到目标端后,导入前应禁用外键和触发器,避免导入过程中触发不必要的业务逻辑。导入完成后重新启用这些对象。接着在目标端配置Replicat进程rep1,它从远程队列rt中读取数据并应用到目标表。
GGSCI> add replicat rep1, exttrail ./dirdat/rt, begin now GGSCI> edit params rep1
Replicat参数文件需要指定目标端数据库账号和表映射关系。ASSUMETARGETDEFS表示源与目标表结构完全一致,如果列名或列顺序有差异则需要编写COLMAP。下面是最常见的配置。
REPLICAT rep1 USERID ogg_tgt, PASSWORD Ogg_Tgt_2024 ASSUMETARGETDEFS DISCARDFILE ./dirrpt/rep1.dsc, APPEND, MEGABYTES 50 MAP hr.employees, TARGET hr.employees; MAP hr.departments, TARGET hr.departments;
启动复制进程后,在源端分别执行插入、更新和删除操作,然后在目标端查询对应记录。通过GGSCI的stats命令可以查看进程已经处理的事务条数,lag命令用于确认延迟是否接近零。
GGSCI> start replicat rep1 GGSCI> stats replicat rep1 GGSCI> lag replicat rep1
如果lag一直保持为零或个位数秒,说明链路实时性正常。如果lag持续增长,需要检查传输网络、目标端应用速度以及是否存在锁等待。
四、性能调优与常见问题排查
同步链路跑通只是第一步,生产环境还需要根据事务量调整参数。源端抽取进程可以启用EOFDELAY降低空闲时的CPU轮询,目标端Replicat则可以使用BATCHSQL批量应用,减少逐条执行带来的开销。下面给出一个增加了性能选项的完整抽取参数文件。
EXTRACT ext1 USERID ogg_src, PASSWORD Ogg_Src_2024 EXTTRAIL ./dirdat/et TRANLOGOPTIONS INTEGRATEDPARAMS (MAX_SGA_SIZE 256) EOFDELAY 3 TABLE hr.employees; TABLE hr.departments;
目标端如果需要提升投递效率,可以在Replicat参数中增加批量执行选项,但需要注意大事务可能占用较多临时空间,压力测试后再决定是否开启。完整参数如下。
REPLICAT rep1 USERID ogg_tgt, PASSWORD Ogg_Tgt_2024 ASSUMETARGETDEFS DISCARDFILE ./dirrpt/rep1.dsc, APPEND, MEGABYTES 50 BATCHSQL DBOPTIONS SUPPRESSTRIGGERS MAP hr.employees, TARGET hr.employees; MAP hr.departments, TARGET hr.departments;
统计和管理队列文件也是日常运维的一部分。可以定期执行info all查看所有进程状态,send extract ext1 status获取详细运行信息。常见异常及处理方向如下。
- OGG-01296:源端补充日志未正确启用,重新执行ALTER DATABASE ADD SUPPLEMENTAL LOG DATA后重启抽取进程。
- OGG-01003:目标表不存在或列定义不一致,核对MAP映射和表结构。
- OGG-01154:队列文件缺失或权限不足,检查dirdat目录权限和EXTTRAIL路径。
- OGG-02024:MGR端口被占用,修改PORT参数或释放端口。
实际维护中,建议把GGSCI命令纳入脚本监控,比如定时执行info all并输出到日志,发现ABENDED状态就自动告警。队列文件不能无限制保留,PURGEOLDEXTRACTS可以根据磁盘容量调整MINKEEPDAYS,一般保留3天即可满足断点恢复需求。

