ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OGG 11.2.1.0.3 安装配置实战:Oracle 11g 准实时同步

OGG 11.2.1.0.3 安装配置实战:Oracle 11g 准实时同步

简介:这是一套面向Oracle数据库管理员、数据集成与灾备工程师的Oracle GoldenGate 11.2.1.0.3 for Oracle 11g Windows x64资源包,用于在Windows Server 2003/2008环境中实现低延迟的实时数据抽取、传输与复制,解决数据迁移、灾备、报表分流等多场景同步需求。压缩包共185个文件,大小34.1MB,以52个jar组件、38个SQL脚本、17个exe程序、12个dll依赖库为主体,同时包含txt文档、XML配置、平台适配脚本及官方说明,覆盖GoldenGate抽取、数据泵、复制和管理台等核心模块的安装与运维素材。资源中另附AIX、HP-UX、Solaris、Linux等平台脚本,并提供了C语言接口示例和VC工程文件,方便有二次开发需求的工程师参考。包内组件与样例脚本能够帮助读者理解逻辑日志读取、trail文件、冲突检测等运行机制,并通过自带文档掌握参数配置、字符集转换和日志诊断方法,为部署与排错提供完整思路。已有1413人学习下载,适合从零搭建GoldenGate环境或解决同步故障的实践场景。

1. 为什么现在还要装 GoldenGate 11.2.1.0.3:老 11g 的准实时同步出路

Oracle GoldenGate 11.2.1.0.3 for Oracle 11g windows_x64 这个安装包,表面上是两个大版本号拼在一起,实际上是很多老企业系统绕不开的准实时同步方案入口。我接过不少维护单子:核心库还是 Oracle 11g,跑在 Windows Server x64 上,业务侧突然要一个实时报表库,或者要往数仓里灌数据。Oracle 自带的主备、Data Guard 解决不了异构或跨库同步,双写又怕分布式事务翻车,最后绕一圈还是回到 GoldenGate。这个版本虽然是 2012 年前后的产物,但官方兼容矩阵里明明白白写着它支持 Oracle 11g,而且新版本的 OGG 反而逐步收窄了对 11g 的支持范围。与其折腾“新版能不能兼容老库”的黑匣子,不如直接把 11.2.1.0.3 这套组合吃透。适合谁:手上有老库要同步的 DBA,做数据迁移的工程师,还有要给客户找“合规又便宜”方案的顾问。本文把这套组合从解压安装到跑通最小链路讲清楚,坑在哪里,哪些参数别乱动,一次说透。

2. 安装前的四件事:版本匹配、目录规划、环境变量与 Windows 服务账号

2.1 版本号里藏着什么:11.2.1.0.3 与 Oracle 11g 的兼容边界

OGG 版本号不是乱写的。11.2.1.0.3 里,前段是 OGG 产品大版本 11.2,中段是维护版本 1,后段 .0.3 是补丁序号。这个版本对应的数据库支持范围,横跨 Oracle 10g 和 11g,对 11.2.0.x 的兼容性最好。你拿着这套安装包配 Oracle 11g windows_x64,属于官方认证过的标准组合,不是玄学碰运气。

兼容矩阵里真正要盯的是三条边界:数据库必须是 64 位 Oracle 11g;操作系统必须是 x64 的 Windows Server(2008 R2 到 2012 R2 都有人用,但别放 32 位);OGG 的 11.2.1.0.3 不支持源端和目标端数据库版本跨度过大,比如源库是 11g、目标库已经是 19c 这种场景,建议先把某一边降到对等再谈同步。我见过有人拿 12.3 的 OGG 去连 11g 源库,进程起得来但抽取日志错乱,最后查文档才发现官方从 12.2 开始就不再对 11g 做认证。版本边界这个事,必须在一开始就卡住。

