热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多提宝贵地意见,我们一起提升,守住自己的饭碗。
正文开始
一、背景
本文测试Oracle 11g数据库使用ogg实现主备同步、数据迁移等场景。
二、环境准备
1、环境规划

Oracle单机环境已部署完成,环境如下,部署过程比较简单,此处省略。


部署OGG环境(两台)
创建ogg操作系统用户
两台服务器都需要创建ogg操作系统用户(此步骤非必须,也可以使用ORACLE用户安装)。
useradd -u 1003 -g oinstall -G dba oggpasswd ogg
修改ogg操作系统用户环境变量
export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/db/libexport ORACLE_SID=oggexport ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbexport PATH=ORACLE_HOME/jdk/bin:$PATH
创建ogg安装目录
mkdir oggchown -R ogg:oinstall ogg
上传安装介质
OGG介质下载地址:
https://edelivery.oracle.com/osdc/faces/SoftwareDelivery
将OGG安装文件上传到两台服务器的OGG操作系统用户的家目录(默认为/home/ogg)。
ogg112101_fbo_ggs_Linux_x64_ora11g_64bit.zip,
unzip后fbo_ggs_Linux_x64_ora11g_64bit.tar,
将fbo_ggs_Linux_x64_ora11g_64bit.tar解包到/ogg目录。
tar -xvf fbo_ggs_Linux_x64_ora11g_64bit.tar -C ogg
登录ogg测试
su - oggcd /ogg./ggsci


如果LD_LIBRARY_PATH变量设置正确,会像上面演示一样正确进入命令行,如果提示找不到so文件,就需要 查看LD_LIBRARY_PATH变量是否正确设置。
建立ogg表空间及用户
ORACLE建议使用单独的表空间存放OGG数据,表空间大小50M就可以,但是最好设置数据文件的自动扩展。
create tablespace ogg datafile '/oradata/ogg/ogg01.dbf' size 20M autoextend on;create user ogg identified by ogg default tablespace ogg;

为ogg用户授权
OGG用户需要以下权限,也有人为了省事,直接给OGG用户DBA权限。
grant CONNECT, RESOURCE to ogg;grant SELECT ANY DICTIONARY, SELECT ANY TABLE to ogg;grant ALTER ANY TABLE to ogg;grant FLASHBACK ANY TABLE to ogg;grant EXECUTE on DBMS_FLASHBACK to ogg;grant insert any table to ogg;grant update any table to ogg;grant delete any table to ogg;

打开数据库的附加日志和force log
select NAME,OPEN_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN from v$database;alter database force logging;alter database add SUPPLEMENTAL log data;select NAME,OPEN_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN from v$database;

运行ogg支持DDL脚本
如果要让OGG支持DDL操作,还需要额外运行几个脚本,这些脚本是OGG带的而不是ORACLE带的,在OGG的安装目录都可以找到。进入/ogg目录登录数据库执行以下脚本:
@marker_setup.sql@ddl_setup.sql@role_setup.sql@ddl_enable.sql


注意:这里在执行第二个脚本的时候报了很多错误,主要是ORA-00942: table or view does not exist导致执行失败。原因是ogg用户没有创建表和序列的权限。但是在执行授权操作的时候又报错ORA-04098: trigger 'SYS.GGS_DDL_TRIGGER_BEFORE' is invalid and failed re-validation。处理方法是:
@ddl_disable.sqlgrant create table to ogg;grant create sequence to ogg;
再次执行@ddl_setup.sql就没问题了。

创建ogg管理用户
在正式配置OGG之前,首先需要创建OGG的管理目录,源端和目标端都需要创建,登录OGG,只需要执行create subdirs命令就可以了。
源端:

目标端:

各目录用途如下表:

三、迁移过程
之前所做的只是准备工作,现在就可以正式配置OGG了,在配置OGG之前,先看下OGG的复制流程,OGG和其他传统复制软件一样,也是通过源端捕获/挖掘ORACLE的日志信息,目标端根据源端传送过来的日志信息进行重塑,实现源端-目标端数据同步,可以参考下图。 只有commit之后的日志信息才会被Capture进程捕获,未提交的事务OGG不会捕获。

创建测试表
源端基于SCOTT用户的EMP和DEPT表建立EMP_OGG和DEPT_OGG测试表,包含数据。
create table scott.emp_ogg as select * from scott.emp;create table scott.dept_ogg as select * from scott.dept;

