ARTICLE DETAIL

资讯详情

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

Windows到Linux OGG异构同步:日志权限与检查点排错

Windows到Linux OGG异构同步:日志权限与检查点排错

简介:围绕Oracle GoldenGate跨Windows与Linux异构环境数据同步的部署文档,面向Oracle DBA、数据复制运维人员及需要搭建灾备链路的技术人员,重点解决源目标库准备、OGG安装配置与日常维护中的操作落地问题。内容从源库归档模式、强制日志、附加日志与goldengate用户授权讲起,梳理目标库权限差异及enable_goldengate_replication设置,并覆盖解压后图形化安装、Manager、Extractor、Replicat等组件配置,以及监控、日志管理和故障排查思路。压缩包仅含1个PDF文件,约496KB,篇幅精炼,便于按章节查阅关键SQL命令与参数配置。已有297人学习,适合作为OGG 12.2跨平台同步的实操参考,帮助读者厘清源端与目标端配置边界,快速定位部署环节中的常见问题。

1. 别急着点安装:Windows 到 Linux 的 OGG 同步先卡在日志与权限

把 oracle linux OGG 数据同步放到 Windows 到 Linux 的异构链路里,最反直觉的一点是:软件装完只算拿到入场券,真正决定成败的是源库日志和两端检查点。源端少开一个附加日志,后面 Extract 看着是 Running,Replicat 却可能因为缺少前镜像直接报错;目标端检查点表没对齐,初始化数据一导入就撞主键。这个场景适合已经能连上两端数据库、准备做跨操作系统增量复制的从业者,也适合第一次接触 OGG 12.2.0.2 的新手照着排链路。下面按安装骨架、源库改造、进程参数、避坑排查、验证收口五段推进,命令能直接抄,参数按实际环境替换。

2. 双端落地骨架:从 12.2.0.2 安装包到 MGR 进程

异构同步的第一步不是配 Extract,而是把两端 OGG 的目录、检查点表和 MGR 进程先立起来。Windows 源端和 Linux 目标端在安装方式上不一样,但进入 GGSCI 之后,create subdirs、GLOBALS、add checkpointtable、start mgr这几步是对称的。很多翻车点就出在这里:Linux 上解压安装包时用 root 用户操作,后面 Oracle 用户写不了dirrpt;Windows 上安装目录带空格或中文,DataPump 写 trail 文件时路径解析失败。先把安装和目录权限做干净,后面参数才有意义。

2.1 Linux 目标端解压安装与 Windows 源端安装差异

Linux 目标端用 12.2.0.2 的 Linux x64 安装包,上传后切到 oracle 用户解压,再用图形化安装器选择对应数据库版本。不要用 root 解压后直接改权限,常见做法是上传到/u01/app/这类 Oracle 用户可写的目录,解压和安装都保持同一个用户,省掉后面dirdat权限排查。

# Linux 目标端:上传安装包后切 oracle 用户执行 su - oracle unzip 122022_fbo_ggs_Linux_x64_shiphome.zip cd fbo_ggs_Linux_x64_shiphome/Disk1 ./runInstaller # 安装向导里选择与目标库匹配的 Oracle 版本 # 安装目录示例:/u01/app/ogg

这段命令做三件事:解压安装包、进入 Disk1、启动图形化安装器。参数上重点看两个:安装目录不要放在/root或/tmp下,/u01/app/ogg这类目录后面要放dirdat、dirrpt、dirchk,空间要预留;安装向导里选择的数据库版本要和目标库一致,版本选错后面 Replicat 连库会报库版本不匹配。Windows 源端用同版本 Windows 安装包走图形化向导,安装路径尽量短,不要带空格和中文,安装完成后用 Oracle 用户或具备读日志权限的账户运行 GGSCI。两端安装完成后都先确认ggsci能正常进入,再往下做。

提示:Linux 安装完成后先检查$OGG_HOME下目录属主,dirrpt、dirdat必须让运行 OGG 的用户可写,否则 MGR 起得来,进程写报告时仍会失败。

2.2 create subdirs 与 GLOBALS:先把检查点目录规整

进入 GGSCI 后第一件事是创建子目录。源端和目标端都要做,不要只做目标端。create subdirs会生成参数、报告、检查点、SQL 脚本、定义文件、trail 数据、临时文件、凭证、钱包等目录;如果提示 already exists,说明之前已经初始化过,不用重复建,但要检查目录权限。

# 源端和目标端都执行 cd /u01/app/ogg ./ggsci # GGSCI 内执行 create subdirs

create subdirs本身没有业务参数,关键在运行位置:必须在 OGG 安装目录下执行,否则会在当前目录下建一套目录,后面启动进程找不到dirprm。目录建完后编辑全局参数文件,源端和目标端都写同一套 GGSCHEMA 和 CHECKPOINTTABLE,表名按实际管理员 schema 调整。

