OGG配置11g到mysql的同步

发布时间 2023-06-21 15:56:04作者: 数据库小白(专注)

OGG配置11g到mysql的同步

环境说明

操作系统 el6.x86_64 el6.x86_64
主机名 oracle 11g mysql
Ip 地址 192.168.1.115 192.168.1.111
数据库版本 Oracle 11.2.0.4.0 5.7.23 (GPL)
数据库字符集 AMERICAN_AMERICA.ZHS16GBK utf8
数据库实例名 dg orcl
Goldengate 用户/密码 ogg/ogg ogg/ogg
Goldengate 版本 Version 12.2.0.2.2 Version 12.2.0.2.2
安装包名 122022_fbo_ggs_Linux_x64_shiphome.zip ggs_Linux_x64_MySQL_64bit.tar
迁移目标 ogg.TEST orcl.TEST

安装前准备

安装包下载;https://www.oracle.com/middleware/technologies/goldengate-downloads.html
oracle -软件下载-中间件,在历史库中选择对应版本

  • 配置ip和主机名映射(源和目标库)
[root@tidb4 opt]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain
192.168.1.111 tidb4
192.168.1.115 dg
  • 关闭防火墙(源和目标库)
service iptables stop
或者
systemctl stop firewalld
  • 迁移之前需要先创建好目标库上的表结构
CREATE TABLE `TEST` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  • 查看oracle的字符集
select userenv('language') from dual;

需要迁移的表上必须要有主键。

安装配置OGG

源端:

创建OGG安装目录
mkdir -p /opt/ogg/

授权(使用oracle用户安装,如果是其他用户属组应该是oinstall)
chown -R ogg:oinstall /opt/ogg/
chown -R oracle:oinstall fbo_ggs_Linux_x64_shiphome

cd /opt/ogg_bak/fbo_ggs_Linux_x64_shiphome/Disk1
./runInstaller

选择安装11G版本数据库:
1060880-20190813092202000-1630995798

OGG安装目录选择:/opt/ogg
MGR目录自动填充了oracle_home 目录,不用修改:

1060880-20190813092526727-310452680

或者使用静默安装

修改安装文件,指定安装位置和数据库版本
[oracle@localhost ~]$ cd /home/oracle/ogg/fbo_ggs_Linux_x64_shiphome/Disk1/response
[oracle@localhost response]$ vim oggcore.rsp
更改对应项为一下内容(指定数据库版本,制定安装路径)
                INSTALL_OPTION=ORA11g
                SOFTWARE_LOCATION=/back/oggt

[oracle@localhost response]$ cd /home/oracle/ogg/fbo_ggs_Linux_x64_shiphome/Disk1
[oracle@localhost Disk1]$ ./runInstaller -silent -responseFile /home/oracle/ogg/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp

配置OGG环境变量(源端oracle用户)

cat .bash_profile 
export GG_HOME=/opt/ogg
export LD_LIBRARY_PATH=$GG_HOME:$ORACLE_HOME/lib:/usr/bin:/lib 
export PATH=$GG_HOME:$PATH

目标端解压即可:

mkdir -p /opt/ogg
tar -xvf ggs_Linux_x64_MySQL_64bit.tar -C /opt/ogg

oracle配置

  • 打开归档模式
查看归档状态:
archive log list
sqlplus / as sysdba
shutdown immediate
启动并装载数据库,但没有打开数据文件,该命令常用来修改数据库运行模式或恢复数据库。执行命令
startup mount
alter system set log_archive_dest_1='location=/arp/oraarp/archive';
alter database archivelog;
alter database open;
  • Oracle开启辅助日志和补充日志
验证数据库是否开启辅助日志和补充日志
select force_logging,supplemental_log_data_min from v$database;
当显示NO的时候表示没有开启,需要调整

开启数据库的辅助日志和补充日志
开启强制日志后数据库会记录除临时表空间或临时回滚段外所有的操作,命令:

alter database force logging;

开启辅助日志命令:

alter database add supplemental log data;

开启主键附加日志命令:

alter database add supplemental log data (primary key) columns;

开启全列附加日志命令:

alter database add supplemental log data (all) columns; 