目标端基于SCOTT用户的EMP和DEPT表建立EMP_OGG和DEPT_OGG测试表,不包含数据。
create table scott.emp_ogg as select * from scott.emp where 1=2;create table scott.dept_ogg as select * from scott.dept where 1=2;

源端和目标端分别在EMP_OGG和DEPT_OGG测试表上建立主键(或唯一键)。
alter table scott.EMP_OGG add constraint PK_EMPNO_OGG primary key (EMPNO);alter table scott.DEPT_OGG add constraint PK_DEPTNO_OGG primary key (DEPTNO);

源端添加表级TRANDATA
添加表级的trandata可以理解为需要将哪些用户的哪些表和目标库同步,其实也是添加表级的supplemental log,但是只有上文打开的minimal supplemental log后,这个才生效。使用OGG用户从OGG登录源端数据库:
DBLOGIN USERID ogg, PASSWORD oggadd trandata scott.emp_oggadd trandata scott.dept_ogg

成功添加表级TRANDATA后,可以通过INFO命令查看哪些表被添加了
TRANDATA:INFO TRANDATA scott.*

配置MGR管理进程
源端:
GGSCI (ogg01) 5> EDIT PARAMS MGR加入以下两行内容:PORT 7809PURGEOLDEXTRACTS /ogg/dirdat, USECHECKPOINTS
目标端:
GGSCI (ogg02) 1> EDIT PARAMS MGR加入以下两行内容:PORT 7809PURGEOLDEXTRACTS /ogg/dirdat, USECHECKPOINTS
参数说明:
PORT 7809:OGG管理进程监控端口。
PURGEOLDEXTRACTS:清除不需要的trail文件。
/ogg/dirdat:trail文件存放位置。
USECHECKPOINTS:使用检查点队列。
本实验只用到上述参数,MGR其他参数详见下表,摘自OGG官方文档。
Manager parameters: General

Manager parameters: Port management

Manager parameters: Process management

Manager parameters: Event management

Manager parameters: Maintenance

配置完MGR管理进程后,就可以启动MGR管理进程(源端和目标端都需要启动)。启动后可以通过INFO命令查看进程的状态(最好每次启动时在两端都查看下)。

配置初始化数据进程(EXTRACT)
由于在创建测试表的时候,源端的测试表有数据,而目标端的测试表只有结构,没有数据,所以需要初始化目标端的数据,所谓初始化,就是让目标端的数据和源端的数据在这个时间点是一模一样的,所以初始化工作并不需要一定使用OGG,也可以使用EXP、EXPDP、SQLLOAD等其他工具,本文主要介绍如何使用OGG进行数据初始化,下面在源端配置捕获进程EINI_1。
GGSCI (ogg01) 8> ADD EXTRACT EINI_1, SOURCEISTABLEGGSCI (ogg01) 9> INFO EXTRACT *, TASKS