OGG 版本支持的 Oracle 数据库版本平台要求备注
11.2.1.0.3Oracle 10g、11g(11.2.0.x)Windows x64老库首选
12.1.xOracle 11g、12cWindows x64需额外打补丁
12.3+主要支持 12c/18c跨平台较多对 11g 兼容性缩窄

2.2 目录规划与文件下载:别把安装包直接丢在 C 盘根目录

GoldenGate 11.2.1.0.3 在 Windows 上不是传统意义上的“安装程序”,更像解压即用的绿色软件。官网下载回来是个 zip 包,解压后里面已经有 ggsci.exe、extract.exe、replicat.exe、mgr.exe 这些可执行文件。但解压位置有讲究:路径不能带空格,不能放 C:\Program Files,否则后续很多脚本会找不对目录。

我一般会建一个干净的目录,比如 D:\oracle\ogg,整个 OGG 文件树都放在这里。D 盘和 C 盘分开,一是避免系统盘空间不足,二是 Windows 更新或系统还原不会把你的进程文件搞乱。解压之后的目录里,比较关键的是 ggsci.exe(命令行入口)、dirprm(参数文件目录)、dirrpt(进程报告目录)、dirdat(存放 trail 文件,也就是同步数据的落地区)。初次运行 ggsci 前,这些子目录有些是空的,有些需要手动建好。反正记住一条:整个 D:\oracle\ogg 的写入权限要完整,别用只读权限跑。

2.3 Windows 服务账号与防火墙:两个决定成败的细节

OGG 的 Manager 进程在 Windows 上是要常驻后台的,不能靠双击一个黑窗口一直挂着。常见做法是把它注册成 Windows 服务,服务账号单独建一个,别图省事用 Administrator 或 SYSTEM。原因很简单:SYSTEM 账号做服务时,权限太大,万一抽取进程配置错误,影响面会波及整个机器;而 Administrator 如果被组策略限制“禁止本地登录”,服务反而起不来。我习惯建一个 ogg_svc 账号,只给它“作为服务登录”的权利,密码策略设成永不过期。

第二个细节是防火墙和端口。Manager 默认监听 7809 端口,生产环境要用动态端口段时,一般还会给 Manager 配 7800-7820 的 DYNAMICPORTLIST。Windows 防火墙默认会拦入站连接,安装完第一件事就是把这两个端口段加进防火墙入站规则。如果目标库和源库不在同一台机器,目标机的防火墙也要放行对应端口,否则远程投递进程 STATUS 永远是 “remote host connection refused”。这一步是纯操作层面,但也是部署失败率最高的地方。

3. 把 OGG 真正装起来:解压、GLOBALS、启动 Manager 的最小命令串

3.1 解压及目录初始化:一次性把文件放对位置

在 Windows 上解压 zip 包,有人喜欢右键解压到当前文件夹,结果目录名字带版本号,路径变成 D:\oracle\OGG_1121010_windows_x64,这种长路径后面写脚本很难受。我建议先建好 D:\oracle\ogg,再把安装包内容直接解压到这个目录里。用 PowerShell 或者 tar 命令都可以:

# 先确保目标目录存在 mkdir D:\oracle\ogg # 解压安装包,假设安装包放在 D:\soft 下 cd D:\soft tar -xf OGG_1121010_windows_x64.zip -C D:\oracle\ogg # 顺手把目录加到系统 PATH,方便后续敲命令 setx PATH "%PATH%;D:\oracle\ogg"

tar 命令在 Windows 10 之后自带,Windows Server 2008 R2 上如果没有 tar,就用解压工具或者 PowerShell 的 Expand-Archive。解压完成后,进 D:\oracle\ogg 看一眼有没有 ggsci.exe。有就说明包解对了。同时确认 dirdat、dirprm、dirrpt 这几个目录存在,如果缺,手动建出来,否则后面 ADD EXTRACT 时容易报“无法创建 trail 文件”。

