ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Oracle OGG跨平台同步实战:Windows到Linux异构部署避坑指南

Oracle OGG跨平台同步实战:Windows到Linux异构部署避坑指南

简介:本资源是一份面向Oracle数据库管理员与数据同步工程师的OGG跨平台部署实战指南,聚焦Windows源库到Linux目标库的实时数据同步场景,解决异构环境间数据复制、灾备建设与业务连续性保障等核心问题。文档以Oracle GoldenGate 12.2.0.2版本为基础,系统覆盖源/目标库归档配置、强制日志与附加日志启用、goldengate用户权限授予、enable_goldengate_replication参数设置、OGG子目录初始化、Manager/Extract/Replicat组件配置及基础监控要点,内容实操性强,适合作为生产部署前的技术验证与学习参考。资源为单文件PDF格式,共1个文件,大小496KB,轻量易读,便于快速查阅关键命令与配置逻辑。目前已有296人学习下载,读者可直接获取完整配置清单、SQL与Shell命令示例、权限分配明细及典型故障应对提示,特别适合需在有限环境中快速落地OGG同步方案的中级DBA与运维人员。

1. Oracle OGG跨平台同步实战:Windows源库到Linux目标库,不是装完就能跑的“黑匣子”

你手头有一套运行在 Windows Server 上的 Oracle 11g 生产库,业务要求把核心表实时同步到 Linux(RHEL 7)上的灾备库——别急着点下载链接,先看清这个现实:OGG 12.2 在 Windows 和 Linux 之间做异构同步,不是解压、安装、启动三步走的傻瓜流程。我见过太多人卡在ADD EXTRACT后进程状态永远是STOPPED,或START REPLICAT时日志里反复刷ORA-01017: invalid username/password,结果发现是NLS_LANG编码没对齐、ORACLE_HOME路径写错斜杠方向、甚至 Windows 端用的是ogg.exe而 Linux 端必须用./ggsci——这些细节不抠死,同步链路就是个摆设。本文聚焦真实生产级部署:从 Windows 源端(Oracle 11.2.0.4)到 Linux 目标端(Oracle 11.2.0.4 / 12.2.0.1),覆盖 OGG 12.2.0.2 全流程,重点拆解DDL 同步失效、SCN 初始化偏差、TRANDATA 添加失败、MGR 端口不通四类高频翻车点。适合已具备 Oracle DBA 基础、正被跨平台同步卡住进度的工程师,新手请务必对照每条命令检查环境变量和路径分隔符。


2. 源库与目标库底层配置:归档、附加日志、权限三座大山必须推平

OGG 同步不是“数据库连上就行”,它依赖 Oracle 底层日志机制。Windows 和 Linux 的 Oracle 实例虽同源,但文件路径、服务管理、字符集处理存在本质差异。这里不讲理论,只列实操中必须亲手敲、亲手验的硬核步骤。

2.1 源库(Windows)强制归档与日志增强配置

注意:Windows 下 Oracle 服务名为OracleService<SID>,启动前需确认服务已运行。所有 SQL 命令在sqlplus / as sysdba中执行,不要用 PL/SQL Developer 或 SQL Developer 图形界面连,避免 NLS 设置干扰。

-- 步骤1:确认实例处于 MOUNT 状态(非 OPEN) SQL> shutdown immediate; SQL> startup mount; -- 步骤2:开启归档模式(关键!OGG 抽取依赖归档日志) SQL> alter database archivelog; SQL> alter database open; -- 步骤3:开启强制记录日志(FORCE LOGGING),确保所有操作写入重做日志 SQL> alter database force logging; -- 步骤4:开启最小补充日志(SUPPLEMENTAL LOG DATA),这是 OGG 解析 DML 的基础 SQL> alter database add supplemental log data; -- 步骤5:立即验证配置是否生效(必须看到 YES YES) SQL> select SUPPLEMENTAL_LOG_DATA_MIN, FORCE_LOGGING from v$database; -- 正确输出: -- SUPPLEME FOR -- -------- --- -- YES YES -- 步骤6:强制切换日志,使补充日志配置立即生效(否则新事务可能不记录) SQL> alter system switch logfile;

