适用范围

操作系统:CentOS 7.6
源数据库:Oracle 11.2.0.4
目标数据库:Mysql 5.7
OGG版本:Ogg 12.2.0.1

问题概述

基于源端Oracle 11.2.0.4数据库,目标端Mysql 5.7数据库,配置ogg数据同步。包含基础数据的全量同步,以及后续的增量数据同步。

解决方案

一、环境信息

Ogg Oracle 11g to Mysql 5.7_mysql

二、OGG安装前环境配置

1、源端配置

1)开启归档模式

创建归档目录

mkdir /arch
chown oracle:oinstall /arch

调整系统参数

sqlplus / as sysdba
alter system set log_archive_dest_1='location=/arch';

关闭数据库,配置为归档模式

shut immediate;
startup mount;
alter database archivelog;
alter database open;

检查归档状态

archive log list;

Ogg Oracle 11g to Mysql 5.7_ogg_02

2)开启强制日志模式 force logging

检查是否开启force logging模式

select force_logging from v$database;

开启force logging

alter database force logging;

再次检查

select force_logging from v$database;

Ogg Oracle 11g to Mysql 5.7_ogg_03

3)开启最小附加日志

检查是否开启附加日志

select supplemental_log_data_min from v$database;

开启附加日志

alter database add supplemental log data;

再次检查及切换日志

select supplemental_log_data_min from v$database;
alter system archive log current;

Ogg Oracle 11g to Mysql 5.7_oracle_04

4)启用ogg复制参数

检查enable_goldengate_replication参数并配置为TRUE

show parameter enable_goldengate_replication
alter system set enable_goldengate_replication=true scope=both;
show parameter enable_goldengate_replication

Ogg Oracle 11g to Mysql 5.7_ogg_05

5)验证上述的相关配置

select name,log_mode,db_unique_name,supplemental_log_data_min,force_logging from v$database;

Ogg Oracle 11g to Mysql 5.7_ogg_06

6)创建ogg用户

创建单独的表空间

create tablespace tbs_ogg datafile '/oradata/orcl/tbs_ogg_01.dbf' size 1G autoextend on;

创建用户

create user ogg identified by ogg123 default tablespace tbs_ogg;

配置权限

exec dbms_goldengate_auth.grant_admin_privilege('ogg');
grant connect,resource to ogg;
grant select any dictionary to ogg;
grant insert any table,update any table,delete any table,create any index to ogg;

Ogg Oracle 11g to Mysql 5.7_mysql_07

2、目标端配置

1)创建ogg用户

create user ogg@'%' identified by '123456';
grant all privileges on *.* to ogg@'%';
flush privileges;

Ogg Oracle 11g to Mysql 5.7_oracle_08

2)创建数据库及同步表

这里在源端通过DBMS_METADATA.GET_DDL函数,查询到HR用户下所有表的建表语句,并手动修改对应的数据类型、去掉表空间相关语句等,用以适配目标端建表语句。
例:SELECT DBMS_METADATA.GET_DDL(‘TABLE’,‘COUNTRIES’,‘HR’) FROM DUAL;

创建HR数据库

create database hr;

创建同步表
这里为测试环境,取消了所有外键约束,否则全量数据同步时会违反约束
VARCHAR2转换为VARCHAR
NUMBER 转换为DECIMAL