-- GGSCI 内:edit params ./GLOBALS -- 源端、目标端保持一致 GGSCHEMA goldengate CHECKPOINTTABLE goldengate.ggschkpt SYSLOG NONE

GGSCHEMA指定 OGG 管理员 schema,后面检查点表、DDL 历史表都放在这个 schema 下;CHECKPOINTTABLE指定检查点表名,源端和目标端必须一致,否则 Replicat 启动时读不到自己的检查点;SYSLOG NONE表示不往系统日志重复写,排查时统一看ggserr.log更清楚。这里最容易犯的错是源端写一个 schema、目标端写另一个 schema,后面add checkpointtable建表成功但 Replicat 启动报检查点表不存在。

2.3 checkpoint 表与 MGR:端口、自动重启和清理策略

全局参数写完后,用 goldengate 用户登录数据库并创建检查点表。源端和目标端都要执行,检查点表只建一次,重复执行会报已存在。接着编辑 MGR 参数,MGR 是两端 OGG 的管理进程,DataPump 投递和 Replicat 读取都依赖它。

# GGSCI 内:源端和目标端都执行 dblogin userid goldengate password goldengate add CHECKPOINTTABLE goldengate.ggschkpt

dblogin用 OGG 管理员用户连库,密码按实际替换;add CHECKPOINTTABLE在GLOBALS指定的 schema 下建检查点表,成功后 GGSCI 会提示 created。如果提示表已存在,说明之前建过,直接info checkpointtable goldengate.ggschkpt确认即可,不要删表重建,除非确认没有进程在使用。

MGR 参数在源端和目标端都要配,端口保持一致,目标端的PORT要跟源端 DataPump 里的MGRPORT对上。

-- GGSCI 内:edit params 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

PORT 7809是 MGR 固定端口,DataPump 的RMTHOST ... MGRPORT 7809必须跟它一致;DYNAMICPORTLIST 7800-7810是动态端口范围,Windows 防火墙和 Linux 防火墙都要放行这个范围,否则 MGR 能连上,数据传输阶段仍会断;AUTORESTART ER *让异常进程按 5 分钟间隔重试 3 次,60 分钟重置计数;PURGEOLDEXTRACTS按检查点清理 trail,MINKEEPHOURS 12不要设得太短,长事务场景下 trail 被提前清掉,Replicat 会直接找不到文件。配完后两端启动 MGR,并用info mgr确认状态。

# GGSCI 内:源端和目标端都执行 start mgr info mgr

start mgr启动管理进程,info mgr看MANAGER是否 Running、端口是否监听。Windows 源端如果以服务方式运行,安装服务后从服务管理器启动;命令行方式则保持 GGSCI 窗口不关。目标端 Linux 上可以用ps -ef | grep mgr辅助确认,但最终以 GGSCI 的info mgr为准。

3. 源库改造顺序:归档、强制日志、附加日志与 trandata 怎么排

源库配置是整条链路的地基,顺序错了后面很难补。归档模式解决“日志能不能被读”,强制日志解决“nologging 操作有没有记录”,最小附加日志解决“有没有补充信息”,表级 trandata 解决“具体表有没有开”。这四层不是一回事,只开归档就上 Extract,最常见的结果是插入能同步、更新和删除缺前镜像,Replicat 报 missing row。目标库不需要开附加日志,但用户、权限和enable_goldengate_replication要配齐,否则 Replicat 连库就失败。

3.1 归档、force logging、supplemental log 的最小闭环

源库先确认归档模式。startup mount之前要安排窗口,生产库不能直接重启。下面这组 SQL 把归档、强制日志、最小附加日志一次做完,最后切一次日志让附加日志生效。

-- 源库 sysdba 执行,生产环境先安排停机窗口 shutdown immediate; startup mount; alter database archivelog; alter database open; alter database force logging; alter database add supplemental log data; select SUPPLEMENTAL_LOG_DATA_MIN, FORCE_LOGGING from v$database; alter system switch logfile;

archivelog打开归档模式,OGG Extract 读在线日志和归档日志都依赖它;force logging强制 nologging 操作也写 redo,避免直接路径加载的数据漏同步;add supplemental log data是最小附加日志,给 OGG 提供必要的补充信息;switch logfile让附加日志尽快生效。查询结果里SUPPLEMENTAL_LOG_DATA_MIN应为 YES,FORCE_LOGGING也应为 YES。如果只开归档没开强制日志,后面用expdp做初始化时可能一切正常,增量阶段才发现部分数据缺失。

注意:shutdown immediate会中断连接,生产库先确认没有长事务和批处理在跑,再走挂载和打开流程。