创建测试库和表

  • 源端(oracle)
    在sqlplus创建管理ogg的用户ogg
SQL> create tablespace ggs datafile '/u01/app/oracle/oradata/ORCL/orcl01.dbf' size 200m;
SQL> create user ogg identified by ogg default tablespace ggs;;
SQL> grant connect,resource,select any dictionary,select any table,alter any table,flashback any table to ogg;
SQL> grant insert any table,update any table,delete any table to ogg;
SQL> grant execute on dbms_flashback to ogg;
SQL> grant execute on utl_file to ogg;
SQL> ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE;
SQL> grant execute on sys.DBMS_CAPTURE_ADM to ogg;

注意:需要授予我们需要同步的用户查看数据字典的权力
同步的表在哪个用户下,哪个用户就要拥有查看数据字典的权力,
比如:源端使用tom做测试

SQL> create user tom identified by tom;
SQL> grant connect,resource,select any dictionary to tom;

这里我们就是要OGG用户做测试

conn ogg/ogg
SQL> create table TEST (ID int,NAME varchar2(200));
SQL> insert into TEST values (1,'zhansan');
SQL> insert into TEST VALUES (2,'lisi');
SQL> commit;
SQL> col id format 9,999
SQL> col name format a20
SQL> select * from TEST;
  • 目标端(mysql)
mysql> create database orcl;
mysql> create user 'ogg'@'%' identified by 'ogg';
mysql> GRANT ALL ON *.* TO 'ogg'@'%';
mysql> use orcl;
mysql> CREATE TABLE `TEST` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

运行OGG支持DDL脚本

源端(ORACLE)

进入OGG的家目录下执行:

sqlplus  / as sysdba
SQL> @marker_setup.sql
Enter Oracle GoldenGate schema name:ogg
SQL> @ddl_setup.sql
Enter Oracle GoldenGate schema name:ogg
SQL> @role_setup.sql
Enter Oracle GoldenGate schema name:ogg
SQL> @ddl_enable.sql

OGG配置

创建目录

  • 源端(oracle)
$ ./ggsci
GGSCI (oracle11c.vastdata.com) 1> create subdirs
  • 目标端(MYSQL)
$ ./ggsci
GGSCI (mysql.vastdata.com.cn) 1> create subdirs

目录用途说明:

名字 用途
dirprm 存放OGG参数配置信息
dirrpt 存放进程报告文件
dirchk 存放检查点文件
dirpcs 存放进程状态文件
dirsql 存放SQL脚本文件
dirdef 存放DEFGEN工具生成的数据定义文件
dirdat 存放Trail文件,也就是captue进程捕获的日志文件
dirtmp 当事务需要的内存超过已分配内存时,默认存放在这个目录

1.配置管理进程的参数文件

(源端)

GGSCI> edit params mgr
--------------------------------------------------------------------
PORT 7809
DYNAMICPORTLIST 7840-7850
--AUTOSTART ER *
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45

GGSCI> view params mgr
GGSCI> start mgr
GGSCI> info all

(目标端)

GGSCI> edit params mgr
--------------------------------------------------------------------
PORT 7809
ACCESSRULE, PROG *, IPADDR 192.168.1.115, ALLOW
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints, minkeepdays 3
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45

GGSCI> view params mgr
GGSCI> start mgr
GGSCI> info all
# 参数解释autorestart-自动重启抽取进程,purgeoldextracts-定期清理trail文件

MANAGER进程参数配置说明:

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

2.配置抽取进程

(源端)
2.1 编辑抽取参数文件

GGSCI> edit params ext1
-------------------------------------------------------------------------------------------
extract ext1
setenv(ORACLE_SID=orcl) #填源端的sid
setenv(NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) #填源端的字符集
userid ggs,password ggs
rmthost 192.168.56.11,mgrport 7788 #填源端的ip,抽取的文件放到哪个地方
exttrail /home/oracle/ogg1/dirdat/et
table tom.test1;

比如:
extract ext1
setenv(ORACLE_SID=dg)
setenv(NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)
userid ogg,password ogg
rmthost 192.168.1.115,mgrport 7809
exttrail /opt/ogg/dirdat/et
table ogg.test;