参数说明:

  • SUPPLEMENTAL_LOG_DATA_MIN = YES表示最小补充日志已启用,OGG 可解析 UPDATE/DELETE 的 WHERE 条件;
  • FORCE_LOGGING = YES是硬性要求,防止某些 NOLOGGING 操作绕过日志,导致同步丢失数据;
  • alter system switch logfile不是可选操作,它生成新的归档日志文件,让 OGG Extract 进程能从最新位置开始读取。

2.2 源库(Windows)OGG 专用用户创建与权限授予

OGG 不允许用SYS或SYSTEM用户运行 Extract,必须创建独立 schema。Windows 路径使用反斜杠\,但 OGG 内部参数仍需正斜杠/,这点极易出错。

-- 创建专用表空间(路径按实际调整,注意 Windows 反斜杠) SQL> create tablespace goldengate datafile 'D:\app\oracle\oradata\ORCL\ogg01.dbf' size 300m autoextend on next 100m maxsize 2g; -- 创建用户(密码建议用字母+数字组合,避免特殊字符引发 ggsci 登录失败) SQL> create user goldengate identified by GoldEng@2024 default tablespace goldengate temporary tablespace temp quota unlimited on goldengate; -- 授予基础连接与会话权限 SQL> grant connect, resource, create session, alter session to goldengate; -- 授予闪回查询权限(用于初始化或修复数据不一致) SQL> grant flashback any table to goldengate; -- 关键一步:授予 OGG 管理员角色(必须用 SYS 执行,且用户名全大写) SQL> exec dbms_goldengate_auth.grant_admin_privilege('GOLDENGATE'); -- 启用 GoldenGate 复制功能(11gR2+ 必须设置,否则 Extract 启动报 ORA-26885) SQL> alter system set enable_goldengate_replication = true scope=both;

逻辑说明:

  • dbms_goldengate_auth.grant_admin_privilege是 OGG 12c 引入的强制授权方式,替代旧版GRANT GGS_GGSUSER_ROLE;
  • enable_goldengate_replication = true是隐藏开关,不设置会导致 Extract 进程无法 attach 到日志流,状态卡在INITIALIZING;
  • Windows 下datafile路径必须用单引号包裹,且反斜杠无需转义('D:\path\file.dbf'合法),但若在 OGG 参数文件中引用该路径,需统一为正斜杠。

2.3 目标库(Linux)精简配置:不需附加日志,但权限更苛刻

Linux 目标库配置比源库简单(不需开归档、不需add supplemental log data),但权限要求更高——Replicat 进程要执行 DML,必须有INSERT ANY TABLE等系统级权限。

-- 创建表空间(Linux 路径用正斜杠,注意磁盘空间充足) SQL> create tablespace goldengate datafile '/u01/app/oracle/oradata/TEST1/ogg01.dbf' size 300m autoextend on next 100m maxsize 2g; -- 创建用户(密码与源库保持一致,便于维护) SQL> create user goldengate identified by GoldEng@2024 default tablespace goldengate temporary tablespace temp quota unlimited on 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'); -- 关键权限:Replicat 需要修改任意表(注意:不是 grant on specific table) SQL> grant insert any table, update any table, delete any table, drop any table to goldengate; -- 启用 GoldenGate 复制(同源库) SQL> alter system set enable_goldengate_replication = true scope=both;

为什么目标库不需要add supplemental log data?
因为 Replicat 是“写入者”,它从 Trail 文件中读取已解析好的 SQL 或 ROW 信息,直接应用到目标库,不依赖目标库自身的日志结构。而源库的 Extract 是“读取者”,必须靠补充日志才能从重做日志中还原出完整的 UPDATE/DELETE 操作。

2.4 避坑:源库与目标库配置四大血泪问题排查

以下问题均来自真实部署现场,每一条都对应一个ggsci日志里的 ERROR 或 WARNING:

现象原因解决
Extract 进程启动后立即 ABEND,日志报ORA-01017: invalid username/passwordWindows 源库中NLS_LANG环境变量未设置,或设置为AMERICAN_AMERICA.ZHS16GBK(中文字符集),导致密码传输乱码在 Windows 系统环境变量中添加NLS_LANG=AMERICAN_AMERICA.AL32UTF8,并重启 OGG 服务;或在edit params extgsxf中显式写SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
ADD TRANDATA test.t1执行成功,但后续同步时目标端出现Missing key column错误表test.t1无主键或唯一索引,而ADD TRANDATA默认只对有主键的表生效;OGG 无法定位 UPDATE/DELETE 的行方案一:给表加主键ALTER TABLE test.t1 ADD CONSTRAINT pk_t1 PRIMARY KEY(object_id);方案二:强制指定列ADD TRANDATA test.t1 COLUMNS(object_id)(仅当确定该列能唯一标识行)
DBLOGIN成功,但ADD CHECKPOINTTABLE报ORA-00942: table or view does not existCHECKPOINTTABLE名称写错(如goldengate.ggschkpt写成goldengate.chkpt),或用户goldengate对goldengate表空间无配额执行SELECT username, default_tablespace, temporary_tablespace FROM dba_users WHERE username='GOLDENGATE';确认默认表空间;执行SELECT tablespace_name, bytes/1024/1024 MB FROM dba_free_space WHERE tablespace_name='GOLDENGATE';确认有空闲空间
START MGR后INFO ALL显示MANAGER STOPPED,ggserr.log报Failed to bind port 7809Linux 目标库防火墙未放行 7809 端口,或该端口被其他进程占用(如netstat -tuln | grep 7809)执行sudo firewall-cmd --permanent --add-port=7809/tcp && sudo firewall-cmd --reload(RHEL7);或改用PORT 7810并同步修改RMTHOST参数

3. OGG 核心进程配置:Extract/Datapump/Replicat 三段式链路不能少

OGG 同步不是 Extract 直连目标库,而是经典的Extract → Datapump → Replicat三段式架构。Windows 源端负责抽取(Extract)、投递(Datapump),Linux 目标端负责应用(Replicat)。每一段的参数文件都必须精准匹配环境,尤其注意路径、端口、字符集。

3.1 源端(Windows)Extract 进程:从归档日志中捕获变更

Extract 是整个链路的源头,它读取 Oracle 归档日志(或在线日志),将 DML/DDL 转换为 Trail 文件。Windows 下必须用ogg.exe启动ggsci,且ORACLE_HOME路径中的反斜杠要小心处理。

# 在 Windows 命令行中进入 OGG 安装目录(假设为 D:\ogg) C:\> cd D:\ogg C:\> ggsci # 创建子目录(必须执行,否则后续报错) GGSCI (WIN-SOURCE) 1> CREATE SUBDIRS # 连接数据库(注意:Windows 下密码含特殊字符需用双引号包裹) GGSCI (WIN-SOURCE) 2> DBLOGIN USERID goldengate PASSWORD "GoldEng@2024" # 编辑 Extract 参数文件(文件名 extgsxf.prm,存于 dirprm 子目录) GGSCI (WIN-SOURCE) 3> EDIT PARAMS extgsxf
-- extgsxf.prm 内容(关键参数已加注释) EXTRACT extgsxf -- Windows 环境变量:ORACLE_HOME 必须用正斜杠,且路径末尾不加 \ SETENV (ORACLE_HOME="D:/app/oracle/product/11.2.0/db_1") SETENV (ORACLE_SID="ORCL") -- 字符集必须与数据库一致,AL32UTF8 是 Oracle 11g+ 推荐值 SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8") -- OGG 用户登录凭证(密码用双引号防特殊字符解析错误) USERID goldengate, PASSWORD "GoldEng@2024" -- 输出 Trail 文件路径(Windows 下路径用正斜杠,OGG 自动识别) EXTTRAIL ./dirdat/gs -- 关键:禁用日志保留,避免 Extract 卡在旧日志 TRANLOGOPTIONS LOGRETENTION DISABLED -- 提高日志读取性能(BRINTERVAL 20M 表示每 20 分钟刷新一次缓冲区) TRANLOGOPTIONS BRINTERVAL 20M -- 加大缓冲区(解决大事务日志解析慢) TRANLOGOPTIONS BUFSIZE 2048000 -- 启用获取复制进程(支持双向同步扩展) GETREPLICATES -- 启用缓存管理(大事务必备) CACHEMGR CACHESIZE 2GB -- 启用截断操作同步(重要!否则 TRUNCATE TABLE 不同步) GETTRUNCATES -- DDL 同步:包含表和索引的 DDL(CREATE/DROP/ALTER) DDL INCLUDE MAPPED, OBJTYPE 'TABLE' DDL INCLUDE MAPPED, OBJTYPE 'INDEX' -- DDL 选项:自动添加补充日志,失败重试 DDLOPTIONS ADDTRANDATA RETRYOP RETRYDELAY 10 MAXRETRIES 10 -- 错误日志(路径用正斜杠) DISCARDFILE ./dirrpt/extgsxf.dsc, APPEND, MEGABYTES 1000 REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 1 HOURS, RATE -- 长事务告警(1 小时未提交即警告) FETCHWARNLONGTRANS 1H, CHECKINTERVAL 10m -- 同步所有 test 模式下的表 TABLE test.*;