CREATE TABLE HR.JOBS 
   (	JOB_ID VARCHAR(10), 
	JOB_TITLE VARCHAR(35) NOT NULL , 
	MIN_SALARY DECIMAL(6,0), 
	MAX_SALARY DECIMAL(6,0), 
	 CONSTRAINT JOB_ID_PK PRIMARY KEY (JOB_ID)
   );
  CREATE TABLE HR.REGIONS 
   (	REGION_ID DECIMAL NOT NULL , 
	REGION_NAME VARCHAR(25), 
	 CONSTRAINT REG_ID_PK PRIMARY KEY (REGION_ID)
   );

  CREATE TABLE HR.COUNTRIES 
   (	COUNTRY_ID CHAR(2) NOT NULL , 
	COUNTRY_NAME VARCHAR(40), 
	REGION_ID DECIMAL, 
	 CONSTRAINT COUNTRY_C_ID_PK PRIMARY KEY (COUNTRY_ID)  
   );

  CREATE TABLE HR.LOCATIONS 
   (	LOCATION_ID DECIMAL(4,0), 
	STREET_ADDRESS VARCHAR(40), 
	POSTAL_CODE VARCHAR(12), 
	CITY VARCHAR(30) NOT NULL , 
	STATE_PROVINCE VARCHAR(25), 
	COUNTRY_ID CHAR(2), 
	 CONSTRAINT LOC_ID_PK PRIMARY KEY (LOCATION_ID) 
   );

  CREATE TABLE HR.EMPLOYEES 
   (	EMPLOYEE_ID DECIMAL(6,0), 
	FIRST_NAME VARCHAR(20), 
	LAST_NAME VARCHAR(25)  NOT NULL , 
	EMAIL VARCHAR(25)  NOT NULL , 
	PHONE_NUMBER VARCHAR(20), 
	HIRE_DATE DATE  NOT NULL , 
	JOB_ID VARCHAR(10) NOT NULL , 
	SALARY DECIMAL(8,2), 
	COMMISSION_PCT DECIMAL(2,2), 
	MANAGER_ID DECIMAL(6,0), 
	DEPARTMENT_ID DECIMAL(4,0), 
	 CONSTRAINT EMP_SALARY_MIN CHECK (salary > 0) , 
	 CONSTRAINT EMP_EMAIL_UK UNIQUE (EMAIL), 
	 CONSTRAINT EMP_EMP_ID_PK PRIMARY KEY (EMPLOYEE_ID)
   );

  CREATE TABLE HR.DEPARTMENTS 
   (	DEPARTMENT_ID DECIMAL(4,0), 
	DEPARTMENT_NAME VARCHAR(30) NOT NULL , 
	MANAGER_ID DECIMAL(6,0), 
	LOCATION_ID DECIMAL(4,0), 
	 CONSTRAINT DEPT_ID_PK PRIMARY KEY (DEPARTMENT_ID)
   );

  CREATE TABLE HR.JOB_HISTORY 
   (	EMPLOYEE_ID DECIMAL(6,0)  NOT NULL , 
	START_DATE DATE  NOT NULL , 
	END_DATE DATE  NOT NULL , 
	JOB_ID VARCHAR(10)  NOT NULL , 
	DEPARTMENT_ID DECIMAL(4,0), 
	 CONSTRAINT JHIST_DATE_INTERVAL CHECK (end_date > start_date) , 
	 CONSTRAINT JHIST_EMP_ID_ST_DATE_PK PRIMARY KEY (EMPLOYEE_ID, START_DATE)
   );

三、OGG软件安装

1、源端安装OGG

1)修改环境变量

su - oracle
vim .bash_profile
##原有配置不变,增加OGG_HOME相关参数
export OGG_HOME=/ogg
export PATH=$ORACLE_HOME/bin:$PATH:$OGG_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:$OGG_HOME

使其生效

source .bash_profile

2)上传并解压安装包

这里上传至/home/oracle下

unzip V100692-01.zip
chown -R oracle:oinstall fbo_ggs_Linux_x64_shiphome/

创建安装目录

mkdir /ogg
chown oracle:oinstall /ogg

3)编辑OGG安装响应文件

su - oracle
cd fbo_ggs_Linux_x64_shiphome/Disk1/response/
cp oggcore.rsp oggcore.rsp-bak

#编辑文件
vim oggcore.rsp
oracle.install.responseFileVersion=/oracle/install/rspfmt_ogginstall_response_schema_v12_1_2
INSTALL_OPTION=ORA11g
SOFTWARE_LOCATION=/ogg
START_MANAGER=true
MANAGER_PORT=7809
DATABASE_LOCATION=/u01/app/oracle/product/11.2/dbhome_1
INVENTORY_LOCATION=/u01/app/oraInventory
UNIX_GROUP_NAME=oinstall