PATH 环境变量的设置要留意:setx 会把当前 PATH 追加到系统变量里,如果你之前的 PATH 里有相对路径,会残留下来。我见过一个环境,PATH 被 setx 搞得乱七八糟,GGSCI 是起来了,但 ODBC 驱动找不到。稳妥一点是先echo %PATH%备份,再追加。

3.2 配置 GLOBALS:让 OGG 知道它要写进哪个 Oracle Schema

OGG 在运行时需要在数据库里维护自己的元数据表,比如用于心跳检查。它把这些对象放在哪个用户下面,由 GLOBALS 文件决定。打开命令行的方式,不是跑到安装目录里乱点,而是用 ggsci 的交互式命令:

cd D:\oracle\ogg ggsci # 进入 GGSCI 提示符后,新建并编辑 GLOBALS 文件 GGSCI> EDIT PARAMS ./GLOBALS

编辑窗口打开一个空白文件,写入一行配置:GGSCHEMA oggadmin。保存退出后,GLOBALS 文件就生效了。这个 oggadmin 是你要在源库和目标库里预先建好的数据库账号,后面抽取、投递进程都用它连接 Oracle。注意:GLOBALS 文件必须在 ogg 安装根目录下,文件名不带任何扩展名,路径别写错。

有的文档会建议把 GGSCHEMA 配成和数据库账号一样的名字,我这里就是这么用的。配置完后,先别急着启动任何进程,后面章节会用到。这个文件是整个 OGG 实例里为数不多改一次就行的全局配置,以后调整的机会很少。

3.3 启动 Manager 进程:第一条真正跑起来的命令

Manager 是 OGG 的老大进程,负责拉起、监控、重启其他所有进程。启动它之前,先确认 Manager 参数文件内容是对的。用 GGSCI 编辑 Manager 参数:

GGSCI> EDIT PARAMS MGR

写入一个最简配置:

PORT 7809 DYNAMICPORTLIST 7800-7820 AUTOSTART ER * AUTORESTART ER *, RETRIES 3, WAITMINUTES 5

PORT 是 Manager 的主端口,投递端的 RMTHOST 参数会引用它。DYNAMICPORTLIST 是给抽取和投递进程之间传输数据用的动态端口,防火墙记得放行。AUTOSTART ER * 表示 Manager 启动后自动拉起所有 Extract 和 Replicat 进程,AUTORESTART 让进程异常退出时自动重试 3 次,间隔 5 分钟。

保存后,在 GGSCI 里执行:

GGSCI> START MANAGER GGSCI> INFO ALL

INFO ALL 的输出里,Manager 这一行状态应该是 RUNNING。如果 RR 状态,说明没起来,直接去 dirrpt 下看 MGR.rpt 文件,里面会写端口被占用还是目录权限不行。这一步跑通,整个 OGG 安装阶段就算过了,下一步才是把业务数据真正抽起来。

4. 配置一条最小抽投链路:从 EXTRACT 到 REPLICAT 的完整命令

4.1 在源库创建 OGG 账号并配置抽取进程

先把源库的 OGG 账号建好。这里我直接以 oggadmin 为例,用 SQL*Plus 或任何你习惯的数据库客户端执行:

CREATE USER oggadmin IDENTIFIED BY oggadmin DEFAULT TABLESPACE users QUOTA UNLIMITED ON users; GRANT CONNECT, RESOURCE, DBA TO oggadmin; ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE;

生产环境不建议直接给 DBA,但 11.2.1.0.3 这个老版本,细粒度权限经常踩坑,我一般先用 DBA 把链路跑通,再按官方权限清单收敛。如果源库没开强制日志,抽到一半日志被归档覆盖,进程就 ABEND。所以紧接着执行:

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; ALTER SYSTEM FORCE LOGGING;

然后切回 GGSCI,登录数据库并创建抽取进程:

GGSCI> DBLOGIN USERID oggadmin@orcl, PASSWORD oggadmin GGSCI> ADD EXTRACT ext1, TRANLOG, BEGIN NOW GGSCI> ADD EXTTRAIL D:\oracle\ogg\dirdat\lt, EXTRACT ext1

