下图1->2->3->4->5->6->7->8->9是OGG增量同步过程:
源端(左):
Extract进程通过分析Oracle redo/archive日志,捕获数据变更,结果写到Trail文件,Data pump进程读取Trail文件发给目标端。
目标端(右):
collector进程接收Trail文件并写到目标端目录,Replicat进程读取Trail,转换为对目标端数据库的操作。
除了下图的Extract进程、Data pump进程、collector进程、Replicat进程和Trail文件,在源端和目标端还需开启manager进程,它负责控制Extract、Data pump、collecor和Replicat。
配置源端(Oracle 12c)数据库,增加补充日志并开启归档日志:
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER SYSTEM SET log_archive_dest='/mnt/disk01/oracle_archive_log';
ALTER DATABASE ARCHIVELOG;
ALTER SYSTEM SET enable_goldengate_replication=TRUE;
(否则会有ERROR OGG-02091 Operation not supported because enable_goldengate_replication is not set to true.)
ALTER DATABASE FORCE LOGGING;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE OPEN;
ARCHIVE LOG LIST;
配置目标端(Oracle 19c)数据库:
alter system set enable_goldengate_replication=true scope=both;
这个参数不需要重启数据库就可以生效。
否则Replicat启动失败,报错:
ERROR OGG-02091 Operation not supported because enable_goldengate_replication is not set to true.
安装(Oracle 12c)源端OGG:
我的源端和目标端都安装一样的OGG版本:
213000_fbo_ggs_Linux_x64_Oracle_shiphome.zip
下载地址:
Oracle GoldenGate Downloads
以oracle用户解压213000_fbo_ggs_Linux_x64_Oracle_shiphome.zip
unzip 213000_fbo_ggs_Linux_x64_Oracle_shiphome.zip -d ogg-for-oracle
cd ogg-for-oracle/fbo_ggs_Linux_x64_shiphome/Disk1/response
修改配置文件:
cp oggcore.rsp oggcore-setup.rsp
vim oggcore-setup.rsp
修改下面几项:
INSTALL_OPTION=ora21c
SOFTWARE_LOCATION=/mnt/disk01/INSTALLED_OGG21C
START_MANAGER=false
然后执行:
cd ogg-for-oracle/fbo_ggs_Linux_x64_shiphome/Disk1
./runInstaller -silent -responseFile /mnt/disk01/ogg-for-oracle/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore-setup.rsp
等待直到打印 “ The installation of Oracle GoldenGate Core was successful. ” 表示安装完成。
OGG将安装在/mnt/disk01/INSTALLED_OGG21C目录下。
配置环境变量:
export OGG_HOME=/mnt/disk01/INSTALLED_OGG21C
export LD_LIBRARY_PATH=/mnt/disk01/INSTALLED_OGG21C:$LD_LIBRARY_PATH
export PATH=/mnt/disk01/INSTALLED_OGG21C:$PATH
安装(Oracle 19c)目标端OGG:
以oracle用户解压213000_fbo_ggs_Linux_x64_Oracle_shiphome.zip
unzip 213000_fbo_ggs_Linux_x64_Oracle_shiphome.zip -d ogg-for-oracle
cd ogg-for-oracle/fbo_ggs_Linux_x64_shiphome/Disk1/response
修改配置文件:
cp oggcore.rsp oggcore-setup.rsp
vim oggcore-setup.rsp
修改下面几项:
INSTALL_OPTION=ora21c
SOFTWARE_LOCATION=/mnt/disk01/INSTALLED_OGG21C
START_MANAGER=false
然后执行:
cd ogg-for-oracle/fbo_ggs_Linux_x64_shiphome/Disk1
./runInstaller -silent -responseFile /mnt/disk01/ogg-for-oracle/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore-setup.rsp
等待直到打印 “ The installation of Oracle GoldenGate Core was successful. ” 表示安装完成。
OGG将安装在/mnt/disk01/INSTALLED_OGG21C目录下。
配置环境变量:
export OGG_HOME=/mnt/disk01/INSTALLED_OGG21C
export LD_LIBRARY_PATH=/mnt/disk01/INSTALLED_OGG21C:$LD_LIBRARY_PATH
export PATH=/mnt/disk01/INSTALLED_OGG21C:$PATH
配置源端(Oracle 12c)OGG:
进入安装目录$OGG_HOME,执行ggsci启动OGG终端GGSCI,所有配置和操作都在这个终端下进行。
第一步、创建子目录
GGSCI > create subdirs
第二步、配置manager,编辑manager配置文件
GGSCI > edit param mgr
PORT 7809 --监听端口
AUTOSTART ER *
AUTORESTART ER *
启动manager
GGSCI > start manager
关闭manager
GGSCI > stop manager
第三步、用户登录数据库
GGSCI的有些操作,需要以数据库用户连接到数据库,建议使用被迁移数据库的用户,只要确保有足够权限就行,例如,在我的Oracle中主要使用数据库用户paastest,在GGSCI中尝试连接:
GGSCI >dblogin userid paastest@172.32.150.13:1521/nlpass01 password Paas1015
第四步、编辑Extract配置文件
文件名随便取(这里是extora),最好和Extract组名相同,编辑完退出后,会在$OGG_HOME/dirprm目录下创建名为extora.prm的文本文件:
GGSCI >edit param extora
EXTRACT extora -- Extract组名
-- 客户端的编码,如果oracle字符串编码不是UTF8会转为UTF8
SETENV (NLS_LANG="AMERICAN_AMERICA.ZHS16GBK")
-- 连接Oracle服务器的信息,最好OGG与Oracle安装在同一台机器上
USERID paastest@172.32.150.13:1521/nlpass01, PASSWORD Paas1015
-- discard文件,出错时可查看详细信息
DISCARDFILE ./dirrpt/extora.dsc, APPEND, MEGABYTES 1024
-- Trail文件路径,会生成多个Trail文件,文件名为前缀ex+文件编号
EXTTRAIL /mnt/disk03/ogg_trail/ex
--支持truncate
GETTRUNCATES
-- 捕获delete、update不使用压缩方式
NOCOMPRESSDELETES FETCHMISSINGCOLUMNS
NOCOMPRESSDELETES
NOCOMPRESSUPDATES
-- 需要捕获的表,每个表一行,全部列出包含schema名
TABLE PAASTEST.ACT_EVT_LOG;
.....
更详细的命令和参数说明,参考:Summary of Oracle GoldenGate Commands
第五步、创建Extract组
一个Extract组代表一个Extract进程,前面的Extract配置文件需要与Extract组关联,步骤如下:
先在GGSCI中连接Oracle
GGSCI >DBLOGIN USERID PAASTEST@172.32.150.13:1521/nlpass01 PASSWORD Paas1015
创建心跳表,用于监控同步进度,这步可选,但最好加上,后面监控会方便很多
GGSCI >ADD HEARTBEATTABLE
执行add extract命令,创建Extract组,前面配置文件里的组名,要与这里的组名相同,表示配置文件用于这个组:
GGSCI (dkapp12 as PAASTEST@nlpass01) >ADD EXTRACT extora,TRANLOG,BEGIN NOW
或
GGSCI (dkapp12 as PAASTEST@nlpass01) >ADD EXTRACT extora,TRANLOG,BEGIN 2022-09-15 16:00
注册extract组:
GGSCI (dkapp12 as PAASTEST@nlpass01) >register extract extora, database
否则启动Extract时,会有报错ERROR OGG-02022 Logmining server does not exist on this Oracle database
删除Extract组:
-- 连接源端数据库
GGSCI >DBLOGIN USERID PAASTEST@172.32.150.13:1521/nlpass01 PASSWORD Paas1015
GGSCI >DELETE EXTRACT extora
GGSCI (dkapp12 as PAASTEST@nlpass01) >unregister extract extora, database
查看状态:
GGSCI >info extora
第六步、创建Trail文件:
GGSCI >ADD EXTTRAIL /mnt/disk03/ogg_trail/ex, EXTRACT extora, MEGABYTES 200
解释:增量数据都缓存在里面,Trail文件会有多个,以ex开头,放在目录/mnt/disk03/ogg_trail/下,请确保目录所在磁盘足够大,”EXTRACT extora”将Trail文件和Extract组关联,MEGABYTES 200表示每个Trail文件200M。
删除Trail文件:
DELETE EXTTRAIL /mnt/disk03/ogg_trail/ex
rm /mnt/disk03/ogg_trail/ex*
第七步、创建Data Pump配置文件
文件名随便取(这里是pumpora),建议与Data Pump组名相同:
GGSCI >edit param pumpora
-- Data Pump组名称
EXTRACT pumpora
SETENV (NLS_LANG="AMERICAN_AMERICA.ZHS16GBK")
-- 不处理数据,直接转发给目标端
PASSTHRU
-- RMTHOST是目标端IP,MGRPORT是目标端manager监听端口(在manager配置文件中配置),
RMTHOST 172.32.148.156, MGRPORT 1357
-- 目标端Trail文件所在目录,也可以用相对目录,相对于OGG安装目录
RMTTRAIL /mnt/disk01/ogg_trail/re
-- 注意,目标端的trail文件是re开头的
-- 需要转发给目的端的表名,每个表一行,包括schema名称
TABLE PAASTEST.ACT_EVT_LOG;
......
第八步、创建Data Pump组
仅仅创建Data Pump配置文件还不够,还需创建Data Pump组,与前面配置文件关联,步骤如下:
执行add extract命令创建Data Pump组,一个Data Pump组代表一个Data Pump进程,Data Pump进程也是一种Extract进程,只因配置不同而功能不同。
前面配置文件里的组名,要与这里的组名pumpora相同,表示配置文件用于这个组,EXTTRAILSOURCE是Extract在本地产生的Trail文件:
GGSCI >ADD EXTRACT pumpora, EXTTRAILSOURCE /mnt/disk03/ogg_trail/ex
创建远程(目标端)Trail文件路径,这个命令将远程Trail文件与Data Pump组关联:
GGSCI >ADD RMTTRAIL /mnt/disk01/ogg_trail/re, EXTRACT pumpora, MEGABYTES 200
删除pump的Extract组:
DELETE EXTRACT pumpora
删除远程Trail文件:
DELETE RMTTRAIL /mnt/disk01/ogg_trail/re
第九步、启动Extract开始捕获变更
GGSCI >start extora
查看Extract状态:
GGSCI >help
GGSCI >stats extora
GGSCI >status extora
查看 extora 是否成功运行,如果成功运行则trail目录下应该有生成文件
GGSCI >info all
GGSCI >info extoraGGSCI >lag extract*
如果出错,查看错误内容:
GGSCI >view report extora
第十步、启动data pump
(注意:要先启动目标端的manager)
GGSCI >start pumpora
查看data pump状态:
GGSCI >stats pumpora
如果要重新从第一个Trail文件的头部开始pump,就要删除pump组再重建。
pump主要就是把Extract产生的Trail文件复制到目标端的指定目录下。
如果要重新开始捕获,也要删除extract组再重建,同时要删除Trail文件,远程Trail文件也要删除。
配置目标端(Oracle 19c)OGG:
进入安装目录$OGG_HOME,执行ggsci启动OGG终端GGSCI,所有配置和操作都在这个终端下进行。
第一步、创建子目录
GGSCI > create subdirs
第二步、配置manager,编辑manager配置文件:
GGSCI > edit param mgr
PORT 1357 --监听端口
AUTOSTART ER *
AUTORESTART ER *
ACCESSRULE, PROG *, IPADDR *, ALLOW
在$OGG_HOME/GLOBALS中设置全局参数ALLOWOUTPUTDIR,这样manager可以在RMTTRAIL目录下创建文件,否则会有报错:OGG-01223 Output file /data3/ogg_trail/re000000 is not in any allowed output directories
参考:OGG-01031 Output file is not in any allowed output directories - ORACLE-SCN
GGSCI > edit param ./GLOBALS
ALLOWOUTPUTDIR /mnt/disk01/ogg_trail
启动manager
GGSCI > start manager
关闭manager
GGSCI > stop manager
查看manager状态
GGSCI > info manager
第三步、用户登录数据库:
GGSCI的有些操作,需要以数据库用户连接到数据库,建议使用被迁移数据库的用户,只要确保有足够权限就行,例如,在我的Oracle中主要使用数据库用户paastest,在GGSCI中尝试连接:
GGSCI >dblogin userid paastest@172.32.148.156:1521/nlpass01 password Paas1015
第四步、创建checkpoint表
checkpoint表就是一个普通的表,目标端Replicat从Trail文件提取变更,应用到目标端数据库,进度就保存在checkpoint表里。
GGSCI >add checkpointtable paastest.checkpointtab
这个命令会在登录用户paastest的schema下创建名为checkpointtab的表。
select * from paastest.checkpointtab;
删除checkopint表
delete checkpointtable paastest.checkpointtab
如果Replicat想要从头再次应用Trail文件,可以删除或清空checkpoint表,然后调整Replicat进程读取Trail的指针:
alter replora, extseqno 0, extrba 0
replora是Replicat组名(也可以理解成Replicat进程名)。
extseqno是Trail文件的编号,就是文件名的数字部分。
extrba 是记录(事务?)在Trail文件内的偏移,rba表示relative byte address。
再start replora
第五步、确认有swap分区
实践中发现Replicat需要有swap分区,如果已经有swap分区,这一步可以不用管,如果没有,创建一个文件作为swap分区,例如,创建一个16G的文件/mnt/disk01/swapfile作为swap分区。
以root用户执行:
dd if=/dev/zero of=/mnt/disk01/swapfile bs=1M count=16K
chmod -R 0600 /mnt/disk01/swapfile
mkswap /mnt/disk01/swapfile
swapon /mnt/disk01/swapfile
# 开机启动swap分区
vim /etc/fstab
/mnt/disk01/swapfile swap swap defaults 0 0
swapon -s
第六步、创建Replicat配置文件
GGSCI >edit param replpg
REPLICAT replora -- Replicat组名
-- 连接Oracle数据库的信息
USERID paastest@172.32.148.156:1521/nlpass01, PASSWORD Paas1015
DISCARDFILE ./dirrpt/replora.dsc, APPEND, MEGABYTES 1024
GETTRUNCATES
ALLOWNOOPUPDATES
INSERTMISSINGUPDATES
RESTARTCOLLISIONS
HANDLECOLLISIONS
-- 映射源数据库和目标数据库的表,必须要有,否则报错:
-- ERROR OGG-00052 No replication maps specified.
MAP PAASTEST.*, TARGET PAASTEST.*;
这里不需要太多的映射,也没有使用表定义文件,因为表定义包含在Trail文件里了:
可以这样做的前提是,之前的impdp执行的很成功。
第七步、创建Replicat组
Replicat组是Replicat进程的逻辑表示,Replicat组需要与Replicat配置文件关联:
GGSCI > add replicat replora, exttrail /mnt/disk01/ogg_trail/re, begin 2022-09-15 16:00, checkpointtable paastest.checkpointtab
exttrail 指源端data pump发来的Trail文件的路径,就是源端data pump配置文件中RMTTRAIL的路径。
删除Replicat组
dblogin userid paastest@172.32.148.156:1521/nlpass01 password Paas1015
delete replicat replora
第八步、启动Replicat
GGSCI >start replora
查看Replicat状态:
GGSCI >stats replora
GGSCI >info replora
GGSCI >view report replora
例子
-- 源端extract
dblogin userid paastest@172.32.150.13:1521/nlpass01 password Paas1015
edit param ext07
ADD EXTRACT ext07,TRANLOG,begin now
register extract ext07, database
ADD EXTTRAIL /mnt/disk03/ogg_trail/07, EXTRACT ext07, MEGABYTES 200-- 源端pump
edit param pup07
ADD EXTRACT pup07, EXTTRAILSOURCE /mnt/disk03/ogg_trail/07
ADD RMTTRAIL /mnt/disk01/ogg_trail/07, EXTRACT pup07, MEGABYTES 200
start ext07
start pup07
-- 目标端 replicat
add checkpointtable paastest.checkpointtab
edit param rpl07
add replicat rpl07, exttrail /mnt/disk01/ogg_trail/07, begin 2022-09-19 14:08, checkpointtable paastest.checkpointtab
高版本(19c)向低版本(12c)同步
19c(OGG源端)向12c(目的端)同步呢?会不会有兼容性问题,我使用的是OGG版本:
Oracle GoldenGate Command Interpreter for Oracle
Version 21.3.0.0.0 OGGCORE_21.3.0.0.0_PLATFORMS_210728.1047_FBO
Oracle Linux 7, x64, 64bit (optimized), Oracle Database 21c and lower supported versions on Jul 29 2021 03:59:23
Operating system character set identified as UTF-8.
初步测试,没有兼容性问题。