4)静默安装OGG

cd /home/oracle/fbo_ggs_Linux_x64_shiphome/Disk1

这里响应文件需要使用绝对路径

./runInstaller -silent -nowait -responseFile /home/oracle/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp

Ogg Oracle 11g to Mysql 5.7_ogg_09

源端OGG安装完成

2、目标端安装OGG

OGG for Mysql 版本只需解压至安装目录,即可使用

mkdir /ogg
unzip p25138154_12201170221_Linux-x86-64.zip
tar -xf ggs_Linux_x64_MySQL_64bit.tar -C /ogg

创建ogg工作子目录

cd /ogg
./ggsci
create subdirs

Ogg Oracle 11g to Mysql 5.7_ogg_10

四、OGG同步__全量同步

1、源端配置

1)配置MGR管理进程

cd /ogg/
./ggsci
##配置参数文件,编辑方法同vim编辑器
edit param mgr        
PORT 7809
DYNAMICPORTLIST 7810-7820
AUTOSTART EXTRACT *
AUTORESTART EXTRACT *
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 7
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45

重启mgr进程
stop mgr
start mgr
info all

参数说明
PORT:指定服务监听端口,默认端口为7809;
DYNAMICPORTLIST:动态端口范围,可以指定最大256个可用端口的动态列表,当指定的端口不可用时,管理进程将会从列表中选择一个可用的端口,源端和目标端的Collector、Replicat、GGSCI进程通信也会使用这些端口;
AUTOSTART:指定在管理进程启动时自动启动哪些进程;
AUTORESTART:自动重启参数设置,可使抽取/复制进程失败后自动重启;
PURGEOLDEXTRACTS:定期清理trail文件设置,这里设置表示对于超过7天的trail文件进行删除;
LAGREPORT、LAGINFO、LAGCRITICAL:定义数据延迟的预警机制,这里设置表示MGR进程每隔1小时检查EXTRACT的延迟情况,如果超过了30分钟就把延迟作为信息记录到错误日志中,如果延迟超过了45分钟,则把它作为警告写到错误日志中。

2)配置表级TRANDATA

需要在ggsci命令行中登录数据库进行操作

dblogin userid ogg,password ogg123
#查看HR用户的表信息
list tables HR.*
#添加HR用户的表级TRANDATA
add trandata HR.*
#查看TRANDATA信息
info trandata HR.*

Ogg Oracle 11g to Mysql 5.7_ogg_11


Ogg Oracle 11g to Mysql 5.7_oracle_12

3)配置全量抽取进程

##编辑配置文件
edit param einit_01

EXTRACT einit_01
SETENV (ORACLE_SID=orcl)
SETENV (ORACLE_HOME=/u01/app/oracle/product/11.2/dbhome_1)
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
RMTHOST 192.168.1.12, MGRPORT 7809
USERID ogg, PASSWORD ogg123
RMTTASK REPLICAT, GROUP rinit_01
TABLE HR.*;

##添加进程
add extract einit_01,sourceistable

4)配置源定义文件

在Oracle和外部数据库之间复制数据时,还需要创建SOURCEDEFS文件,该文件需要定义生成器参数文件,它是在ggsci中创建的,包含用户名和密码以及我们想要映射的表。

##编辑定义文件的参数文件
edit param def_hr

DEFSFILE ./dirdef/def_hr.def
USERID ogg, password ogg123
TABLE HR.*;

上述参数中的DEFSFILE,需指定定义文件生成的路径及名称

##根据参数文件生成定义文件
这里需先exit退出ggsci命令行

cd /ogg
./defgen paramfile ./dirprm/def_hr.prm

Ogg Oracle 11g to Mysql 5.7_oracle_13

5)传输定义文件至目标端

scp /ogg/dirdef/def_hr.def root@192.168.1.12:/ogg/dirdef/

2、目标端配置

1)配置MGR管理进程

cd /ogg/
./ggsci