ADD EXTRACT 的 TRANLOG 表示这是从 Oracle 日志(redo/archive)里抽取数据;BEGIN NOW 表示从当前日志位置开始,而不是从某个时间点回放。ADD EXTTRAIL 则把抽取出来的数据写到本地 trail 文件,dirdat\lt 是文件前缀,OGG 会在后面自动追加序号。这里要注意 EXTRACT ext1 这个名字必须跟 ADD EXTRACT 时保持一致,写错一个字母后面 START 就找不到进程。

4.2 配置抽取参数文件:让 OGG 知道抽哪些表

进程创建了,但参数文件还没写。EDIT PARAMS ext1 打开抽取进程的参数文件,内容如下:

EXTRACT ext1 USERID oggadmin@orcl, PASSWORD oggadmin REPORTCOUNT EVERY 10000 ROWS EXTTRAIL D:\oracle\ogg\dirdat\lt TABLE hr.employees; TABLE hr.departments;

EXTRACT 行说明自己是哪个进程,USERID 是源库连接凭据。REPORTCOUNT 每处理一万行出一行日志,方便观察同步进度。EXTTRAIL 必须和 ADD EXTTRAIL 时指定的路径一致。TABLE 语句列出要同步的表,最简单直接,后续加表就在参数文件里追加一行,重启进程生效。

同步对象少的话,参数文件就这些内容。参数文件里所有路径,OGG 在 Windows 上会原样解析,路径分隔符用反斜杠没问题。如果你拿 Linux 上的配置模板过来,记得把正斜杠替换掉,否则会提示“找不到 trail 文件”。

之后启动抽取进程:

GGSCI> START EXTRACT ext1 GGSCI> INFO EXTRACT ext1

INFO 输出会显示进程状态从 STARTING 变成 RUNNING,位置信息会不断刷新。

4.3 配置目标端 Replicat:把 trail 文件应用进目标库

目标端如果是同一台机器,只是为了先验证链路,直接在同一个 OGG 实例里再加一个 Replicat 进程。目标库也需要建一个 oggadmin 账号,和源库步骤一致。然后创建 Replicat 进程:

GGSCI> DBLOGIN USERID oggadmin@orcl, PASSWORD oggadmin GGSCI> ADD REPLICAT rep1, EXTTRAIL D:\oracle\ogg\dirdat\lt

这里有个细节:ADD REPLICAT 的 EXTTRAIL 指向的是源端抽取进程写出来的 trail 文件。同机演示时,replicat 直接读源端 trail;两台机器的话,一般会在中间加一个 Data Pump 进程把 trail 传到目标机。参数文件 rep1 这样写:

REPLICAT rep1 USERID oggadmin@orcl, PASSWORD oggadmin ASSUMETARGETDEF REPERROR (DEFAULT, ABEND) MAP hr.employees, TARGET hr.employees; MAP hr.departments, TARGET hr.departments;

ASSUMETARGETDEF 表示目标表结构和源表一致,不做列映射匹配;只要表结构有一点差异,它会报列缺失,这时候要换成 DEFGEN 生成定义文件。REPERROR 让进程在遇到未知错误时无条件 ABEND,这样问题能被立刻发现,不会被吞到数据对账才发现。MAP 语句是源表到目标表的映射,两端库名一致就可以这样简写。

配置完启动 rep1,再在源库往 hr.employees 里插一条数据,一到两秒后查目标库,数据能查到,说明最小链路已经通了。整个过程整理下来就是:

进程作用关键命令
Manager统一管理所有 OGG 进程START MANAGER
Extract从源库日志抽取ADD EXTRACT / START EXTRACT
Trail 文件承载中间数据ADD EXTTRAIL
Replicat应用到目标库ADD REPLICAT / START REPLICAT

4.4 两台机器时加一个 Data Pump:网络传输的关键补充