参数说明:

  • EXTTRAIL ./dirdat/gs:Trail 文件前缀为gs,存于dirdat目录,OGG 自动生成gs000000000等文件;
  • TRANLOGOPTIONS LOGRETENTION DISABLED是 Windows 源端关键项,防止 Extract 因日志被归档删除而中断;
  • GETTRUNCATES必须开启,否则TRUNCATE TABLE操作不会被捕捉;
  • TABLE test.*;表示同步test用户下所有表,若只需同步部分表,可写TABLE test.t1; TABLE test.t2;。

3.2 源端(Windows)DataPump 进程:解决网络不稳定导致的 Trail 丢失

Datapump 是 Extract 和 Replicat 之间的“快递员”。它从本地 Trail 文件读取数据,通过 TCP 发送给目标端 MGR。没有它,Extract 生成的 Trail 文件只能存本地,无法到达 Linux。

# 在 ggsci 中编辑 DataPump 参数 GGSCI (WIN-SOURCE) 4> EDIT PARAMS dpgskf
-- dpgskf.prm 内容 EXTRACT dpgskf PASSTHRU -- 不做任何转换,原样投递 DYNAMICRESOLUTION -- 目标端 MGR 地址和端口(Linux IP + 7809) RMTHOST 10.0.100.141, MGRPORT 7809 -- 目标端 Trail 文件前缀(必须与 Replicat 的 EXTTRAIL 一致) RMTTRAIL ./dirdat/gs -- 错误日志 DISCARDFILE ./dirrpt/dpgskf.dsc, APPEND, MEGABYTES 100 REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 1 HOURS, RATE -- 同步所有 test 模式下的表 TABLE test.*;

逻辑说明:

  • PASSTHRU模式表示 Datapump 不解析数据,只做二进制转发,性能最高;
  • RMTHOST的 IP 必须是 Linux 目标机的真实 IP(非localhost或127.0.0.1),且 Linux 防火墙需放行7809;
  • RMTTRAIL ./dirdat/gs与 Extract 的EXTTRAIL前缀一致,确保数据流连贯。

3.3 目标端(Linux)Replicat 进程:把 Trail 文件变成真实 SQL

Replicat 运行在 Linux,它读取由 Datapump 发送来的 Trail 文件(./dirdat/gs*),解析成 SQL 并执行。Linux 下路径全部用正斜杠,ORACLE_HOME必须指向真实的 Oracle 安装路径。

# 在 Linux 终端进入 OGG 目录(假设为 /u01/app/ogg) [oracle@test2 ~]$ cd /u01/app/ogg [oracle@test2 ogg]$ ./ggsci GGSCI (test2) 1> CREATE SUBDIRS GGSCI (test2) 2> DBLOGIN USERID goldengate PASSWORD GoldEng@2024 GGSCI (test2) 3> EDIT PARAMS repgs1
-- repgs1.prm 内容 REPLICAT repgs1 -- Linux 环境变量(路径用正斜杠) 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 GoldEng@2024 -- 假设目标表定义与源端一致(省去 DEFGEN 步骤) ASSUMETARGETDEFS -- 关闭外键约束检查(避免 INSERT 顺序错乱) DBOPTIONS DEFERREFCONST -- 关闭触发器(防止触发器二次执行) DBOPTIONS SUPPRESSTRIGGERS -- 错误日志 DISCARDFILE ./dirrpt/repgs1.dsc, APPEND, MEGABYTES 1000 DISCARDROLLOVER AT 6:00 REPORTROLLOVER AT 6:00 REPORTCOUNT EVERY 30 MINUTES, RATE -- 遇到任何错误立即中止(避免脏数据) REPERROR (DEFAULT, ABEND) -- DDL 同步:映射表和索引 DDL INCLUDE MAPPED, OBJTYPE 'TABLE' DDL INCLUDE MAPPED, OBJTYPE 'INDEX' DDLOPTIONS REPORT -- 允许 TRUNCATE 操作(与 Extract 的 GETTRUNCATES 对应) GETTRUNCATES -- 动态解析表结构(应对新增表) DYNAMICRESOLUTION -- 每 1000 条事务提交一次(平衡性能与一致性) GROUPTRANSOPS 1000 -- 表映射:test.* → test.*(同名同结构) MAP test.*, TARGET test.*;