##配置参数文件,编辑方法同vim编辑器
edit param mgr        
PORT 7809
DYNAMICPORTLIST 7810-7820
AUTOSTART EXTRACT *
AUTORESTART EXTRACT *
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 7
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
ACCESSRULE, PROG *, IPADDR *, ALLOW

启动mgr进程
start mgr
info all

参数说明
ACCESSRULE:配置为允许所有程序,所有ip地址访问。

2)配置全量复制进程

##编辑配置文件
edit param rinit_01

replicat rinit_01
targetdb hr@192.168.1.12:3306,userid ogg,password 123456
sourcedefs /ogg/dirdef/def_hr.def 
discardfile ./dirrpt/rinit_01.dsc,append,megabytes 1024
MAP hr.countries, TARGET hr.countries;
MAP hr.departments, TARGET hr.departments;
MAP hr.employees, TARGET hr.employees;
MAP hr.job_history, TARGET hr.job_history;
MAP hr.jobs, TARGET hr.jobs;
MAP hr.locations, TARGET hr.locations;
MAP hr.regions, TARGET hr.regions;

注:如配置为hr.* 则会连同源端的视图一起同步,我这里目标端并未创建视图

参数说明
targetdb:指定数据库的连接字符串信息。格式为:数据库名@IP地址:端口号,用户名密码
sourcedefs:指定源定义文件的路径
discardfile:将执行失败的记录保存在discard file中,大小为1024 MB,记录方式为追加。

##添加复制进程

ADD REPLICAT rinit_01, SPECIALRUN

注:该进程无需手动启动,待源端全量抽取进程启动后,会自动启动该进程

3、全量数据同步

1)启动源端抽取进程

启动进程及查看状态

start extract einit_01
view report einit_01

Ogg Oracle 11g to Mysql 5.7_oracle_14


同时观察/ogg/ggserr.log日志

Ogg Oracle 11g to Mysql 5.7_mysql_15


einit_01进程在同步完成后正常结束

2)观察目标端复制进程

view report rinit_01

Ogg Oracle 11g to Mysql 5.7_mysql_16


同时观察/ogg/ggserr.log日志

Ogg Oracle 11g to Mysql 5.7_oracle_17


rinit_01进程在同步完成后正常结束

五、OGG同步__增量同步

1、源端配置

1)编辑抽取进程参数文件

edit param ext_hr

EXTRACT ext_hr
userid ogg,password ogg123
SETENV (ORACLE_SID=orcl)
SETENV (ORACLE_HOME=/u01/app/oracle/product/11.2/dbhome_1)
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
EXTTRAIL ./dirdat/hr
DISCARDFILE ./dirrpt/ext_hr.dsc, APPEND, MEGABYTES 1000
DBOPTIONS  ALLOWUNUSEDCOLUMN
DISCARDROLLOVER AT 22:00 ON SUNDAY
WARNLONGTRANS 2H,CHECKINTERVAL 5M
FETCHOPTIONS NOUSESNAPSHOT
REPORTCOUNT EVERY 30 MINUTES, RATE
TABLE HR.*;

参数含义
EXTRACT:指定抽取进程名。
userid: 登录Oracle数据库用户名和密码。
SETENV:配置Oracle环境变量。
EXTTRAIL: 指定写入到本地的队列文件路径。
DISCARDFILE: 将执行失败的记录保存在discard file中,大小为 1000 MB。 文件中已经包含记录的话,在后面继续追加,不删除之前的记录。
DISCARDROLLOVER AT 22:00 ON SUNDAY :为了防止discard file被写满,每周周天22:00做一次文件过期设定。
WARNLONGTRANS :每隔5分钟检查一下大事务,超过2小时还没结束的进行报告。
REPORTCOUNT EVERY 30: 每隔30分钟报告一次从程序开始到现在的抽取进程或者复制进程的事物记录数,并汇报进程的统计信息。

2)添加抽取进程组

可以从指定时间点开始抽取,或者从当前now开始抽取

可先info einit_01,查询全量抽取时,截止的时间点信息

Ogg Oracle 11g to Mysql 5.7_mysql_18