如果源库和目标库不在同一台机器,链路中间还需要一个 Data Pump 进程。Pump 本质上也叫 Extract,但它读的不是数据库日志,而是本地 trail 文件,然后通过网络把数据投递到远程目标机。创建方式:

GGSCI> ADD EXTRACT pump1, EXTTRAILSOURCE D:\oracle\ogg\dirdat\lt GGSCI> ADD RMTTRAIL /dirdat/rt, EXTRACT pump1

EXTTRAILSOURCE 指向源端 extract 进程写的本地 trail 文件;ADD RMTTRAIL 里 /dirdat/rt 是目标机上最终落地的 trail 文件路径,注意正斜杠是远程路径的写法,目标机上的 OGG 目录如果是 D:\oracle\ogg,这里就要写 D:/oracle/ogg/dirdat/rt。pump 参数文件如下:

EXTRACT pump1 PASSTHRU RMTHOST 192.168.10.20, MGRPORT 7809 RMTTRAIL /dirdat/rt TABLE hr.employees; TABLE hr.departments;

PASSTHRU 表示 pump 不解析数据内容,只负责搬运,能显著降低网络传输开销。RMTHOST 是目标机 IP 和 Manager 端口,目标机防火墙没放行的话,pump 会一直停在 “remote host not found”。这个架构是生产环境最标准的形态,先同机跑通,再拆到两台机器,排错范围会清晰很多。

5. 避坑指南:OGG 在 Windows 上最常遇到的 5 类问题与处理

5.1 现象:ggsci 双击闪退,或提示“无法定位程序输入点”

第一次解压完双击 ggsci.exe,黑窗口一闪就没了,这是 Windows 上最经典的翻车现场。原因一般是系统缺少 VC++ 运行库,OGG 11.2.1.0.3 编译时依赖的是老版本运行库,新装的 Windows Server 默认不带。解决方法是安装对应年份的 VC++ 2008/2010 x64 运行库,两个装完重新打开 ggsci。还不行就查事件查看器,看应用程序日志里具体是哪条 DLL 加载失败,缺哪个补哪个。装完运行库之后,这个版本在 Windows Server 2012 R2 上都能稳定跑,不用追求太新的系统。

5.2 现象:Manager 端口起不来,日志提示 bind 失败

START MANAGER 后,INFO ALL 看到 Manager 状态一直是 RR,或者直接没进程。打开 dirrpt\MGR.rpt 日志,最常见的是 7809 端口被占用。Windows 上有些监控软件也会乱抢端口,先确认:

netstat -ano | findstr 7809

看占用端口的 PID 是什么程序。如果是残留的 OGG 进程,任务管理器里结束掉;如果是别的软件占用,最省事的办法是改 Manager 端口。EDIT PARAMS MGR,把 PORT 改成 8029,同时把 DYNAMICPORTLIST 改成 8000-8020,重启动 Manager。改完端口后,凡是涉及 RMTHOST 的远程配置,MGRPORT 都要跟着改,否则 pump 永远连不上。

5.3 现象:抽取进程 START 后立刻 ABEND,日志里全是 ORA- 权限错误

ADD EXTRACT 成功,但 START EXTRACT ext1 之后,进程几秒钟就变 ABEND。查看 dirrpt\ext1.rpt,常见两个原因:一是 oggadmin 用户权限不够,二是源库没开补充日志。OGG 11.2.1.0.3 对权限检查很严格,缺 DBA 角色会出现 ORA-01031 或 OGG-00446。解决方法是回到数据库执行:

GRANT dba TO oggadmin; ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; ALTER SYSTEM FORCE LOGGING;

改完权限后,执行START EXTRACT ext1之前,最好先STOP EXTRACT ext1,然后ALTER EXTRACT ext1, TRANLOG, BEGIN NOW重新定位日志起点。权限问题是这个版本最折磨人的地方,之前某客户环境里就是因为监控系统定期回收权限,导致 extract 每两周就 ABEND 一次,后来排查报告才知道是权限被运维策略自动回收。