参数说明:

  • ASSUMETARGETDEFS表示不使用DEFGEN工具生成表定义文件,要求源库和目标库表结构完全一致;
  • DBOPTIONS SUPPRESSTRIGGERS是必须项,否则目标库触发器会被执行两次(源端一次,目标端一次);
  • GROUPTRANSOPS 1000控制事务粒度,值太小(如 10)导致频繁 COMMIT,性能差;值太大(如 10000)导致单次事务过大,可能 OOM。

3.4 进程注册与启动:三步缺一不可

所有参数文件写完后,必须在ggsci中注册进程,并绑定 Trail 文件路径,最后启动。顺序错误会导致START失败。

# 源端(Windows)执行 GGSCI (WIN-SOURCE) 5> ADD EXTRACT extgsxf, TRANLOG, BEGIN NOW GGSCI (WIN-SOURCE) 6> ADD EXTTRAIL ./dirdat/gs, EXTRACT extgsxf, MEGABYTES 1024 GGSCI (WIN-SOURCE) 7> ADD EXTRACT dpgskf, EXTTRAILSOURCE ./dirdat/gs GGSCI (WIN-SOURCE) 8> ADD RMTTRAIL ./dirdat/gs, EXTRACT dpgskf, MEGABYTES 1024 # 目标端(Linux)执行 GGSCI (test2) 4> ADD REPLICAT repgs1, EXTTRAIL ./dirdat/gs, CHECKPOINTTABLE goldengate.ggschkpt # 启动(按顺序:先 MGR,再 Extract,再 Datapump,最后 Replicat) # 源端启动 MGR(若未启动) GGSCI (WIN-SOURCE) 9> START MGR # 源端启动 Extract GGSCI (WIN-SOURCE) 10> START EXTRACT extgsxf # 源端启动 Datapump GGSCI (WIN-SOURCE) 11> START EXTRACT dpgskf # 目标端启动 Replicat GGSCI (test2) 5> START REPLICAT repgs1

验证命令:

  • INFO ALL:查看所有进程状态,正常应为RUNNING;
  • VIEW REPORT extgsxf:查看 Extract 最后一页日志,确认Successfully logged into database和Writing DML to trail file;
  • STATS EXTRACT extgsxf:查看抽取统计,Total inserts,Total updates应随源库 DML 增长。

4. 数据初始化:SCN 同步与全量加载,避免“同步了但数据不对”

同步链路跑起来只是第一步,真正的挑战在于初始数据一致性。OGG 不提供自动全量同步,必须手动保证源库和目标库在某个 SCN 时间点数据完全一致,否则增量同步会从错误起点开始。

4.1 SCN 初始化法:最精准的冷初始化(推荐)

此方法要求源库短暂停写,获取精确 SCN,导出导入后从该 SCN 开始同步。适用于可接受分钟级停机的场景。

-- 源库(Windows)获取当前 SCN SQL> SELECT TO_CHAR(CURRENT_SCN) FROM V$DATABASE; -- 输出类似:1085057 -- 源库导出(expdp 必须用与 OGG 同一用户,且指定 FLASHBACK_SCN) SQL> EXIT C:\> expdp goldengate/GoldEng@2024 DIRECTORY=DATA_PUMP_DIR DUMPFILE=t1_init.dmp TABLES=test.t1 FLASHBACK_SCN=1085057 -- 将 dump 文件拷贝到 Linux 目标机(如用 scp) C:\> scp t1_init.dmp oracle@10.0.100.141:/home/oracle/ -- 目标库(Linux)导入 [oracle@test2 ~]$ impdp goldengate/GoldEng@2024 DIRECTORY=DATA_PUMP_DIR DUMPFILE=t1_init.dmp TABLE_EXISTS_ACTION=REPLACE
# 目标端启动 Replicat 时指定 SCN(关键!) GGSCI (test2) 6> START REPLICAT repgs1, AFTERCSN 1085057