2.2 添加抽取进程

GGSCI> add extract ext1, tranlog, begin now

2.3 添加抽取进程需要的文件

GGSCI> add exttrail /opt/ogg/dirdat/et,extract ext1,megabytes 100 #设置trail文件最大100m,默认10m

参数说明:

ext的模板可以是:
EXTRACT extmb
setenv (NLS_LANG = "AMERICAN_AMERICA.UTF8")
SETENV (ORACLE_HOME = "/u01/oracle/product/11.2.0/db_1")
SETENV (ORACLE_SID = "orcl")
USERID ggs, PASSWORD ggs
--GETTRUNCATES
REPORTCOUNT EVERY 1 MINUTES, RATE
DISCARDFILE ./dirrpt/extmb.dsc,APPEND,MEGABYTES 1024
--THREADOPTIONS MAXCOMMITPROPAGATIONDELAY 60000 IOLATENS 60000
DBOPTIONS ALLOWUNUSEDCOLUMN
WARNLONGTRANS 2h,CHECKINTERVAL 3m
EXTTRAIL ./dirdat/mb
--TRANLOGOPTIONS EXCLUDEUSER USERNAME
FETCHOPTIONS NOUSESNAPSHOT
TRANLOGOPTIONS CONVERTUCS2CLOBS
TABLE hr.emp;

SETENV:配置系统环境变量
USERID/ PASSWORD: 指定OGG连接数据库的用户名和密码
COMMENT:注释行,也可以用--来代替;
TABLE:定义需复制的表,后面需以;结尾
TABLEEXCLUDE:定义需要排除的表,如果在TABLE参数中使用了通配符,可以使用该参数指定排除掉得表。
GETUPDATEAFTERS|IGNOREUPDATEAFTERS:是否在队列中写入后影像,缺省复制
GETUPDATEBEFORES| IGNOREUPDATEBEFORES:是否在队列中写入前影像,缺省不复制
GETUPDATES|IGNOREUPDATES:是否复制UPDATE操作,缺省复制
GETDELETES|IGNOREDELETES:是否复制DELETE操作,缺省复制
GETINSERTS|IGNOREINSERTS:是否复制INSERT操作,缺省复制
GETTRUNCATES|IGNORETRUNDATES:是否复制TRUNCATE操作,缺省不复制;

3.配置投递进程

(源端)
3.1 编辑投递参数文件

GGSCI> edit params pump1
------------------------------------------------------------------------
extract pump1
PASSTHRU #这是参数适用于源端和目标端表结构一致且没有过滤行
RMTHOST 192.168.56.71, MGRPORT 7788 #目标端ip
RMTTRAIL /home/mysql/ogg2/dirdat/p1 #目标端文件的目录
TABLE tom.test1;

比如:
extract pump1
passthru
dynamicresolution
userid ogg,password ogg
rmthost 192.168.1.111 mgrport 7809
rmttrail /opt/ogg/dirdat/pt
table ogg.test;

3.2 添加投递进程(注意:这里是投递进程中的rtial文件的位置)

GGSCI> add extract pump1,exttrailsource /opt/ogg/dirdat/et, begin now

3.3 添加投递到远程的文件(注意:这里是远程目录(也就是目标机器上的)的rtial文件的位置)

GGSCI> add rmttrail /opt/ogg/dirdat/pt, extract pump1,megabytes 100

参数说明:

push的模板:
EXTRACT pushmb
SETENV (NLS_LANG = "AMERICAN_AMERICA.UTF8")
USERID ggs, PASSWORD ggs
PASSTHRU
RMTHOST 192.168.0.165, MGRPORT 7809, compress
RMTTRAIL /u01/ogg/11.2/dirdat/xs
TABLE hr.ah4;
RMTHOST:指定目标系统及其Goldengate Manager进程的端口号,还用于定义是否使用压缩进行传输,本例中的compress为压缩传输;
RMTTRAIL:指定写入到目标断的哪个队列;
EXTTRAIL:指定写入到本地的哪个队列;
SQLEXEC:在extract进程运行时首先运行一个SQL语句;
PASSTHRU:禁止extract进程与数据库交互,适用于Data Pump传输进程;
REPORT:定义自动定时报告;
STATOPTIONS:定义每次使用stat时统计数字是否需要重置;
REPORTCOUNT:报告已经处理的记录条数统计数字;
TLTRACE:打开对于数据库日志的跟踪日志;
DISCARDFILE:定义discardfile文件位置,如果处理中油记录出错会写入到此文件中;
DBOPTIONS:指定对于某种特定数据库所需要的特殊参数;
TRANLOGOPTIONS:指定在解析数据库日志时所需要的特殊参数,例如:对于裸设备,可能需要加入以下参数 rawdeviceoggset 0
WARNLONGTRANS:指定对于超过一定时间的长交易可以在gsserr.log里面写入警告信息,本处配置为每隔3分钟检查一次场交易,对于超过2小时的进行警告;