add extract ext_hr,tranlog,begin 2023-06-02 15:15:59, threads 1

3)添加抽取进程的队列文件

add exttrail ./dirdat/hr, extract ext_hr, megabytes 100

4)启动抽取进程

start ext_hr
info all

Ogg Oracle 11g to Mysql 5.7_mysql_19

5)编辑投递进程参数文件

edit params pup_hr

EXTRACT pup_hr
SETENV (ORACLE_SID=orcl)
SETENV (ORACLE_HOME=/u01/app/oracle/product/11.2/dbhome_1)
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
userid ogg,password ogg123
PASSTHRU
RMTHOST 192.168.1.12,MGRPORT 7809,compress
RMTTRAIL ./dirdat/hr
TABLE HR.*;

参数含义
PASSTHRU:采用pass-through模式处理表.表示投递进程在投递的过程中只负责文件投递,不进行任何转化。
RMTHOST:目标端的机器IP地址或者主机名称、端口,投递前压缩队列文件
RMTTRAIL:target db保存队列文件的目录.当投递进程将队列文件投递到目标端后放置的目录和队列文件

6)添加投递进程组

add extract pup_hr,exttrailsource ./dirdat/hr

7)指定投递进程的远程队列文件

add rmttrail ./dirdat/hr,extract pup_hr, megabytes 100

8)启动投递进程

start pup_hr
info all

Ogg Oracle 11g to Mysql 5.7_mysql_20

2、目标端配置

1)添加检查点表

ggsci命令行中登录数据库

cd /ogg
./ggsci
dblogin sourcedb hr@192.168.1.12:3306 userid ogg password 123456
add checkpointtable hr.checkpoint_table

Ogg Oracle 11g to Mysql 5.7_mysql_21

2)编辑复制进程参数文件

edit  params rep_hr

REPLICAT rep_hr
TARGETDB hr@192.168.1.12:3306, USERID ogg, PASSWORD 123456
sourcedefs ./dirdef/def_hr.def
DISCARDFILE ./dirrpt/rep_hr.dsc, APPEND, MEGABYTES 1024
ALLOWNOOPUPDATES
REPORTCOUNT EVERY 30 MINUTES, RATE
REPERROR DEFAULT, ABEND
DISCARDROLLOVER AT 22:00 ON SUNDAY
MAP hr.countries, TARGET hr.countries;
MAP hr.departments, TARGET hr.departments;
MAP hr.employees, TARGET hr.employees;
MAP hr.job_history, TARGET hr.job_history;
MAP hr.jobs, TARGET hr.jobs;
MAP hr.locations, TARGET hr.locations;
MAP hr.regions, TARGET hr.regions;

3)添加复制进程组

add replicat rep_hr, exttrail ./dirdat/hr,checkpointtable hr.checkpoint_table

4)启动复制进程

start replicat rep_hr

3、增量数据同步测试

1)新增数据

源端:

select * from hr.regions;
insert into hr.regions values(5,'china');
commit;

Ogg Oracle 11g to Mysql 5.7_oracle_22


目标端:

select * from hr.regions;

Ogg Oracle 11g to Mysql 5.7_ogg_23

2)修改数据

源端:

select * from hr.employees where EMPLOYEE_ID=197;
update hr.employees set FIRST_NAME='AAAA' where EMPLOYEE_ID=197;
commit;

Ogg Oracle 11g to Mysql 5.7_oracle_24


目标端:

select * from hr.employees where EMPLOYEE_ID=197;

Ogg Oracle 11g to Mysql 5.7_ogg_25

3)删除数据

源端:

select * from hr.job_history where EMPLOYEE_ID=200;
delete from hr.job_history where EMPLOYEE_ID=200;
commit;

Ogg Oracle 11g to Mysql 5.7_oracle_26


目标端:

select * from hr.job_history where EMPLOYEE_ID=200;

Ogg Oracle 11g to Mysql 5.7_ogg_27

参考文档

How to Replicate Data Between Oracle and MySQL Database? (Doc ID 1605674.1)