为什么必须AFTERCSN?
因为FLASHBACK_SCN=1085057导出的数据,是 SCN=1085057 时刻的快照。Replicat 必须从 SCN=1085057 之后的日志开始读取,否则会重复应用 SCN≤1085057 的事务,导致主键冲突或数据重复。

4.2 OGG 初始化抽取法:热初始化(无停机)

当业务无法停写时,用 OGG 自身的SOURCEISTABLE模式做初始化。它不依赖数据库导出,而是用 Extract 进程直接读取表数据生成 Trail,再由 Replicat 应用。

# 源端(Windows)创建初始化 Extract GGSCI (WIN-SOURCE) 12> EDIT PARAMS init_t1
-- init_t1.prm EXTRACT init_t1 USERID goldengate, PASSWORD "GoldEng@2024" -- 目标端 MGR 地址 RMTHOST 10.0.100.141, MGRPORT 7809 -- 初始化 Trail 文件(前缀 i1,最大 999 个文件,每个 500MB) RMTFILE ./dirdat/i1, MAXFILES 999, MEGABYTES 500 -- 指定表,并用 AS OF SCN 保证一致性(SCN 从源库查得) TABLE test.t1, SQLPREDICATE 'AS OF SCN 1085057';
# 注册并启动初始化 Extract GGSCI (WIN-SOURCE) 13> ADD EXTRACT init_t1, SOURCEISTABLE GGSCI (WIN-SOURCE) 14> START EXTRACT init_t1 # 目标端创建 Special Run Replicat(一次性运行) GGSCI (test2) 7> ADD REPLICAT ri1, SPECIALRUN GGSCI (test2) 8> EDIT PARAMS ri1
-- ri1.prm SPECIALRUN END RUNTIME REPLICAT ri1 USERID goldengate, PASSWORD GoldEng@2024 -- 读取初始化 Trail 文件 EXTFILE ./dirdat/i1 -- 表映射 MAP test.t1, TARGET test.t1;
# 启动初始化 Replicat(自动运行完退出) GGSCI (test2) 9> START REPLICAT ri1

参数说明:

  • SOURCEISTABLE模式下 Extract 不读日志,而是像SELECT * FROM test.t1一样全表扫描;
  • SQLPREDICATE 'AS OF SCN 1085057'是 Oracle 闪回查询语法,确保读取 SCN=1085057 时刻的数据快照;
  • SPECIALRUNReplicat 是一次性进程,启动后自动读取i1文件并应用,完成后状态变为STOPPED。

4.3 避坑:初始化阶段三大玄学问题排查

现象原因解决
START REPLICAT repgs1, AFTERCSN 1085057后状态为ABENDED,日志报Invalid SCN输入的 SCN 在目标库归档日志中不存在(源库 SCN=1085057 的日志未传到目标端)执行GGSCI> VIEW REPORT repgs1查看详细错误;在源库执行SELECT NAME, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG WHERE FIRST_TIME > SYSDATE-1 ORDER BY FIRST_TIME;确认该 SCN 日志已归档;用SEND EXTRACT extgsxf, LOGSTAT查看 Extract 当前读取位置
初始化抽取init_t1运行缓慢,STATS init_t1显示Total reads: 0SQLPREDICATE语法错误,或表test.t1在源库不存在检查SQLPREDICATE是否多写了分号或引号;执行SELECT COUNT(*) FROM test.t1确认表存在且有数据;在init_t1.prm中临时加REPORTCOUNT EVERY 1 MINUTES查看进度
impdp导入后目标表数据为空,但日志显示Completed successfullyTABLE_EXISTS_ACTION=REPLACE会先 DROP 表,若表有外键约束,DROP 失败导致导入跳过导入前在目标库执行ALTER TABLE test.t1 DISABLE CONSTRAINT <constraint_name>;,导入完成后再ENABLE;或改用TABLE_EXISTS_ACTION=TRUNCATE(要求表结构完全一致)

5. DDL 同步深度配置:不只是DDL INCLUDE,还有脚本与权限陷阱

OGG 的 DDL 同步常被低估,但它决定了CREATE TABLE、ALTER INDEX等操作能否自动在目标库重建。单纯加DDL INCLUDE不够,必须配合数据库脚本和权限,否则 DDL 会静默失败。

5.1 源库 DDL 支持脚本执行:四步缺一不可

OGG 12.2 的 DDL 同步依赖四个核心脚本,必须按顺序、以SYS用户执行。Windows 下路径用反斜杠,但脚本内路径为 Linux 风格,OGG 会自动适配。