由于只是添加了捕获进程EINI_1,还没有进行配置和启动这个进程,所以现在的状态是STOPPED状态。
源端编辑捕获进程EINI_1。
GGSCI (ogg01) 10> EDIT PARAMS EINI_1加入以下内容:EXTRACT EINI_1SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)USERID ogg, PASSWORD oggRMTHOST 192.168.152.140, MGRPORT 7809RMTTASK REPLICAT, GROUP RINI_1TABLE scott.EMP_OGG;TABLE scott.DEPT_OGG;
参数介绍:
EXTRACT EINI_1:说明这是EXTRACT进程,名字是EINI_1
SETENV:环境变量,一定要设置和数据库字符集一样,否则可能会乱码
USERID:数据库OGG用户
PASSWORD:数据库用户OGG的密码
RMTHOST:目标端地址,如果在/etc/hosts文件里已经设置解析,可以写主机名
MGRPORT:目标端MGR管理进程监听的端口
RMTTASK REPLICAT:目标端REPLICAT应用进程的组和名字
TABLE:源端要初始化数据的表的名字
编辑好捕获进程EINI_1后,还需要在目标端配置REPLICAT应用进程,名字要和源端的捕获进程EINI_1里面RMTTASK REPLICAT参数配置的一样,也就是还需要在目标端配置RMTTASK REPLICAT RINI_1。
配置目标端进程(REPLICAT)
GGSCI (ogg02) 1> EDIT PARAMS RINI_1加入以下参数:REPLICAT RINI_1SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)ASSUMETARGETDEFSUSERID ogg, PASSWORD oggDISCARDFILE /ogg/dirrpt/RINIaa.dsc, PURGEMAP scott.*, TARGET scott.*;
参数介绍:
REPLICAT RINI_1:说明这是REPLICAT应用进程,名字叫RINI_1
SETENV:语言变量,同捕获进程EINI_1
ASSUMETARGETDEFS:告诉OGG目标端和源端需要同步的表的结构完全一致,不需要OGG去检查表的结构,包括表名、字段名、字段类型、字段长度等,如果目标端和源端同步的表的结构不一样,需要使用SOURCEDEFS参数,详见OGG官方文档。
USERID、PASSWORD:同捕获进程EINI_1参数介绍
DISCARDFILE:错误信息存放位置及命名规则
MAP:源端捕获的表的名字
TARGET:目标端同步的表的名字,可以不在同一SCHEMA。
初始化数据
配置好目标端的应用进程RINI_1后,就可以启动源端的捕获进程进行捕获数据了,而目标端的应用进程RINI_1不需要手动去启动,也就是说目标端RINI_1进程不需要管。
启动源端的捕获进程EINI_1后,正常情况下(如果配置没问题),源端的数据已经传送到目标端了,可以通过VIEW命令查看源端捕获进程EINI_1的工作状态。
GGSCI (ogg01) 16> START EXTRACT EINI_1Sending START request to MANAGER ...EXTRACT EINI_1 startingGGSCI (ogg01) 17> VIEW REPORT EINI_12025-01-21 11:27:50 INFO OGG-01017 Wildcard resolution set to IMMEDIATE because SOURCEISTABLE is used.***********************************************************************Oracle GoldenGate Capture for OracleVersion 11.2.1.0.3 14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258_FBOLinux, x64, 64bit (optimized), Oracle 11g on Aug 23 2012 20:32:12Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.Starting at 2025\-01\-21 11:27:50***********************************************************************Operating System Version:LinuxVersion #1 SMP Tue Aug 22 21:09:27 UTC 2017, Release 3.10.0-693.el7.x86_64Node: ogg01Machine: x86_64soft limit hard limitAddress Space Size : unlimited unlimitedHeap Size : unlimited unlimitedFile Size : unlimited unlimitedCPU Time : unlimited unlimitedProcess id: 8047Description:************************************************************************* Running with the following parameters *************************************************************************2025-01-21 11:27:50 INFO OGG-03035 Operating system character set identified as UTF-8. Locale: en_US, LC_ALL:.EXTRACT EINI_1SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)Set environment variable (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)USERID ogg, PASSWORD ***2025-01-21 11:27:50 INFO OGG-03500 WARNING: NLS_LANG environment variable does not match database character set, or not set. Using database character set value of AL32UTF8.RMTHOST 192.168.152.140, MGRPORT 7809RMTTASK REPLICAT, GROUP RINI_1TABLE scott.EMP_OGG;Using the following key columns for source table SCOTT.EMP_OGG: EMPNO.TABLE scott.DEPT_OGG;Using the following key columns for source table SCOTT.DEPT_OGG: DEPTNO.2025-01-21 11:27:50 INFO OGG-01815 Virtual Memory Facilities for: COManon alloc: mmap\(MAP\_ANON\) anon free: munmapfile alloc: mmap\(MAP\_SHARED\) file free: munmaptarget directories:/ogg/dirtmp\.CACHEMGR virtual memory values (may have been adjusted)CACHESIZE: 64GCACHEPAGEOUTSIZE (normal): 8MPROCESS VM AVAIL FROM OS (min): 128GCACHESIZEMAX (strict force to disk): 96GDatabase Version:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionPL/SQL Release 11.2.0.4.0 - ProductionCORE 11.2.0.4.0 ProductionTNS for Linux: Version 11.2.0.4.0 - ProductionNLSRTL Version 11.2.0.4.0 - ProductionDatabase Language and Character Set:NLS_LANG = ".AL32UTF8"NLS_LANGUAGE = "AMERICAN"NLS_TERRITORY = "AMERICA"NLS_CHARACTERSET = "AL32UTF8"GGSCI (ogg01) 18>
查看目标端,数据已经初始化完成:

问题记录:
源端START EXTRACT EINI_1启动并VIEW REPORT EINI_1查看状态,报如下错误:2025-01-21 11:13:23 WARNING OGG-01194 EXTRACT task RINI_1 abended : Could not open checkpoint file ogg/dirchk/RINI_1.cpr, mode 1 (error 2, No such file or directory).

查看目标端日志文件显示:

解决方式,在目标端执行以下语句:
GGSCI (ogg02) 2> add replicat RINI_1,specialrun
重新启动源端进程。
初始化之后,上文提到的初始化进程(EINI_1、RINI_1)自动停止,因为通常情况下初始化数据工作只会做一次。可以通过INFO命令查看进程的状态。


源端和目标端配置OGG检查点
此步骤不是必须的,但是为了让OGG网络中断、服务器宕机、掉电等在突发情况也能正确断点续传,ORACLE建议配置OGG的检查点队列。源端和目标端都需配置。
GGSCI (ogg01) 20> EDIT PARAMS ./GLOBALS加入以下信息:CHECKPOINTTABLE ogg.ggschkpt
这就告诉OGG检查点存放到OGG用户下的GGSCHKPT表中,但是还需要使用OGG用户登录数据库,创建检查点表,此时需要退出OGG,重新登录,否则可能会遇到下面的错误。
GGSCI (ogg02) 5> ADD CHECKPOINTTABLEERROR: Not logged into database, use DBLOGIN.GGSCI (ogg02) 6> exit[ogg@ogg02 ogg]$ ./ggsciOracle GoldenGate Command Interpreter for OracleVersion 11.2.1.0.3 14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258_FBOLinux, x64, 64bit (optimized), Oracle 11g on Aug 23 2012 20:20:21Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.GGSCI (ogg02) 1> dblogin userid ogg,password oggSuccessfully logged into database.GGSCI (ogg02) 2> ADD CHECKPOINTTABLENo checkpoint table specified, using GLOBALS specification (ogg.ggschkpt)...Successfully created checkpoint table ogg.ggschkpt.GGSCI (ogg02) 3>

只需要执行ADD CHECKPOINTTABLE命令,OGG会自动在ORACLE的OGG用户下创建检查点,源端和目标端都需要执行。此时用OGG登录数据库,就可以看到OGG创建的检查点表。

源端配置捕获进程(EXTRACT)
现在已经可以配置数据同步了,下面在源端配置捕获进程。
GGSCI (ogg01) 3> EDIT PARAMS EORA_1加入以下参数:EXTRACT EORA_1SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)USERID ogg, PASSWORD oggEXTTRAIL /ogg/dirdat/aaTABLE scott.EMP_OGG;TABLE scott.DEPT_OGG;
参数介绍:
以上参数基本都在上文提过,这里不在重复,说下EXTTRAIL参数,EXTTRAIL参数是TRAIL队列文件存放的路径和命名格式,TRAIL文件可以理解为存放捕获进程捕获的日志文件。此时还需要将捕获进程EORA_1添加到OGG。
GGSCI (ogg01) 4> ADD EXTRACT EORA_1, TRANLOG, BEGIN NOWEXTRACT added.GGSCI (ogg01) 5> ADD EXTTRAIL ogg/dirdat/aa, EXTRACT EORA_1, MEGABYTES 5EXTTRAIL added.

上面的两个命名告诉OGG,捕获进程从启动起开始捕获,捕获数据保存到TRAIL文件,及TRAIL文件的路径、命名格式,单个TRAIL文件最大大小。现在就可以启动源端捕获进程EORA_1了,并通过INFO命令查看状态为RUNNING。
GGSCI (ogg01) 6> START EXTRACT EORA_1Sending START request to MANAGER ...EXTRACT EORA_1 startingGGSCI (ogg01) 7> INFO EXTRACT EORA_1EXTRACT EORA_1 Last Started 2025-01-21 14:54 Status RUNNINGCheckpoint Lag 00:00:00 (updated 00:00:00 ago)Log Read Checkpoint Oracle Redo Logs2025\-01\-21 14:53:30 Seqno 26, RBA 1289216SCN 0\.993670 \(993670\)GGSCI (ogg01) 8>