5.4 现象:表同步成功,但中文数据全是乱码

源库和目标库字符集不一致时,replicat 不会报错,数据能进去,但中文全部变成问号或乱码。OGG 在 Windows 上默认从系统代码页读环境变量,不显式设置的话,中文字符在传输过程中就丢了。解决办法是在 ext1.prm 和 rep1.prm 的开头都加上:

SETENV (NLS_LANG = AMERICAN_AMERICA.ZHS16GBK)

如果两边数据库字符集是 AL32UTF8,就把 ZHS16GBK 换成 AL32UTF8。关键点是源端写上源库的字符集,目标端写上目标库的字符集,不能图省事两端写一样。改完参数文件后,STOP 两个进程,再 START,乱码问题基本消失。另外 Windows 系统区域设置如果默认是中文,有时 NLS_LANG 会被系统强制覆盖,SETENV 是进程级配置,能压住系统设置。

5.5 现象:Windows 重启后,所有 OGG 进程全部消失

OGG 解压后的进程默认是控制台程序,Windows 一重启,没人拉起它们,同步就断了。血泪经验:一定要在装完就把 Manager 注册成 Windows 服务,并设成自动启动。做法是在安装目录里找自带的安装脚本,不同版本名字略有差异,常见的会提供一个 install 相关的命令。如果没有就手动注册:

sc.exe create OGG_MGR start= auto binPath= "D:\oracle\ogg\mgr.exe -service"

注意 sc.exe 的语法在 binPath 和参数之间要留空格,等号后面也要加空格。注册完后在 services.msc 里确认 OGG_MGR 的启动类型是“自动”,再用这个服务账号手动启动一次。如果服务起来又立即停止,去事件查看器看系统日志,常见原因是服务账号没有“作为服务登录”的权限,给上权限再重启服务就好了。我建议注册完服务后主动重启一次服务器验证,别等到生产停机才发现没人管。

6. 把 OGG 用成应急切换工具:切换演练和监控检查单

做同步不是为了“看着它在跑”,而是要在切换窗口里敢切、能切。我自己的习惯是给每个 OGG 实例准备一段静默命令,放进 Windows 计划任务里做日常巡检。GGSCI 支持从标准输入读命令,所以一条管道命令就能批量查状态:

cd /d D:\oracle\ogg echo INFO ALL | ggsci echo LAG EXTRACT ext1 | ggsci echo LAG REPLICAT rep1 | ggsci

LAG 命令输出的秒数代表延迟多少,源端一有业务写入,这个数字应该在几十秒内归零。如果持续上涨,说明目标端回放慢,或者网络带宽卡住了 pump。把这条命令写进一个 .bat,挂到任务计划里每小时跑一次,日志追加到文本文件,监控问题就能做到 24 小时内发现。

切换演练的操作顺序很固定,先 STOP REPLICAT 暂停回放,等 extract 的 lag 归零后,STOP EXTRACT,再批量比对源端和目标端表数据。比对脚本我用的是:源端和目标端各导出一份主键哈希,diff 一下结果集。不要只对行数,行数一致但内容不同才是同步软件最怕的坑。演练时故意插入一条测试数据,确认目标端出现,再反向测试 DELETE 和 UPDATE,验证 trail 文件里所有操作类型都过去了。

我自己在一个模拟项目上踩过最深的坑,是漏了补充日志,切换演练时数据对不上,从晚上十点排查到凌晨四点,最后发现是源库的参数在维护时被顺手关掉了。那以后我把检查项固定在切换清单里:补充日志、OGG 账号权限、两端口放行、服务自启动,这四项每次都过一遍。同步工具不是装完就一劳永逸,它和数据库参数、Windows 服务、网络策略纠缠在一起,任何一个变化都可能让链路悄悄断掉。希望这个清单和这套最小链路能帮你少走几个通宵,也希望这些经验真的帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进