4.添加需要同步的表

源端(oracle)
添加表级的trandata可以理解为需要将哪些用户的哪些表和目标库同步,其实也是添加表级的supplemental log,但是只有上文打开的minimal supplemental log后,这个才生效。

使用第7节建立的OGG用户从OGG登录源端数据库。

# 这里是添加表的附加日志
GGSCI> dblogin userid ogg, password ogg
GGSCI> add trandata ogg.test

如果要同步其他的用户下的表,可以用下面的语句添加:
GGSCI> info trandata ogg.test1

5.配置define文件,异构的ogg需要这步

只需要在源端(oracle)配置

编辑
GGSCI (dg as ogg@dg) 35> edit params defgen

defsfile ./dirdef/source.def, purge
userid ogg , password ogg
TABLE ogg.TEST;

查看:
GGSCI (dg as ogg@dg) 35> view params defgen

新开一个窗口
# su - oracle
$ cd ogg
$ ./defgen paramfile dirprm/source.prm
$ scp dirdef/source.def mysql@192.168.1.111:/opt/ogg/dirdef

注意:以上dirdef 目录下的.def文件为执行 ./defgen paramfile dirprm/source.prm命令之后生成的。
dirdef 目录下为差异文件
dirprm 目录下为define配置文件

源端配置生成定义文件处理(配置多个表时)
TABLE HR.*;

6. 添加checkpoint表

此步骤不是必须的,但是为了让OGG网络中断、服务器宕机、掉电等在突发情况也能正确断点续传,ORACLE建议配置OGG的检查点队列。
源端(oracle)

GGSCI> dblogin userid ogg, password ogg
GGSCI> edit params ./GLOBALS
#或使用vi编辑参数文件,注意GLOBALS是在ogg的主目录下面,使用绝对路径或者./GLOBALS,不能使用edit params GlOBALS,否则会进到dirprm目录下面
--------------------------------------------------------------------------
checkpointtable ogg.ggschkpt

GGSCI> view params ./GLOBALS #查看参数文件
GGSCI> add checkpointtable ogg.ggschkpt #在数据库中创建检查点记录表
GGSCI> info checkpointtable ogg.ggschkpt

目标端(mysql)

# 续传的功能
GGSCI> dblogin sourcedb orcl, userid ogg, password ogg
GGSCI> edit params ./GLOBALS
#或使用vi编辑参数文件,注意GLOBALS是在ogg的主目录下面,使用绝对路径或者./GLOBALS,不能使用edit params GlOBALS,否则会进到dirprm目录下面
--------------------------------------------------------------------------
checkpointtable orcl.ggschkpt

GGSCI> view params ./GLOBALS #查看参数文件
GGSCI> add checkpointtable orcl.ggschkpt #在数据库中创建检查点记录表
GGSCI> info checkpointtable orcl.ggschkpt

7. 配置复制进程

(目标端)
7.1 编辑复制参数文件

GGSCI> edit params rep1
-----------------------------------------------------------------
replicat rep1
sourcecharset ZHS16GBK #填源端的字符集
targetdb hello, userid ggt, password ggt #目标端数据库配置
sourcedefs /home/mysql/ogg2/dirdef/oracle_to_mysql.prm #源端传过来的def差异文件
discardfile /home/mysql/ogg2/dirdat/rep1.dsc,append #目标端的复制进程目录
MAP tom.test1, TARGET hello.test2;

