广告位 · 页头(后台-模块管理-新建模块后替换此区域)

如何部署Oracle GoldenGate实现数据库实时同步?

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

如何部署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天即可满足断点恢复需求。

广告位 · 文章底部(后台-模块管理替换此区域)