概述
GoldenGate简介
GoldenGate是Oracle公司的一款数据库中间件,它基于数据库的二进制日志以及事务提交,实现了数据库集群之间的数据迁移,主要用于数据库之间的同步和备份。
GoldenGate在组件中的作用
我们用GoldenGate来实现了对数据库数据修改的采集,以及将这些变化在远端输出为可供程序读取的文本文件。
结构简介
GoldenGate分为两端
源端作为数据源,负责从数据库采集数据,生成Trails文件,并发送到目标端;
目标端作为终点,负责处理从源端传来的Trails文件,并将这些文件转换为文本文件;
结构如图:
源端
源端上装有Oracle和GoldenGate,GoldenGate将Oracle的数据采集并以事务为单位,写入本地Trails文件,并在远程的GoldenGate上生成新的Trails文件(目前只有DML操作)。相关组件如下:
manager
GoldenGate的监控进程,负责控制GoldenGate的其他组件
extract
从数据库的二进制日志中抽取变化到Trails文件
pump
从源端的Trails文件里抽取信息并推送到目标端的Trails文件
目标端
目标端上的GoldenGate将源端输送过来的GoldenGate文件以特定的规则,转换为特定格式的文本文件。相关组件如下:
manager
GoldenGate的监控进程,负责控制GoldenGate的其他组件
ffwriter
将本地的Trails文件读取并转换为文本文件
内部组件
ggsci
GoldenGate的控制台,可以通过这个操作GoldenGate的附属组件
defgen
用于生成srcdef文件,供目标端的GoldenGate使用
logdump
用来解析Trails文件
环境配置
基本环境
源端的主机上需要装有数据库,笔者使用的Oracle11g,安装Oracle的过程就不再叙述
Oracle设置
00.开启归档模式
查看是否开启归档模式
SQL>archive log list
如果没有开启,可以使用以下命令将其打开
SQL>alter database archivelog
查看归档日志路径
SQL> show parameter DB_RECOVERY_FILE_DEST
01.开启补充日志
查看是否开启补充日志
select supplemental_log_data_min from v$database;
如果没有开启,可以用以下命令开启
alter database add supplement log data;
02.创建一个用于GoldenGate的账户
该账户需要有较高的权限
源端
00.解压GoldenGate
推荐将安装包解压后的文件的用户和用户组修改为与oracle相同
chown -R orasusr01 ogg
chgrp -R orasusr ogg
01.初始化GGSCI
进入GoldenGate的Home目录
输入命令,进入ggsci
$ ./ggsci
进入之后,输入以下命令,创建相关目录
GGSCI > CREATE SUBDIRS
用开始创建的Oracle用户登录
GGSCI > DBLOGIN USERID goldengate, PASSWORD goldengate
添加需要被采集的表,笔者需要采集test001用户下所有的表
GGSCI > add trandata test001.*
02.配置Manager
查看当前所有进程信息
GGSCI > info all
新建Manager的配置文件
GGSCI > edit params mgr
文件内容如下
port 7999
启动mgr
GGSCI > START mgr
03.配置extract
新建extract的配置文件
EDIT PARAMS etc
配置文件ext.prm
EXTRACT ext
SETENV (ORACLE_SID = "sid")
SETENV (NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK")
USERID userid, PASSWORD password
EXTTRAIL ./dirdat/la
dynamicresolution
table test001.*;
添加extract
ADD EXTRACT ext, TRANLOG, BEGIN NOW
并指定输出文件
ADD EXTTRAIL ./dirdat/la,EXTRACT ext
启动ext
START EXTRACT ext
可以使用命令查看启动情况,如果处于RUNNING状态,则启动成功
GGSCI > info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT 00:00:00 00:00:09
如果有异常,可以查看GoldenGateHome下的ggserr.log文件进行查看
03.配置pump
新建pump的配置文件
EDIT PARAMS pump
配置文件pump.prm
extract pump
passthru
rmthost 10.1.130.240, mgrport 7999
rmttrail ./dirdat/ra
dynamicresolution,nocompressupdates
table test001.*;
添加pump,并添加本地源文件
ADD EXTRACT pump, EXTTRAILSOURCE ./dirdat/la
添加pump的目标文件
ADD RMTTRAIL ./dirdat/ra, EXTRACT pump
启动
START EXTRACT pump
03.生成表结构的srcdef.def文件
目标端需要靠srcdef.def文件来掌握表结构,从而进行解析
配置flatfile.prm文件
DEFSFILE ./dirdef/srcdef.def
USERID goldengate,PASSWORD goldengate
TABLE test001.*;
生成srcdef.def文件
在GoldenGateHome目录下运行一下命令,运行时确保dirdef目录下没有srcdef.def文件
./defgen PARAMFILE ./dirprm/flatfile.prm
将生成的srcdef.def放到目标端的目录下
目标端
00.解压压缩包,并将调整其权限
01.将lib添加到根目录
libnnz11.so
libclntsh.so.11.1
flatfilewriter.so
02.初始化ggsci
03.配置manager
新建配置文件
EDIT PARAMS MGR
配置文件内容如下
port 7999
启动
START mgr
04.配置ffwriter
新建配置文件
EDIT PARAMS FFWRITER
配置文件ffwriter.prm
extract ffwriter
sourcedefs ./dirdef/srcdef.def
CUSEREXIT ./flatfilewriter.so CUSEREXIT PASSTHRU INCLUDEUPDATEBEFORES,PARAMS "./dirprm/ffwriter.properties"
table test001.*;
复制srcdef.def文件
复制ffwriter.properties文件
添加ffwriter并设定输入路径
ADD EXTRACT ffwriter, EXTTRAILSOURCE ./dirdat/ra
启动
START EXTRACT ffwriter
准备
检查系统,确保源端和目标端的GoldenGate各个进程都在正确运行
需要在两端的GGSCI中输入如下命令:
INFO ALL
如果修改了表,需要在源端重新生成srcdef.def文件,并重启除了Manager之外的所有组件
文件格式说明
文件标题格式
前缀_用户名_表名_年_月_日_时_分_秒_编号_后缀
00.每个表会有一组文件来记录其改变;
01.如果有持续的事务提交,每10秒会生成一个新的文件[需要看配置文件]
02.文件的编号从00000开始递增;
03.文件名可配置,在ffwriter.properties文件中配置
文件内容
"事务类型"|" DML操作类型"|"时间"|"用户名""表名"|"K"|old V|new V[|"K"|old V|new V]...
00.事务类型:
a."3":如果事务里只有一个DML操作,那么事务类型的位置会
b.“B”:如果一个事务里有多个DML操作,第一个DML的事务类型会显示为“D”
c.“E”:如果一个事务里有多个DML操作,最后一个DML操作的事务类型会显示为“E”
d.“M”:如果一个事务里有多个DML操作,除了“D”和“E”之外的DML操作的事务类型会显示为“M”
01.DML操作类型
a.“I”:INSERT操作
b.“D”:DELETE操作
c.“U”:UPDATE操作
02.在不同操作时KV的呈现
a.INSERT操作
00.旧值全部被占位符(
01.对于新值,如果出现在插入语句中,则被语句中的值填充,否则被占位符填充
b.DELETE操作
00.对于主键,仅在旧值里显示,新值用占位符占据
01.其他字段全部没有内容
c.UPDATE操作
00.主键无论是否被更改,都会填充对应的旧值新值
01.其他出现在update语句中的字段,则旧值和新值的位置,对应该字段修改前后的值,如果为空,则以占位符占位
02.未出现在语句中的字段,则没有内容
文件输出
输出配置文件ffwriter.properties,请见github