源端配置传输进程(PUMP)
此步骤也是非必须的,如果不配置传输进程,OGG会通过EXTRACT进程传输TRAIL队列文件,但是和检查点队列一样,为了保证断点续传ORACLE建议配置PUMP传输进程。
EDIT PARAMS PORA_1加入以下参数:EXTRACT PORA_1SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)PASSTHRURMTHOST 192.168.152.140, MGRPORT 7809RMTTRAIL /ogg/dirdat/paTABLE scott.EMP_OGG;TABLE scott.DEPT_OGG;
添加PUMP进程PORA_1到OGG,并指定本地的TRAIL文件。此时用INFO命令可以看到PUMP进程PORA_1的状态。
GGSCI (ogg01) 9> ADD EXTRACT PORA_1, EXTTRAILSOURCE /ogg/dirdat/aaEXTRACT added.GGSCI (ogg01) 10> INFO EXTRACT PORA_1EXTRACT PORA_1 Initialized 2025-01-21 15:00 Status STOPPEDCheckpoint Lag 00:00:00 (updated 00:00:06 ago)Log Read Checkpoint File /ogg/dirdat/aa000000First Record RBA 0GGSCI (ogg01) 11>

为PUMP进程PORA_1指定将本地TRAIL文件传输到目标端后保存成目标端TRAIL文件的名字。下面就可以启动PUMP进程PORA_1了,启动后看下PORA_1的状态。
GGSCI (ogg01) 11> ADD RMTTRAIL /ogg/dirdat/pa, EXTRACT PORA_1, MEGABYTES 5RMTTRAIL added.GGSCI (ogg01) 12> INFO EXTRACT PORA_1EXTRACT PORA_1 Initialized 2025-01-21 15:00 Status STOPPEDCheckpoint Lag 00:00:00 (updated 00:02:06 ago)Log Read Checkpoint File /ogg/dirdat/aa000000First Record RBA 0GGSCI (ogg01) 13>

启动PUMP进程,查看状态。
GGSCI (ogg01) 22> START EXTRACT PORA_1Sending START request to MANAGER ...EXTRACT PORA_1 startingGGSCI (ogg01) 23> INFO EXTRACT PORA_1EXTRACT PORA_1 Last Started 2025-01-21 15:16 Status RUNNINGCheckpoint Lag 00:00:00 (updated 00:15:32 ago)Log Read Checkpoint File /ogg/dirdat/aa000000First Record RBA 0GGSCI (ogg01) 24>

此时在目标端/ogg/dirdat/目录下,就会看到由源端PUMP进程PORA_1传输过来的TRAIL文件。

目标端配置同步进程(REPLICAT)
GGSCI (ogg02) 10> ADD REPLICAT RORA_1, SPECIALRUN

EDIT PARAMS RORA_1加入以下参数:REPLICAT RORA_1SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)USERID ogg, PASSWORD oggHANDLECOLLISIONSASSUMETARGETDEFSDISCARDFILE /ogg/dirrpt/RORA_aa.DSC, PURGEMAP scott.emp_ogg, TARGET scott.emp_ogg;MAP scott.dept_ogg, TARGET scott.dept_ogg;
启动RORA_1进程,并查看状态:
GGSCI (ogg02) 67> START REPLICAT RORA_1Sending START request to MANAGER ...REPLICAT RORA_1 startingGGSCI (ogg02) 68>INFO ALLProgram Status Group Lag at Chkpt Time Since ChkptMANAGER RUNNINGREPLICAT RUNNING RORA_1 00:00:00 00:00:04GGSCI (ogg02) 69>

报错问题处理:

ERROR OGG-00446 Oracle GoldenGate Delivery for Oracle, rora_1.prm: Invalid data source -1 in checkpoint file /ogg/dirchk/RORA_1.cpr.
ERROR OGG-01668 Oracle GoldenGate Delivery for Oracle, rora_1.prm: PROCESS ABENDING.
查看进程状态:

这个问题一直没找到原因,最后临时的处理办法是先关闭检查点功能,不使用断点续传。操作是mgr进程中删除检查点参数,然后重启源端进程。目标端按照如下命令重新添加REPLICAT进程:
add replicat rora_1 integrated exttrail /ogg/dirdat/pa NODBCHECKPOINT
然后重新启动复制进程,成功。
四、验证测试
源端更新数据
源端删除3条数据:
delete from scott.emp_ogg where empno in ('7900','7902','7934');

目标端观察数据是否同步
目标端观察数据是否删除:

观察数据已经同步至目标端。
到此,已完成全量数据和增加数据的实时同步,大家可以进行测试,有问题随时交流。文中的概念来源于互联网,如有侵权,请联系我删除。
欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。