-- 在源库 sqlplus / as sysdba 中执行(Windows) -- 步骤1:Marker Setup(标记 DDL 操作的起始点) SQL> @D:\ogg\marker_setup.sql -- 步骤2:DDL Setup(创建 DDL 捕获表) SQL> @D:\ogg\ddl_setup.sql -- 步骤3:Role Setup(创建 GGS_GGSUSER_ROLE 角色) SQL> @D:\ogg\role_setup.sql -- 步骤4:授权角色给 OGG 用户 SQL> GRANT GGS_GGSUSER_ROLE TO GOLDENGATE; -- 步骤5:启用 DDL 捕获(关键!否则 DDL 不被记录) SQL> @D:\ogg\ddl_enable.sql

执行后验证:

  • 查询SELECT * FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE 'GGS_%';应看到GGS_MARKER,GGS_SETUP,GGS_DDL_HIST等表;
  • 查询SELECT STATUS FROM DBA_REGISTRY WHERE COMP_NAME='Oracle GoldenGate';应返回VALID。

5.2 性能优化:ddl_pin与dbmspool脚本

DDL 操作频繁时,ddl_setup.sql创建的对象可能被 Oracle LRU 算法从共享池中挤出,导致 DDL 解析变慢。需执行两个优化脚本:

-- 在源库执行(Windows) -- 步骤1:固定共享池对象(防止被挤出) SQL> @?/rdbms/admin/dbmspool.sql -- 注意:? 是 Oracle 内置变量,指向 $ORACLE_HOME/rdbms/admin -- 步骤2:Pin DDL 相关对象到共享池 SQL> @D:\ogg\ddl_pin.sql GOLDENGATE -- 参数为 OGG 用户名,必须大写

效果:执行后SELECT NAME, TYPE, SHARABLE_MEM FROM V$DB_OBJECT_CACHE WHERE NAME LIKE 'GGS%' AND TYPE='PACKAGE';应显示SHARABLE_MEM > 0,表示已固定。

5.3 DDL 同步参数详解:从INCLUDE MAPPED到EXCLUDE UNMAPPED

DDL INCLUDE MAPPED是基础,但生产环境需精细控制。以下参数组合可覆盖 95% 场景:

-- 在 Extract 和 Replicat 参数文件中统一配置 DDL INCLUDE MAPPED, OBJTYPE 'TABLE' DDL INCLUDE MAPPED, OBJTYPE 'INDEX' DDL INCLUDE MAPPED, OBJTYPE 'CONSTRAINT' DDL INCLUDE MAPPED, OBJTYPE 'SEQUENCE' -- 排除高风险 DDL(如 DROP DATABASE) DDL EXCLUDE UNMAPPED, OBJTYPE 'DATABASE' -- 排除特定用户(如不希望同步 DBA 用户的 DDL) DDL EXCLUDE SCHEMA 'SYS', OBJTYPE 'TABLE' -- 记录所有 DDL 到报告(调试用) DDLOPTIONS REPORT -- 自动为新建表添加补充日志(避免手动 ADD TRANDATA) DDLOPTIONS ADDTRANDATA

逻辑说明:

  • MAPPED表示只同步MAP语句中定义的表(如MAP test.*, TARGET test.*),未映射的表 DDL 被忽略;
  • UNMAPPED表示同步所有未在MAP中定义的 DDL,慎用;
  • DDLOPTIONS ADDTRANDATA是“后悔药”,当新表被CREATE TABLE后,OGG 自动执行ADD TRANDATA,无需人工干预。

5.4 避坑:DDL 同步失效的五个致命点

现象原因解决
源库执行CREATE TABLE test.t2 (...),目标库无反应,ggserr.log无 DDL 相关日志ddl_enable.sql未执行,或执行后未重启 Extract 进程执行GGSCI> INFO EXTRACT extgsxf, DETAIL查看DDL replication是否为Enabled;若为Disabled,执行STOP EXTRACT extgsxf→START EXTRACT extgsxf重启
ALTER TABLE test.t1 ADD COLUMN c2 VARCHAR2(10)同步到目标库后,新列值全为 NULL源库ADD COLUMN未指定DEFAULT,OGG 将新列视为NULLABLE,但目标库表结构未更新在目标库

本文还有配套的精品资源,点击获取

返回列表