简介:这份资源面向需要跨平台部署Oracle GoldenGate的DBA与数据同步工程师,聚焦Windows源库到Linux目标库的异构同步场景,属于中高级实战配置资料。压缩包共1个PDF文件,约496KB,内容以图文步骤形式呈现,涵盖源库与目标库的归档、强制日志、附加日志及goldengate用户赋权等准备配置,并给出OGG 12.2.0.2在Linux端的解压、可视化安装、Manager、Extractor与Replicat组件配置流程,同时涉及监控、日志管理与故障排查思路。已有296人学习下载,适合希望快速掌握OGG跨系统同步部署要点、对照命令逐项落地并积累排错经验的读者参考。
1. 跨平台 OGG 同步:从 Windows 到 Linux 的落地拆解
手里有一套 Oracle 11g 的库跑在 Windows 上,另一套在 Linux 上,业务要求两边数据准实时对齐——这种场景下 GoldenGate 往往是绕不开的选择。但真到动手时,很多人卡在第一步:源端和目标端操作系统不同,OGG 的安装包、目录结构、环境变量、进程配置全都不一样,网上能找到的教程要么只讲 Linux 对 Linux,要么把 Windows 端一笔带过。这份资源给了一套完整的 OGG 12.2.0.2 部署流程,覆盖源库归档与附加日志配置、OGG 用户权限、MGR/Extract/DataPump/Replicat 四类进程的参数文件、初始化数据同步的两种方式,以及增删改和 truncate 的验证步骤。适合正在做异构数据库同步的 DBA,或者需要把 OGG 从测试环境推到生产环境的运维人员。下面按实际部署顺序拆开讲,参数怎么设、坑在哪,都落到具体命令上。
2. 源库与目标库的前置配置:归档、附加日志和 OGG 用户
OGG 能抽取增量数据,靠的是源库的 redo 日志。如果归档没开、附加日志没加,Extract 进程启动后要么报错,要么抽不到完整的前镜像,同步过去的数据就是错的。这一章先把两边的数据库配置做扎实,再进 OGG 安装。
2.1 源库必须开启的三项数据库级配置
源库这边有三件事必须做:归档模式、强制日志、附加日志。顺序不能乱,归档是基础,强制日志保证所有操作都记 redo,附加日志让 redo 里带上足够的前镜像信息。
-- 1. 开启归档模式(需要重启到 mount 状态) SQL> shutdown immediate; SQL> startup mount; SQL> alter database archivelog; SQL> alter database open; -- 2. 开启强制记录日志,确保所有 DML 都写 redo SQL> alter database force logging; -- 3. 开启最小附加日志,这是 OGG 抽取前镜像的最低要求 SQL> alter database add supplemental log data; -- 4. 验证配置是否生效 SQL> select SUPPLEMENTAL_LOG_DATA_MIN, FORCE_LOGGING from v$database; -- 期望输出:SUPPLEME 为 YES,FORCE_LOGGING 为 YES -- 5. 切换日志使附加日志立即生效 SQL> alter system switch logfile;这里有个容易忽略的点:add supplemental log data只是数据库级的最小附加日志,如果后续要用 DDL 同步或者表上没有主键,还得加表级或用户级附加日志。资源里在 2.2.4 节专门用add trandata命令补了这一步,后面会细说。
参数说明:force logging会影响性能,因为所有操作都强制写 redo,但在 OGG 场景下这是必须的,否则 nologging 操作会丢数据。enable_goldengate_replication这个参数在 11.2.0.4 之后才需要显式开启,资源里也提到了,如果版本低于这个,可以跳过。
2.2 创建 OGG 专用用户并授予最小权限
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; -- 授予 OGG 管理员权限,这是关键一步 SQL> exec dbms_goldengate_auth.grant_admin_privilege('GOLDENGATE'); -- 开启 OGG 复制功能 SQL> alter system set enable_goldengate_replication = true scope=both;目标端额外需要 DML 权限,因为 Replicat 进程要往目标库写数据:
-- 仅目标端需要 SQL> grant insert any table, update any table, delete any table to goldengate;dbms_goldengate_auth.grant_admin_privilege这个存储过程会自动授予 OGG 需要的各种系统权限,比手动一条条 grant 靠谱得多。如果漏了这一步,后面dblogin能成功,但 Extract 进程启动时会报权限不足。enable_goldengate_replication参数在 11.2.0.4 及以上版本必须设为 true,否则 OGG 进程无法与数据库集成,这是很多人在 12c 环境里翻车的地方。
2.3 目标库配置的差异点
目标库不需要开附加日志,因为 Replicat 只是应用数据,不抽取 redo。但目标库的 OGG 用户需要额外的 DML 权限,资源里明确写了grant insert any table, update any table, delete any table。另外目标库同样要开enable_goldengate_replication,这个参数两边都不能漏。
注意:如果源库和目标库的字符集不一致,比如源库是 ZHS16GBK,目标库是 AL32UTF8,OGG 进程参数里的
SETENV (NLS_LANG=...)必须和目标库字符集匹配,否则中文数据会乱码。资源里用的是AMERICAN_AMERICA.AL32UTF8,实际部署时要按目标库的nls_database_parameters来改。
3. OGG 安装与进程配置:从 ggsci 到四类进程启动
数据库侧配好之后,接下来是 OGG 软件本身的安装和进程配置。资源里用的是 12.2.0.2 版本的 Linux 安装包,Windows 端需要单独下载对应的 Windows 版本。安装过程本身不复杂,关键是安装完之后的初始化配置和进程参数文件。
3.1 安装 OGG 并创建子目录
Linux 端用 oracle 用户解压安装包,运行runInstaller可视化安装。安装完成后进入 OGG 安装目录,执行ggsci创建子目录结构。
# 解压安装包 su - oracle unzip 122022_fbo_ggs_Linux_x64_shiphome.zip # 进入安装目录执行安装 cd fbo_ggs_Linux_x64_shiphome/Disk1 ./runInstaller # 安装完成后进入 OGG 目录,启动 ggsci cd /u01/app/ogg ./ggsci # 在 ggsci 中创建子目录 GGSCI (test1) 1> create subdirscreate subdirs会创建 dirprm、dirrpt、dirchk、dirdat 等目录,分别存放参数文件、报告、检查点和 trail 文件。如果这些目录已经存在,ggsci 会提示 already exists,不影响后续操作。Windows 端的 OGG 安装类似,只是安装程序是 exe,安装完同样要进 ggsci 执行create subdirs。
3.2 配置 GLOBALS 和 MGR 进程
GLOBALS 文件是 OGG 的全局参数文件,源端和目标端都要配。MGR 是管理进程,负责启动、监控其他进程,也是两边都要起。
# 编辑 GLOBALS 文件 GGSCI (test1) 2> edit params ./GLOBALS # 内容如下: GGSCHEMA goldengate CHECKPOINTTABLE goldengate.ggschkpt SYSLOG NONEGGSCHEMA指定 OGG 用户 schema,CHECKPOINTTABLE指定检查点表名。配完之后用dblogin登录数据库,生成检查点表:
GGSCI (test1) 4> dblogin userid goldengate password goldengate GGSCI (test1 as goldengate@test1) 6> add CHECKPOINTTABLE goldengate.ggschkptMGR 进程的参数文件里,PORT 7809是管理端口,DYNAMICPORTLIST是动态端口范围,AUTORESTART让进程挂掉后自动重启。PURGEOLDEXTRACTS定期清理 trail 文件,避免磁盘写满。
GGSCI (test1 as goldengate@test1) 7> edit params mgr # 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 3 # 启动 MGR GGSCI (test1 as goldengate@test1) 8> start mgrAUTORESTART ER *,RETRIES 3, WAITMINUTES 5, RESETMINUTES 60的意思是:所有 Extract 和 Replicat 进程如果异常终止,5 分钟后自动重启,最多重试 3 次,60 分钟后重置重试计数。这个配置在生产环境很实用,能扛住网络抖动导致的临时故障。PURGEOLDEXTRACTS的MINKEEPHOURS 12表示至少保留 12 小时的 trail 文件,防止还没投递就被清理。
3.3 源端 Extract 进程配置
Extract 进程负责从源库 redo 日志中抽取数据,写入本地 trail 文件。资源里的配置有几个关键参数需要解释。
GGSCI (test1) 1> edit param extgsxf # Extract 参数内容: EXTRACT extgsxf 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 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.*; # 添加并启动 Extract GGSCI (test1) 2> add extract extgsxf tranlog, begin now GGSCI (test1) 3> add exttrail ./dirdat/gs, extract extgsxf, megabytes 1024 GGSCI (test1 as goldengate@test1) 56> start extgsxfTRANLOGOPTIONS LOGRETENTION DISABLED表示不使用 Oracle 的 log retention 功能,OGG 自己管理归档日志的保留。BR ,BRINTERVAL 20M是 Bounded Recovery 参数,20 分钟检查一次长事务。CACHEMGR CACHESIZE 2GB给缓存管理器分配 2GB 内存,大事务场景下这个值要调大。GETTRUNCATES让 Extract 捕获 truncate 操作,目标端 Replicat 也要配GETTRUNCATES才能应用。DDL INCLUDE MAPPED开启 DDL 同步,但需要提前在源库执行 marker_setup、ddl_setup 等脚本。
3.4 DataPump 与 Replicat 进程配置
DataPump 进程负责把本地 trail 文件投递到目标端,Replicat 进程在目标端读取 trail 并应用。
# 源端 DataPump 配置 GGSCI (test1 as goldengate@test1) 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.*; # 添加 DataPump GGSCI (test1 as goldengate@test1) 61> add extract dpgskf, exttrailsource ./dirdat/gs GGSCI (test1 as goldengate@test1) 62> add RMTTRAIL ./dirdat/gs, extract dpgskf, megabytes 1024 GGSCI (test1 as goldengate@test1) 63> start dpgskfPASSTHRU表示 DataPump 不做任何转换,直接把 trail 文件投递到目标端。RMTHOST指定目标端 IP 和 MGR 端口。RMTTRAIL指定目标端的 trail 路径,这个路径是相对于目标端 OGG 安装目录的。
# 目标端 Replicat 配置 GGSCI (test2 as goldengate@test1) 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.*; # 添加 Replicat GGSCI (test2 as goldengate@test1) 14> add replicat repgs1, exttrail ./dirdat/gs, checkpointtable goldengate.ggschkptASSUMETARGETDEFS表示源端和目标端表结构完全一致,不需要 defgen 生成定义文件。DBOPTIONS DEFERREFCONST延迟约束检查,避免外键导致的复制失败。DBOPTIONS SUPPRESSTRIGGERS抑制目标端触发器,防止触发器重复执行业务逻辑。GROUPTRANSOPS 1000每 1000 个操作提交一次,平衡性能和数据一致性。ALLOWNOOPUPDATES允许源端更新但目标端无变化的操作通过,避免 Replicat 报错。
4. 初始化数据同步与验证:dump 和 OGG 两种方式
进程配好之后,源端和目标端的数据还不一致,需要做一次初始化同步。资源里给了两种方式:expdp/impdp 的 dump 方式和 OGG 自带的初始化抽取方式。dump 方式适合数据量不大、可以停机操作的场景;OGG 初始化方式适合不能停机、需要在线同步的场景。
4.1 使用 expdp/impdp 做初始化
这种方式的核心是记录一个 SCN,导出时用flashback_scn指定这个 SCN,目标端 Replicat 从同一个 SCN 开始应用,保证数据不重不漏。
-- 源端:获取当前 SCN SQL> select to_char(current_scn) from v$database; -- 假设输出:1085057 -- 源端:用 expdp 导出,指定 flashback_scn expdp test/test TABLES=test.t1 DUMPFILE=t1.dmp flashback_scn=1085057 -- 将 dump 文件拷贝到目标端,然后导入 impdp test/test dumpfile=t1.dmp# 目标端:启动 Replicat,从指定 SCN 开始 GGSCI (test2 as goldengate@test1) 20> start replicat repgs1, aftercsn 1085057flashback_scn是关键参数,它保证导出的数据是 SCN 1085057 时刻的一致性快照。Replicat 的aftercsn参数让复制进程从这个 SCN 之后开始应用,这样导出时刻之后的变化会被 OGG 补上,不会丢数据也不会重复。如果 SCN 记错了,比如导出时没指定 flashback_scn,那 Replicat 启动后可能会重复应用已经导出的数据,导致主键冲突。
4.2 使用 OGG 初始化抽取
这种方式不需要 expdp/impdp,直接用 OGG 的sourceistable模式抽取源表数据到目标端。资源里的配置稍微复杂一些,涉及一个特殊的初始化 Extract 和一个 specialrun 的 Replicat。
# 源端:配置初始化抽取进程 GGSCI (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'; # 添加为 sourceistable 模式 GGSCI (test1) 2> add extract init_t1, sourceistable # 目标端:配置 specialrun Replicat GGSCI (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; # 启动初始化抽取 GGSCI (test1) 3> start EXTRACT init_t1 # 启动初始化 Replicat ./replicat paramfile dirprm/ri1.prm # 启动常规 Replicat,从初始化 SCN 之后开始 GGSCI (test2 as goldengate@test1) 4> start replicat rp1, aftercsn 2497559sourceistable模式让 Extract 直接读表而不是读 redo 日志,SQLPREDICATE 'AS OF SCN 2497559'指定一致性读取的 SCN。specialrun的 Replicat 是一次性运行的,处理完初始化文件就退出。常规 Replicat 用aftercsn从初始化 SCN 之后开始,保证增量数据接上。
4.3 验证增删改和 truncate 同步
初始化完成后,在源端做 DML 操作,目标端检查是否同步。
-- 源端:插入数据 SQL> insert into t1 (object_id) values(87366); SQL> commit; -- 目标端:验证 SQL> select max(object_id) from test.t1; -- 期望输出:87366 -- 源端:删除数据 SQL> delete from t1 where object_id=87366; SQL> commit; -- 目标端:验证 SQL> select max(object_id) from test.t1; -- 期望输出:87365 -- 源端:truncate 表 SQL> truncate table t1; -- 目标端:验证 SQL> select count(*) from test.t1; -- 期望输出:0truncate 能同步的前提是 Extract 和 Replicat 都配了GETTRUNCATES,资源里两边都加了。如果只配了一边,truncate 操作会被忽略,目标端数据还在,这就埋了隐患。另外REPERROR (DEFAULT, ABEND)让 Replicat 遇到错误直接终止,而不是跳过,生产环境建议保持这个配置,避免数据不一致。
5. 避坑与排查:OGG 部署中最容易翻车的五个点
OGG 的坑大多集中在权限、字符集、SCN 和进程状态上。下面这几条是实际部署中反复遇到的问题,每条按现象、原因、解决来写。
5.1 Extract 启动报 OGG-02091
现象:start extgsxf后进程状态是 ABENDED,查看ggserr.log报 OGG-02091,提示无法打开 redo 日志或权限不足。
原因:源库的enable_goldengate_replication没开,或者 OGG 用户缺少dbms_goldengate_auth.grant_admin_privilege授予的权限。
解决:确认alter system set enable_goldengate_replication = true scope=both已执行,然后重新执行exec dbms_goldengate_auth.grant_admin_privilege('GOLDENGATE')。如果还不行,检查v$database的SUPPLEMENTAL_LOG_DATA_MIN是否为 YES。
5.2 Replicat 报 OGG-01296 主键冲突
现象:Replicat 进程 ABENDED,报 OGG-01296,提示唯一约束冲突。
原因:初始化时 SCN 没对齐,Replicat 重复应用了已经导入的数据。
解决:重新做初始化,确保 expdp 的flashback_scn和 Replicat 的aftercsn是同一个值。如果已经冲突,可以手动删除目标端冲突行,或者用HANDLECOLLISIONS参数临时跳过冲突,但生产环境不建议长期开这个参数。
5.3 中文数据乱码
现象:源端插入中文,目标端查询显示乱码。
原因:OGG 进程的SETENV (NLS_LANG=...)和目标库字符集不匹配。
解决:查目标库select * from nls_database_parameters where parameter='NLS_CHARACTERSET',把 Extract、DataPump、Replicat 的NLS_LANG都改成对应值。比如目标库是 AL32UTF8,就设AMERICAN_AMERICA.AL32UTF8。
5.4 trail 文件堆积导致磁盘满
现象:OGG 安装目录所在磁盘使用率 100%,Extract 进程 ABENDED。
原因:PURGEOLDEXTRACTS没配或者配得太保守,trail 文件没及时清理。
解决:在 MGR 参数里加PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 12,确保已投递的 trail 文件在 12 小时后被清理。同时监控dirdat目录大小,设置磁盘告警。
5.5 DDL 同步不生效
现象:源端建表或改表结构,目标端没变化。
原因:DDL 同步需要额外配置,包括marker_setup、ddl_setup、ddl_enable脚本,以及 Extract 和 Replicat 参数里的DDL INCLUDE MAPPED。
解决:按资源 2.2.4 节的步骤,用 sysdba 执行@marker_setup、@ddl_setup、@role_setup,然后GRANT GGS_GGSUSER_ROLE TO goldengate,最后@ddl_enable。Extract 和 Replicat 都要加DDL INCLUDE MAPPED和DDLOPTIONS REPORT。
6. 进阶技巧:用 ggserr.log 和统计报告快速定位问题
OGG 的日志和报告是排查问题的核心工具,但很多人只看进程状态,不深入看报告。我一般会在部署完成后,先跑一轮完整的 DML 测试,然后逐个检查 Extract、DataPump、Replicat 的统计报告,确认没有隐藏的错误。
# 查看 Extract 统计 GGSCI (test1 as goldengate@test1) 1> stats extgsxf # 查看 DataPump 统计 GGSCI (test1 as goldengate@test1) 2> stats dpgskf # 查看 Replicat 统计 GGSCI (test2 as goldengate@test1) 3> stats repgs1 # 查看进程详细状态 GGSCI (test1 as goldengate@test1) 4> info extgsxf detail GGSCI (test1 as goldengate@test1) 5> info dpgskf detail GGSCI (test2 as goldengate@test1) 6> info repgs1 detail # 查看 ggserr.log 最后 100 行 tail -100 /u01/app/ogg/ggserr.logstats命令输出里重点看几个指标:Total inserts、Total updates、Total deletes是否和源端操作数一致;Lag是否在可接受范围内;Discards是否为 0。如果 Discards 大于 0,说明有数据被丢弃,必须查dirrpt下的 discard 文件。info ... detail会显示进程的详细状态,包括当前读取的 trail 文件、检查点信息、最后一次操作的时间。
另一个实用技巧是配REPORTCOUNT EVERY 1 HOURS, RATE,让 OGG 每小时输出一次处理速率。如果速率突然下降,可能是源库有大事务或者网络延迟。我习惯在部署完成后,用stats命令连续观察 3 次,确认 Lag 稳定在秒级,才认为同步链路是健康的。
从那以后我每次部署 OGG,都会在初始化完成后强制走一遍增删改和 truncate 的验证,再检查三个进程的stats和ggserr.log,确认没有 Discards 和 ABENDED 记录,才交给业务方使用。希望帮到你。
本文还有配套的精品资源,点击获取