3.2 goldengate 用户与 enable_goldengate_replication 参数

源库和目标库都要建 OGG 管理员用户。源库多一个表空间路径按实际改,目标库同样建用户,但不执行add supplemental log data。下面这段源库脚本可以直接改路径后执行。

-- 源库:创建 OGG 管理员和表空间 create tablespace goldengate datafile '/u01/app/oracle/oradata/test1/ogg01.dbf' size 300m autoextend on; create user goldengate identified by goldengate default tablespace goldengate; grant connect,resource,create session,alter session to goldengate; grant flashback any table to goldengate; exec dbms_goldengate_auth.grant_admin_privilege('GOLDENGATE'); alter system set enable_goldengate_replication = true scope=both;

表空间路径、数据文件大小按实际调整;grant_admin_privilege给 OGG 管理员授必要的系统权限;enable_goldengate_replication在 12c 环境要打开,scope=both让参数重启后仍生效。目标库建用户时把最后一句保留,但不要加add supplemental log data,另外补 DML 权限。

-- 目标库:用户权限与源库基本一致,额外补 DML 权限 create tablespace goldengate datafile '/u01/app/oracle/oradata/test1/ogg01.dbf' size 300m autoextend on; create user goldengate identified by goldengate default tablespace goldengate; grant connect,resource,create session,alter session to goldengate; grant flashback any table to goldengate; exec dbms_goldengate_auth.grant_admin_privilege('GOLDENGATE'); grant insert any table,update any table,delete any table to goldengate; alter system set enable_goldengate_replication = true scope=both;

目标库多出的insert any table,update any table,delete any table是 Replicat 写目标表需要的;如果只给connect,resource,Replicat 启动后应用第一条 DML 就可能报权限不足。两端用户密码保持一致只是测试环境图省事,实际部署建议按环境分开管理,参数文件里不要长期写明文密码,后续可以用凭证存储替换。

配置项源库目标库作用
归档模式必须开不要求Extract 读在线日志
force logging必须开不要求防止 nologging 漏记
最小附加日志必须开不要求补充 redo 信息
OGG 管理员用户必须必须运行进程、存检查点
DML any table 权限不需要必须Replicat 写目标表
enable_goldengate_replication必须开必须开12c 复制参数

3.3 DDL 支持脚本与表级 trandata 的边界

如果只同步 DML,表级 trandata 加完就能跑;如果要同步 DDL,源端还要跑 marker、ddl_setup、role_setup、ddl_enable 这一套脚本,并给 OGG 用户授GGS_GGSUSER_ROLE。这些脚本用 sysdba 执行,路径按 OGG 安装目录调整。

# 源端 sysdba 执行,/u01/app/ogg 按实际安装目录替换 sqlplus / as sysdba <<'EOF' grant execute on utl_file to goldengate; @/u01/app/ogg/marker_setup @/u01/app/ogg/ddl_setup @/u01/app/ogg/role_setup GRANT GGS_GGSUSER_ROLE TO GOLDENGATE; @/u01/app/ogg/ddl_enable @?/rdbms/admin/dbmspool.sql @/u01/app/ogg/ddl_pin goldengate EOF

marker_setup建 DDL 标记表,ddl_setup建 DDL 历史表,role_setup建角色,ddl_enable打开 DDL 捕获;ddl_pin把 OGG 管理员 schema 固定住,减少 DDL 同步时的性能开销。执行ddl_pin时传的 schema 名必须和GLOBALS里的GGSCHEMA一致,大小写按数据库实际对象走。

表级附加日志用add trandata加,源端执行,目标端不要加。表上有主键或唯一索引时直接加;没有主键的表必须用KEYCOLS指定能唯一过滤重复数据的列,否则 Replicat 应用更新时可能重复应用。

# 源端 GGSCI:给具体表加 trandata dblogin userid goldengate password goldengate add trandata TEST.T1 info trandata TEST.T1

add trandata TEST.T1给表开补充日志,info trandata看是否 enabled。表名大小写按数据库实际对象写,Oracle 默认大写,参数里写小写可能找不到表。没有主键的表用add trandata TEST.T1, KEYCOLS (col1,col2),这里的关键列要能唯一标识一行,否则过滤重复数据时仍会出错。DDL 抽取开启后,源端新增表不会自动同步,需要重新add trandata并确认 Extract 参数里的DDL INCLUDE范围。

4. 进程链路拆解:Extract、DataPump、Replicat 的参数与启动顺序