比如:
replicat rep1
sourcecharset ZHS16GBK
targetdb orcl, userid ogg, password ogg
sourcedefs /opt/ogg/dirdef/source.def
discardfile /opt/ogg/dirdat/rep1.dsc,append
MAP ogg.test, TARGET orcl.TEST;
--------------------------------------------------------------------

参数说明:

REPLICAT进程参数配置说明:
ASSUMETARGETDEFS:假定两端数据结构一致使用此参数;
SOURCEDEFS:假定两端数据结构不一致,使用此参数指定源端的数据结构定义文件,该文件需要由GlodenGate工具产生。
MAP:用于指定源端与目标端表的映射关系;
MAPEXCLUDE:用于使用在MAP中使用*匹配时排除掉指定的表;
REPERROR:定义出错以后进程的响应,一般可以定义为两种:
ABEND,即一旦出现错误即停止复制,此为缺省配置;
DISCARD,出现错误后继续复制,只是把错误的数据放到discard文件中。
DISCARDFILE:定义discardfile文件位置,如果处理中油记录出错会写入到此文件中;
SQLEXEC:在进程运行时首先运行一个SQL语句;
GROUPTRANSOPS:将小交易合并成一个大的交易进行提交,减少提交次数,降低系统IO消耗。
MAXTRANSOPS:将大交易拆分,每XX条记录提交一次。

作者:献给记性不好的自己
链接:https://www.jianshu.com/p/53882229b70e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

7.2 增加复制进程

GGSCI> add replicat rep1,exttrail /opt/ogg/dirdat/pt
#注意这一步可能提示下面错误(该目录是目标端下的目录)
ERROR: No checkpoint table specified for ADD REPLICAT.
解决办法:退出重新登陆,再执行那步操作
GGSCI> exit
[mysql@mysqla ogg2]$ ./ggsci
GGSCI> dblogin sourcedb hello, userid ggt, password ggt
GGSCI> add replicat rep1,exttrail /opt/ogg/dirdat/pt

8. 启动进程

源端

GGSCI> start mgr
GGSCI> start ext1
GGSCI> start pump1

目标端

GGSCI> start mgr
GGSCI> start rep1

在源端查看进程状态

GGSCI> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:00:00 00:00:09
EXTRACT RUNNING PUMP1 00:00:00 00:00:02

在目标端查看进程状态

GGSCI> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REP1 00:00:00 00:00:04

OGG常用命令

查看报告

view report  EXT1

查看日志:

tail -f /opt/ogg/ggserr.log 
1、 启动manager:start manager
2、 启动extract:start extract extn
3、 启动replicat:start replicat repn
4、 停止manager:stop manager
5、 停止 extract:stop extract extn
6、 停止replicat:stop replicat repn
7、 删除extract:delete extract extn
8、 删除replicat:delete extract repn
9、 查看ogg状态:info all
10、 修改manager参数:edit params mgr
11、 修改extract参数:edit params extn
12、 修改replicat参数:edit params repn
13、 修改全局参数:edit params ./GLOBAL

作者:献给记性不好的自己
链接:https://www.jianshu.com/p/53882229b70e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

OGG开机自启

1、用oracle用户建立/oracle/ogg/autostart/info.txt,文件内容如下:
sh dat
start mgr
2、chmod x info.txt
3、用oracle用户建立/oracle/ogg/autostart/startmgr.sh,文件内如下:
/oracle/ogg/ggsci paramfile /oracle/ogg/autostart/info.txt >> /oracle/ogg/autostart/log.txt
4、chmod x startmgr.sh
5、用root用户编辑 /etc/rc.local ,添加如下信息:
su - oracle -c "/oracle/ogg/autostart/startmgr.sh"

8. 测试是否同步

总结:

  1. 从ogg到mysql有字段类型的变化,比如oracle中date类型就是“年月日 时分秒”类型,到了mysql中只有“年月日”,所以mysql中需要定义成datetime类型。还有mysql中字符类型是默认不区分大小写的,oracle中明确区分大小写,所以在同步时如果字符类型上面有唯一索引,还会报错。
  2. 异构的ogg比同构的ogg还需要define文件,定义表的结构。