简介:这份PDF文档面向Oracle DBA与数据同步运维人员,系统讲解如何用Oracle GoldenGate 12.2.0.2实现Windows源库到Linux目标库的跨平台数据同步,适合具备一定Oracle基础、需要落地异构环境实时复制方案的技术人员参考。资源包仅含1个PDF文件,约496KB,内容以图文与SQL命令结合的方式组织,涵盖源库归档模式、强制日志、附加日志与goldengate用户赋权,目标库权限差异,以及OGG解压安装、create subdirs、GLOBALS与checkpoint表配置、Manager、Extractor、Replicat组件设置和监控维护等完整链路。读者可据此获得一套可对照执行的部署流程与排错思路,快速理解跨操作系统同步的关键配置点。目前已有295人学习下载。
1. Oracle OGG安装部署细说:Windows同步到Linux,跨平台这条链路到底难在哪
很多团队第一次做 Oracle OGG(Oracle GoldenGate)跨平台同步,都是被一个很朴素的需求逼出来的:核心库在 Windows Server 上跑着,新上的报表库、数据中台或者国产化 Linux 环境要实时拿数据,停机窗口又给不出来。于是「Windows 抽、Linux 投」这条链路就成了绕不开的活。它难的不是 OGG 本身,而是跨平台带来的字符集、路径、大小写、时区和版本对齐问题,任何一个没对齐,抽取进程能起、投递进程能起,数据就是不动,日志里还只给你一句含糊的报错。
这篇讲的就是这条链路怎么从零装起来、参数怎么设、坑在哪。适合手上有一台 Windows 源库、一台 Linux 目标库,需要做准实时同步的 DBA 和运维。下面按「先想清楚架构 → 装软件 → 配抽取 → 配投递 → 排错 → 验证」的顺序走,每一步都给到能抄的命令和参数。OGG 的版本差异不小,我下面以 19c 系列为主线,12c/21c 的差异会单独点出来,你按自己手上的版本对号入座。
2. 跨平台同步的架构选型:为什么是抽取投递而不是 Data Pump
2.1 先分清 OGG 的两种部署形态
Oracle GoldenGate 落地时,第一件事是决定用哪种形态。常见的有两种:一种是经典架构(Classic Architecture),抽取进程(Extract)直接读源库的在线日志或归档日志,投递进程(Replicat)通过 SQL 应用到目标库;另一种是微服务架构(Microservices Architecture),把 OGG 拆成 Service Manager、Administration Server、Distribution Server 等一堆组件,用 Web 界面管。
跨平台 Windows 到 Linux 这个场景,我一般推荐经典架构。原因很直接:微服务架构对目标端的部署环境要求更高,Windows 端做抽取时组件依赖多,出问题排查链路长;而经典架构的 Extract 和 Replicat 都是命令行进程,日志清晰,跨平台时字符集和路径问题更容易定位。除非你已经有统一的 OGG 微服务管控平台,否则别给自己加戏。
经典架构下,这条链路的核心进程是三个:
- Extract(抽取进程):跑在 Windows 源库,读 redo/archive log,把变更写成 trail 文件。
- Data Pump(抽取投递进程):可选,跑在源端,把本地 trail 通过网络传到目标端。数据量大、网络不稳时建议单独拆出来。
- Replicat(复制进程):跑在 Linux 目标库,读 trail,转成 SQL 应用到目标表。
2.2 跨平台必须提前确认的四件事
在动手装之前,有四件事必须先确认,否则后面全是返工。
第一,源库和目标库的字符集。Windows 上 Oracle 常见的是 ZHS16GBK 或 AL32UTF8,Linux 上现在基本都是 AL32UTF8。如果源是 GBK、目标是 UTF8,OGG 本身不做字符集转换,你得靠数据库的字符集转换或者额外配置,中文乱码就是这么来的。查字符集:
-- 源库和目标库都执行,对比结果 SELECT parameter, value FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');第二,数据库版本和 OGG 版本。OGG 的版本要能兼容源库和目标库的 Oracle 版本。19c 的 OGG 可以对接 11g 到 19c 的库,但如果你源库是 11.2.0.4,目标库是 19c,OGG 版本要选能同时覆盖两端的。别拿一个只支持 19c 的 OGG 去连 11g 源库。
第三,时区。Windows 和 Linux 的时区设置经常不一致,跨平台同步时如果表里有 timestamp 字段,可能出现时间偏移。确认两端:
# Linux 端 timedatectl # Windows 端在 cmd 里 tzutil /g第四,网络和端口。OGG 的 Manager 进程默认监听 7809 端口,源端和目标端要能互通。Windows 防火墙默认拦入站,Linux 的 firewalld 或 iptables 也要放行。这一步不做,后面 Manager 起不来你会以为是软件问题。
2.3 目录规划:别把 OGG 装在系统盘
Windows 端我一般把 OGG 装在非系统盘,比如D:\ogg19c,因为 trail 文件会持续增长,系统盘写满会拖垮整个服务器。Linux 端装在/u01/ogg这类独立挂载点,别放/root或/home。
目录结构大致这样规划:
| 目录用途 | Windows 示例 | Linux 示例 |
|---|---|---|
| OGG 安装目录 | D:\ogg19c | /u01/ogg |
| trail 文件目录 | D:\ogg19c\dirdat | /u01/ogg/dirdat |
| 参数文件目录 | D:\ogg19c\dirprm | /u01/ogg/dirprm |
| 日志目录 | D:\ogg19c\dirrpt | /u01/ogg/dirrpt |
trail 文件的命名规则两端要一致,比如都用两个字符前缀lt,后面跟 6 位序号。这个前缀在抽取进程参数里定义,投递进程读的时候要对上。
3. Windows 源端安装与抽取进程配置
3.1 Windows 上装 OGG 的完整步骤
Windows 端安装 OGG 相对简单,但有几个细节容易翻车。
第一步,解压安装包。OGG 的 Windows 版是个 zip 包,解压到你规划的目录,比如D:\ogg19c。解压后目录里应该有ggsci.exe、extract.exe、mgr.exe这些可执行文件。
第二步,设置环境变量。OGG 依赖 Oracle 客户端或者数据库的库文件,需要把 Oracle 的bin目录加到 PATH 里。在系统环境变量里加:
ORACLE_HOME=D:\app\oracle\product\19c\dbhome_1 PATH=%ORACLE_HOME%\bin;%PATH%第三步,创建 OGG 的子目录。OGG 不会自动建所有目录,手动建好:
# 在 OGG 安装目录下执行 mkdir dirdat dirprm dirrpt dirchk第四步,用 ggsci 创建 Manager 参数文件。在dirprm下建mgr.prm:
PORT 7809 DYNAMICPORTLIST 7810-7820 AUTOSTART EXTRACT * AUTORESTART EXTRACT *, RETRIES 5, WAITMINUTES 3 PURGEOLDEXTRACTS D:\ogg19c\dirdat\lt*, USECHECKPOINTS, MINKEEPHOURS 24这里PORT 7809是 Manager 监听端口,DYNAMICPORTLIST是给抽取进程动态分配的端口范围,AUTORESTART让抽取进程挂了自动重启,PURGEOLDEXTRACTS自动清理超过 24 小时的 trail 文件,防止磁盘写满。
第五步,启动 Manager:
# 进入 OGG 目录,执行 ggsci GGSCI> start manager GGSCI> info managerinfo manager能看到Manager is running就说明起来了。如果报端口被占用,用netstat -ano | findstr 7809查一下谁占了。
3.2 配置抽取进程:从表级到库级
抽取进程的配置分两步:先写参数文件,再在 ggsci 里 add extract。
先建参数文件dirprm\ext1.prm:
EXTRACT ext1 SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8") USERIDALIAS ogg_src DOMAIN OracleGoldenGate EXTTRAIL D:\ogg19c\dirdat\lt TABLE hr.employees; TABLE hr.departments;这里几个关键点。SETENV (NLS_LANG ...)必须和源库字符集一致,源库是 GBK 就写ZHS16GBK,写错了抽取出来的中文就是乱码。USERIDALIAS是 12c 以后的写法,用凭证别名,不再明文写用户名密码;如果是 11g 的 OGG,得用USERID ogg_user, PASSWORD xxx。
EXTTRAIL指定 trail 文件路径和前缀,lt就是前缀。TABLE指定要抽取的表,可以写具体表,也可以写TABLE hr.*;抽整个 schema。
然后在 ggsci 里注册并启动:
GGSCI> dblogin useridalias ogg_src DOMAIN OracleGoldenGate GGSCI> add extract ext1, tranlog, begin now GGSCI> add exttrail D:\ogg19c\dirdat\lt, extract ext1 GGSCI> start extract ext1 GGSCI> info extract ext1add extract ext1, tranlog, begin now表示从当前时间点开始读在线日志。如果要补历史数据,把begin now换成begin 2024-01-01 00:00:00。add exttrail把 trail 文件和抽取进程关联起来。
3.3 抽取进程的参数调优与常见报错
抽取进程起来后,用info extract ext1看状态,view report ext1看详细日志。几个常见问题:
报 OGG-00446 找不到归档日志。原因是抽取进程要读的归档日志已经被删了。解决方法是确认源库的归档保留策略,或者用begin指定一个还在的 SCN 重新开始。
报 OGG-01028 无法打开 trail 文件。多半是目录权限问题,Windows 上确认 OGG 进程的运行账户对dirdat目录有写权限。
抽取延迟越来越大。看info extract ext1里的Lag at Chkpt和Time Since Chkpt。如果延迟持续增长,可能是源库日志切换太频繁,或者抽取进程的TRANLOGOPTIONS没配好。可以加:
TRANLOGOPTIONS CONVERTUCS2CLOBS TRANLOGOPTIONS DBLOGREADERDBLOGREADER让抽取进程用数据库的 logminer 读日志,比直接读文件更稳,但会占用源库资源。
提示:抽取进程的
SETENV NLS_LANG一定要和源库字符集严格一致,这是跨平台中文乱码的头号原因,没有之一。
4. Linux 目标端安装与投递进程配置
4.1 Linux 上装 OGG 的完整步骤
Linux 端安装 OGG 和 Windows 类似,但多了权限和依赖的坑。
第一步,上传安装包并解压。OGG 的 Linux 版是个 tar 包:
mkdir -p /u01/ogg tar -xvf ogg19c_linux_x64.tar -C /u01/ogg cd /u01/ogg ls -l解压后应该有ggsci、extract、replicat、mgr这些文件。
第二步,设置环境变量。在~/.bash_profile里加:
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/u01/ogg:$LD_LIBRARY_PATH export PATH=$ORACLE_HOME/bin:/u01/ogg:$PATH export NLS_LANG=AMERICAN_AMERICA.AL32UTF8LD_LIBRARY_PATH必须包含 OGG 目录和 Oracle 的 lib 目录,否则 ggsci 启动会报找不到库。
第三步,建目录并启动 Manager。和 Windows 一样,先建dirdat、dirprm、dirrpt、dirchk,然后写mgr.prm:
PORT 7809 DYNAMICPORTLIST 7810-7820 AUTORESTART REPLICAT *, RETRIES 5, WAITMINUTES 3 PURGEOLDEXTRACTS /u01/ogg/dirdat/lt*, USECHECKPOINTS, MINKEEPHOURS 24启动:
cd /u01/ogg ./ggsci GGSCI> start manager GGSCI> info manager4.2 配置投递进程:Replicat 的参数怎么写
Replicat 的配置比 Extract 多一个环节:要先定义 trail 的来源。如果源端用了 Data Pump,目标端的 Replicat 直接读传过来的 trail;如果没用 Data Pump,Replicat 通过网络直接读源端的 trail。
先建 Replicat 参数文件dirprm\rep1.prm:
REPLICAT rep1 SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8") USERIDALIAS ogg_tgt DOMAIN OracleGoldenGate ASSUMETARGETDEFS DISCARDFILE /u01/ogg/dirrpt/rep1.dsc, APPEND, MEGABYTES 100 MAP hr.employees, TARGET hr.employees; MAP hr.departments, TARGET hr.departments;ASSUMETARGETDEFS表示源表和目标表结构完全一致,不用额外的定义文件。如果结构不一致,得用SOURCEDEFS指定定义文件。DISCARDFILE是丢弃记录的文件,应用失败的记录会写到这里,排查问题时必看。
在 ggsci 里注册并启动:
GGSCI> dblogin useridalias ogg_tgt DOMAIN OracleGoldenGate GGSCI> add replicat rep1, exttrail /u01/ogg/dirdat/lt GGSCI> start replicat rep1 GGSCI> info replicat rep1add replicat rep1, exttrail /u01/ogg/dirdat/lt里的路径要和源端 trail 的路径对应。如果用了 Data Pump,这里读的是目标端本地路径;如果没用,路径要写成源端的路径,并且 Replicat 要能通过网络访问。
4.3 目标端字符集和大小写敏感的处理
跨平台最容易出问题的就是这里。Windows 上 Oracle 默认对表名、字段名大小写不敏感,Linux 上如果建库时用了大小写敏感的配置,OGG 应用时可能报「表不存在」。
处理办法是在 Replicat 参数里加:
SQLEXEC "ALTER SESSION SET NLS_COMP=LINGUISTIC" SQLEXEC "ALTER SESSION SET NLS_SORT=BINARY_CI"或者在 MAP 语句里显式指定大小写:
MAP hr.employees, TARGET hr.employees, COLMAP (USEDEFAULTS);字符集方面,如果源库是 GBK、目标库是 UTF8,Replicat 的SETENV NLS_LANG要设成目标库的字符集,同时确认源端抽取时已经按源库字符集正确解析。两端字符集不一致时,最稳的做法是让源库和目标库都用 AL32UTF8,从根上避免转换问题。
注意:Replicat 的
DISCARDFILE一定要配,应用失败的记录全在里面,没有这个文件排查问题基本靠猜。
5. 跨平台同步的避坑清单:五个真实翻车现场
5.1 坑一:中文乱码,抽取进程日志里全是问号
现象:同步过去的表里中文变成???或者乱码,Extract 的 report 里能看到字符集相关的警告。
原因:源库是 ZHS16GBK,但 Extract 参数里SETENV NLS_LANG写成了AL32UTF8,或者根本没写,用了系统默认。OGG 按错误的字符集解析 redo,中文就废了。
解决:查源库真实字符集,把SETENV NLS_LANG改成AMERICAN_AMERICA.ZHS16GBK,重启抽取进程,并且从begin指定的时间点重新抽取。已经抽错的 trail 要删掉重来,不能接着用。
5.2 坑二:Replicat 报 OGG-01161,列数不匹配
现象:Replicat 启动后报OGG-01161 Bad column index或者Column count mismatch。
原因:源表和目标表的列数或列顺序不一致。跨平台迁移时,目标表可能是新建的,字段顺序和源表不同,或者少了某个字段。
解决:用MAP语句的COLMAP显式指定列映射:
MAP hr.employees, TARGET hr.employees, COLMAP (USEDEFAULTS, emp_name = name, dept_id = deptno);或者用SOURCEDEFS指定源表定义文件,让 OGG 按定义文件解析。最彻底的办法是让目标表结构和源表完全一致。
5.3 坑三:Manager 起不来,端口被占用
现象:start manager报OGG-01019 Cannot bind to port 7809。
原因:7809 端口被别的进程占了,或者 Windows 防火墙拦了。
解决:Windows 上用netstat -ano | findstr 7809找到占用进程,要么杀掉,要么改 OGG 的端口。Linux 上用ss -tlnp | grep 7809。改端口的话,mgr.prm里的PORT和DYNAMICPORTLIST都要改,并且确认防火墙放行新端口。
5.4 坑四:trail 文件不增长,抽取进程假死
现象:Extract 状态显示 running,但 trail 文件大小不变,目标端没有新数据。
原因:源库长时间没有 DML 操作,或者抽取进程的TRANLOGOPTIONS配置有问题,读不到新的 redo。也可能是源库的归档日志路径变了,抽取进程找不到。
解决:先确认源库有没有新事务,手动 insert 一条测试。如果确实有事务但抽取不动,看 Extract 的 report,检查TRANLOGOPTIONS里的归档路径配置。必要时加TRANLOGOPTIONS ALTARCHIVELOGDEST指定归档路径。
5.5 坑五:Linux 目标端权限不足,Replicat 无法写 trail
现象:Replicat 报OGG-01028 Cannot open trail file或者Permission denied。
原因:OGG 在 Linux 上是以某个操作系统用户跑的,这个用户对dirdat目录没有写权限,或者对 Oracle 的库文件没有读权限。
解决:确认 OGG 进程的运行用户,给dirdat、dirrpt、dirchk目录赋权:
chown -R oracle:oinstall /u01/ogg chmod -R 775 /u01/ogg同时确认LD_LIBRARY_PATH包含了 Oracle 的 lib 目录,否则 Replicat 启动时加载库就失败了。
6. 同步链路的验证与延迟排查技巧
6.1 怎么确认数据真的同步过去了
装完、配完、进程都 running,不代表数据真的在同步。我一般用三步验证。
第一步,在源库插一条测试数据:
INSERT INTO hr.employees (employee_id, name, deptno) VALUES (9999, '测试同步', 10); COMMIT;第二步,在目标库查:
SELECT * FROM hr.employees WHERE employee_id = 9999;能查到,说明链路通了。查不到,先看 Replicat 的DISCARDFILE,再看 Extract 的 report。
第三步,看统计信息。在 ggsci 里:
GGSCI> stats extract ext1 GGSCI> stats replicat rep1stats会显示抽取和应用的记录数、DML 操作数。如果 Extract 的Total inserts在涨,但 Replicat 的对应统计不涨,说明 trail 传输环节有问题。
6.2 延迟排查:Lag 到底卡在哪一段
OGG 的延迟分三段:抽取延迟、传输延迟、应用延迟。排查时要分段定位。
抽取延迟看info extract ext1里的Lag at Chkpt。如果这个值持续增长,说明 Extract 读日志的速度跟不上源库产生日志的速度。常见原因是源库 DML 太频繁,或者 Extract 的TRANLOGOPTIONS配置不够优化。
传输延迟看 trail 文件的生成速度和目标端的消费速度。如果源端 trail 文件快速堆积,目标端 Replicat 消费慢,说明网络或者目标库应用有问题。
应用延迟看info replicat rep1里的Lag at Chkpt。如果 Replicat 延迟高,常见原因是目标库有触发器、索引太多、或者 Replicat 的BATCHSQL没开。可以加:
BATCHSQL GROUPTRANSOPS 1000BATCHSQL让 Replicat 批量应用 SQL,GROUPTRANSOPS控制每批的事务数,能显著提升应用速度。
6.3 一个我常用的延迟监控脚本
在 Linux 目标端写个简单的监控脚本,定时抓取 Replicat 的延迟:
#!/bin/bash # ogg_lag_check.sh - 检查 Replicat 延迟 OGG_HOME=/u01/ogg cd $OGG_HOME ./ggsci <<EOF info replicat rep1 EOF把输出重定向到日志文件,配合 crontab 每 5 分钟跑一次,延迟异常时能第一时间发现。更完善的做法是解析info replicat的输出,提取Lag at Chkpt的值,超过阈值就告警。
6.4 跨平台同步值不值得做,我的判断
最后说点实在的。Windows 到 Linux 的 OGG 同步,技术上完全可行,但维护成本比同平台同步高。字符集、大小写、时区这三个问题会反复出现,每次源库或目标库有变更都要重新确认。如果你的团队没有专职的 OGG 运维,建议优先考虑把源库也迁到 Linux,或者用 Data Pump 做准实时而不是 OGG 做实时。
如果确实要做,我的习惯是:上线前把字符集、时区、表结构对齐这三件事写成检查清单,每次变更都过一遍;trail 文件的清理策略一定要配,我见过太多因为 trail 写满磁盘导致源库挂掉的案例;Replicat 的DISCARDFILE和 Extract 的 report 要定期看,别等出事了才翻日志。这套东西不复杂,但细节多,耐心比技术更重要。希望帮到你。
本文还有配套的精品资源,点击获取