一条 OGG 链路至少三个进程:源端 Extract 读 redo 写本地 trail,源端 DataPump 把本地 trail 投递到目标端,目标端 Replicat 读 trail 写目标库。三个进程的启动顺序是 MGR → Extract → DataPump → Replicat,停的顺序反过来。参数文件里最容易混的是路径:Extract 的EXTTRAIL是源端本地路径,DataPump 的RMTTRAIL是目标端路径,Replicat 的exttrail也是目标端路径。Windows 源端写.\dirdat\gs,Linux 目标端写./dirdat/gs,不要互相抄。

4.1 Extract 参数:从在线日志到本地 trail

Extract 负责读源库在线日志,把变更写到本地 trail。下面这份参数按源端 Linux 路径写,Windows 源端把ORACLE_HOME、ORACLE_SID、EXTTRAIL换成 Windows 实际值,路径分隔符用反斜杠。

-- 源端 GGSCI:edit param extgsxf 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 FETCHOPTIONS MISSINGROW ABEND STATOPTIONS REPORT LONGTRANS 1H,CHECKINTERVAL 10m DYNAMICRESOLUTION TABLE TEST.*;

SETENV里的ORACLE_HOME、ORACLE_SID必须是源库实际值,Windows 源端写成D:\app\...这类路径;EXTTRAIL ./dirdat/gs是源端本地 trail 前缀,后面 DataPump 的exttrailsource要跟它一致;TRANLOGOPTIONS LOGRETENTION DISABLED表示不让 Extract 管理日志保留,日志保留交给数据库归档策略;BR BRINTERVAL 20M控制有界恢复间隔;BUFSIZE 2048000是读日志缓冲,事务量大时可以再调;CACHEMGR CACHESIZE 2GB给长事务缓存,太小会频繁写临时文件;GETTRUNCATES让 truncate 也同步,目标端 Replicat 也要开;DDL INCLUDE MAPPED只同步映射范围内的 DDL;LONGTRANS 1H是长事务阈值,超过后会告警;TABLE TEST.*是同步范围,按实际 schema 改。FETCHOPTIONS MISSINGROW ABEND让缺少行时直接中止,避免静默丢数据。

添加 Extract 时用begin now从当前时间开始,add exttrail绑定 trail 文件大小。megabytes 1024是单个 trail 文件大小,按日增量调,太大恢复慢,太小文件切换频繁。

# 源端 GGSCI dblogin userid goldengate password goldengate add extract extgsxf tranlog, begin now add exttrail ./dirdat/gs, extract extgsxf, megabytes 1024 start extgsxf info extgsxf

add extract ... tranlog注册读在线日志的 Extract,begin now表示从当前时刻开始;add exttrail把 trail 前缀和 Extract 绑定;start启动后看info里的状态和 checkpoint。如果info显示STOPPED,先去ggserr.log看是不是ORACLE_HOME、ORACLE_SID或数据库连接串写错。

4.2 DataPump 参数:RMTHOST 与 RMTTRAIL 的对应关系

DataPump 不读数据库,只把源端 trail 投递到目标端。PASSTHRU表示不做数据库映射,直接传 trail;RMTHOST写目标端 IP 和目标 MGR 端口;RMTTRAIL写目标端 OGG 目录下的 trail 前缀。

-- 源端 GGSCI: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.*;

RMTHOST的 IP 换成目标 Linux 主机,MGRPORT跟目标端 MGR 的PORT一致;RMTTRAIL ./dirdat/gs是目标端路径,不是源端路径,写错会在目标端生成奇怪目录或直接报错;TABLE TEST.*要和 Extract 的范围对齐,范围不一致时 DataPump 会过滤掉部分表。Windows 源端如果开了防火墙,出站和入站都要放行 7809 及动态端口范围,常见现象是 DataPump 启动后info显示 Running,但目标端dirdat一直没有新文件。

# 源端 GGSCI add extract dpgskf, exttrailsource ./dirdat/gs add RMTTRAIL ./dirdat/gs, extract dpgskf, megabytes 1024 start dpgskf info dpgskf

exttrailsource指向 Extract 写的本地 trail,add RMTTRAIL注册远端 trail 和文件大小。启动后看info dpgskf的RMTTRAIL和RMTHOST是否为目标端;如果目标端没有文件,先查目标 MGR 是否启动、端口是否通,再查ggserr.log里的 TCP/IP 报错。

4.3 Replicat 参数:ASSUMETARGETDEFS、错误处理和批量提交

Replicat 在目标端读 trail 写库。两端表结构一致时用ASSUMETARGETDEFS,省掉定义文件;表结构不一致时要用SOURCEDEFS和定义文件。DBOPTIONS DEFERREFCONST延迟约束检查,SUPPRESSTRIGGERS避免触发器重复执行,GROUPTRANSOPS 1000按 1000 个操作一组提交,兼顾性能和回滚粒度。

-- 目标端 GGSCI: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' & <p> <a href="https://download.csdn.net/download/u010575833/88803231" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>
返回列表