一、环境信息
| 软件名称 |
源端 |
目标端 |
| OGG版本 |
OGG 11.3.0.1.4 For Oracle |
OGG 11.3.0.1.5 For MySQL |
| 数据库 |
Oracle 11.2.0.4 |
MySQL 5.7.24 |
| OGG_HOME |
/home/oracle/ogg |
/opt/ogg |
二、软件架构
![Alt text]()
三、软件配置
数据同步的操作均采用OGG工具进行,考虑数据全量和增量的衔接,OGG需要先将增量同步的抽取进程启动,抓取数据库的redo log,待全量抽取结束后方可开启增量数据回放,全量和增量这段期间产生的日志数据,OGG可基于参数配置进行重复数据处理,所以该部分优先将增量进行配置并启用。
1.源端OGG软件配置
1) OGG软件安装
使用oracle用户上传123014_fbo_ggs_Linux_x64_shiphome.zip软件包至oracle用户home目录(/home/oracle)并执行以下操作
shell> mkdir -p /home/oracle/ogg
shell> mkdir -p /home/oracle/ogg_software
shell> unzip 123014_fbo_ggs_Linux_x64_shiphome.zip -d /home/oracle/ogg_software/
shell> cd /home/oracle/ogg_software/fbo_ggs_Linux_x64_shiphome/Disk1/response/
shell> egrep -v '^#|^$' oggcore.rsp
INSTALL_OPTION=ORA11g
SOFTWARE_LOCATION=/home/oracle/ogg
START_MANAGER=
MANAGER_PORT=
DATABASE_LOCATION=/u01/app/oracle/product/11.2.0/db_1
INVENTORY_LOCATION=/home/oracle/ogg/inventory
UNIX_GROUP_NAME=oracle
shell> cd /home/oracle/ogg_software/fbo_ggs_Linux_x64_shiphome/Disk1
shell> ./runInstaller -ignoreSysPrereqs -skipPrereqs -silent -responseFile /home/oracle/ogg_software/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp
shell> vim ~/.bash_profile
export OGG_HOME=/home/oracle/ogg
export PATH=$OGG_HOME:$PATH
export LD_LIBRARY_PATH=$OGG_HOME:$LD_LIBRARY_PATH
shell> source .bash_profile
shell> cd $OGG_HOME
shell> ggsci
ggsci> create subdirs
2) 源端Oracle数据库配置
a.Oracle数据库配置
针对Oracle数据库,OGG需要数据库开启归档模式及增加辅助补充日志、强制记录日志等来保障OGG可抓取到完整的日志信息
SQL> SELECT NAME,LOG_MODE,OPEN_MODE,PLATFORM_NAME,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
![Alt text]()
如果条件不满足则执行该部分
#### 开启归档(开启归档需要重启数据库)
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> archive log list;
#### 开启附加日志和强制日志
SQL> alter database add supplemental log data;
SQL> alter database force logging;
SQL> alter system switch logfile;
#### 启用OGG支持
SQL> show parameter enable_goldengate_replication
SQL> alter system set enable_goldengate_replication=true;
#### 再次查看当前环境是否满足要求
SQL> SELECT NAME,LOG_MODE,OPEN_MODE,PLATFORM_NAME,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
b.Oracle 数据库OGG用户创建
OGG需要有一个用户有权限对数据库的相关对象做操作,以下为涉及的权限,该示例将创建一个用户名和密码均为ogg的Oracle数据库用户并授予以下权限
#### 查看当前数据库已存在的表空间,可使用已有表空间或新建单独的表空间
SQL> SELECT TABLESPACE_NAME, CONTENTS FROM DBA_TABLESPACES;
#### 查看当前表空间文件数据目录
SQL> SELECT NAME FROM V$DATAFILE;
#### 创建一个新的OGG用户的表空间
SQL> CREATE TABLESPACE OGG_DATA DATAFILE
#### 创建ogg用户且指定对应表空间并授权
SQL> CREATE USER ogg IDENTIFIED BY ogg DEFAULT TABLESPACE OGG_DATA;
SQL> grant connect,resource,unlimited tablespace to ogg;
SQL> grant create session,alter session to ogg;
SQL> grant execute on utl_file to ogg;
SQL> grant select any dictionary, select any table to ogg;
SQL> grant alter any table to ogg;
SQL> grant flashback any table to ogg;
SQL> grant select any transaction to ogg;
SQL> grant sysdba to ogg;
SQL> grant execute on dbms_streams_adm to ogg;
SQL> grant execute on dbms_flashback to ogg;
SQL> grant execute on sys.DBMS_CAPTURE_ADM to ogg
SQL> exec dbms_goldengate_auth.grant_admin_privilege(
3) 源端OGG 管理进程(MGR)配置
manager进程是GoldenGate的控制进程,它主要作用有以下几个方面:启动、监控、重启GoldenGate的其他进程,报告错误,分配及清理数据存储空间,发布阈值报告等。
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit params mgr
PORT 7809
DYNAMICPORTLIST 8000-8050
-- AUTOSTART extract
-- AUTORESTART extract,retries 4,waitminutes 4
STARTUPVALIDATIONDELAY 5
ACCESSRULE, PROG *, IPADDR 172.19.*, ALLOW
ACCESSRULE, PROG SERVER, ALLOW
PURGEOLDEXTRACTS /home/oracle/ogg/dirdat/*, USECHECKPOINTS,MINKEEPFILES 3
ggsci> start mgr
ggsci> info all
ggsci> view report mgr
4) 源端OGG 表级补全日志(trandata)配置
表级补全日志需要在最小补全日志打开的情况下才起作用,之前只在数据库级开启了最小补全日志(alter database add supplemental log data;),redolog记录的信息还不够全面,必须再使用add trandata开启表级的补全日志以获得必要的信息。
shell> cd $OGG_HOME
shell> ggsci
ggsci> dblogin userid ogg@appdb,password ogg
ggsci> add trandata unionpaycms.*
Extract进程运行在数据库源端,负责从源端数据表或日志中捕获数据。Extract进程利用其内在的checkpoint机制,周期性地检查并记录其读写的位置,通常是写入到本地的trail文件。这种机制是为了保证如果Extract进程终止或者操作系统宕机,我们重启Extract进程后,GoldenGate能够恢复到以前的状态,从上一个断点处继续往下运行,而不会有任何数据损失。
shell> cd $OGG_HOME
shell> ggsci
ggsci> add extract e_cms,tranlog,begin now
ggsci> add exttrail /home/oracle/ogg/dirdat/ms,extract e_cms,megabytes 1024
ggsci> edit params e_cms
extract e_cms
setenv (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")
setenv (ORACLE_HOME = "/data/oracle/product/11.2/db_1")
setenv (ORCLE_SID = "appdb")
userid ogg@appdb,password ogg
discardfile /home/oracle/ogg/dirrpt/e_cms.dsc,append,megabytes 1024
exttrail /home/oracle/ogg/dirdat/ms
statoptions reportfetch
reportcount every 1 minutes,rate
warnlongtrans 1H,checkinterval 5m
table unionpaycms.*;
ggsci> start e_cms
ggsci> info all
ggsci> view report e_cms
6) 源端OGG 传输进程(pump)配置
pump进程运行在数据库源端,其作用非常简单。如果源端的Extract抽取进程使用了本地trail文件,那么pump进程就会把trail文件以数据块的形式通过TCP/IP协议发送到目标端,Ppmp进程本质上是Extract进程的一种特殊形式,如果不使用trail文件,那么Extract进程在抽取完数据后,直接投递到目标端。
ps:pump进程启动时需要与目标端的mgr进程进行连接,所以需要优先将目标端的mgr提前配置好,否则会报错连接被拒绝,无法传输抽取的日志文件到目标端对应目录下
shell> cd $OGG_HOME
shell> ggsci
shell> add extract p_cms,exttrailsource /home/oracle/ogg/dirdat/ms
shell> add rmttrail /opt/ogg/dirdat/ms,extract p_cms
shell>edit params p_cms
extract p_cms
setenv (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")
setenv (ORACLE_HOME = "/data/oracle/product/11.2/db_1")
setenv (ORCLE_SID = "appdb")
userid ogg@appdb,password ogg
RMTHOST 172.19.84.121,MGRPORT 7809
RMTTRAIL /opt/ogg/dirdat/ms
discardfile /home/oracle/ogg/dirrpt/p_cms.dsc,append,megabytes 1024
table unionpaycms.*;
ggsci> start p_cms
ggsci> info all
ggsci> view report p_cms
7) 源端OGG 异构mapping文件(defgen)生成
该文件记录了源库需要复制的表的表结构定义信息,在源库生成该文件后需要拷贝到目标库的dirdef目录,当目标库的replica进程将传输过来的数据apply到目标库时需要读写该文件,同构的数据库不需要进行该操作。
shell> cd $OGG_HOME
shell> vim ./dirprm/mapping_cms.prm
defsfile ./dirdef/cms.def,purge
userid ogg@appdb,password ogg
table unionpaycms.*;
shell> ./defgen paramfile ./dirprm/mapping_cms.prm
shell> scp ./dirdef/cms.def root@172.19.84.121:/opt/ogg/dirdef
2.目标端OGG软件配置
1) OGG软件安装
使用root用户上传123015_ggs_Linux_x64_MySQL_64bit.zip软件包至/opt目录并执行以下操作
shell> mkdir -p /opt/ogg
shell> cd /opt
shell> unzip 123015_ggs_Linux_x64_MySQL_64bit.zip
shell> tar xvf ggs_Linux_x64_MySQL_64bit.tar -C /opt/ogg
shell> vim .bash_profile
export OGG_HOME=/opt/ogg
export PATH=$OGG_HOME:$PATH
export LD_LIBRARY_PATH=$OGG_HOME:$LD_LIBRARY_PATH
shell> source .bash_profile
shell> cd $OGG_HOME
shell> ggsci
ggsci> create subdirs
2) 目标端MySQL数据库配置
a.同步的数据库创建
在异构环境下,OGG不支持DDL操作的同步,所以默认不会创建数据库及相应的表结构,该部分采用开源工具sqlines进行表结构的批量转换,详情可查看sqlines的操作文档,该步骤不在文档中体现,当前认为该步骤已完成,表结构已在MySQL中存在
b.MySQL数据库OGG用户创建
MySQL端只需有一个用户可对数据库进行增删改查即可,由于是临时使用,当前先赋予全部权限。
mysql> create user 'ogg'@'%' identified by 'ogg';
mysql> grant all on *.* to 'ogg'@'%';
mysql> create database ogg;
3) 目标端OGG 管理进程(MGR)配置
目标端的MGR进程和源端配置一样,可直接将源端配置方式在目标端重复执行一次即可,该部分不在赘述
4) 目标端OGG 检查点日志表(checkpoint)配置
checkpoint表用来保障一个事务执行完成后,在MySQL数据库从有一张表记录当前的日志回放点,与MySQL复制记录binlog的GTID或position点类似。
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit param ./GLOBALS
checkpointtable ogg.ggs_checkpoint
ggsci> dblogin sourcedb ogg@172.19.84.124:3306 userid ogg
ggsci> add checkpointtable ogg.ggs_checkpoint
5) 目标端OGG 回放线程(replicat)配置
Replicat进程运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML语句,然后应用到目标数据库中。
shell> cd $OGG_HOME
shell> ggsci
ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint
ggsci> edit params r_cms
replicat r_cms
TARGETDB unionpaycms@172.19.84.124:3306,userid ogg,password ogg
sourcedefs /opt/ogg/dirdef/cms.def
discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024
HANDLECOLLISIONS
MAP unionpaycms.*,target unionpaycms.*;
注意:replicat进程只需配置完成,无需启动,待全量抽取完成后再启动
四、全量同步配置
全量数据同步为一次性操作,当OGG软件部署完成及增量抽取进程配置并启动后,可配置1个特殊的extract进程从表中(sourceistable)抽取数据,将抽取的数据保存到目标端生成文件,目标端同时启动一个单次(specialrun)运行的replicat回放进程将数据解析并回放至目标数据库中
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit params ei_cms
SOURCEISTABLE
SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")
SETENV (ORACLE_SID=appdb)
SETENV (ORACLE_HOME=/data/oracle/product/11.2/db_1)
USERID ogg@appdb,PASSWORD ogg
RMTHOST 172.19.84.121,MGRPORT 7809
RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge
TABLE unionpaycms.*;
shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &
shell> tail -f ./dirrpt/ei_cms.rpt
2.目标端OGG 全量回放进程(replicat)配置
shell> cd $OGG_HOME
shell> ggsci
ggsci> edit params ri_cms
SPECIALRUN
END RUNTIME
TARGETDB unionpaycms@172.19.84.121:3306,USERID ogg,PASSWORD ogg
EXTFILE /opt/ogg/dirdat/ms
DISCARDFILE ./dirrpt/ri_cms.dsc,purge
MAP unionpaycms.*,TARGET unionpaycms.*;
shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &
shell> tail -f ./dirrpt/ri_cms.rpt
3.校验全量同步完成
1)基于OGG全量回放线程数据比对
全量回放线程执行完成后会生成一个report文件,可用该文件来判断全量同步是否存在异常,当输出文件中discards记录为0表示没有异常数据生成,数据正常同步成功
shell> cd $OGG_HOME/dirrpt
shell> cat ri_cms.rpt |grep discard
2)基于数据表记录count数据比对
SQL> create table ogg.ogg_init_table_count(
table_schema varchar2(200),
table_name varchar2(200),
table_rows number(22),
update_time date,
primary key(table_schema,table_name)
);
SQL> CREATE OR REPLACE PROCEDURE PR_GET_USER_TABLE_COUNT(V_OWNER IN DBA_TABLES.OWNER%TYPE) IS
BEGIN
DECLARE
V_COUNT NUMBER(22);
V_SQL VARCHAR2(500);
CURSOR V_TABLES IS
SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = UPPER(V_OWNER);
BEGIN
FOR V_ROWS IN V_TABLES LOOP
V_SQL := 'select count(*) from ' || UPPER(V_OWNER)||'.'||V_ROWS.TABLE_NAME;
EXECUTE IMMEDIATE V_SQL
INTO V_COUNT;
INSERT INTO OGG.OGG_INIT_TABLE_COUNT
(TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS, UPDATE_TIME)
SELECT UPPER(V_OWNER), V_ROWS.TABLE_NAME, V_COUNT, SYSDATE
FROM DUAL;
COMMIT;
END LOOP;
END;
END PR_GET_USER_TABLE_COUNT;
SQL> call pr_get_user_table_count('unionpaycms');
SQL> col table_schema for a15
SQL> col table_name for a30
SQL> col update_time for a20
SQL> set linesize 200
SQL> SELECT TABLE_SCHEMA,
TABLE_NAME,
TABLE_ROWS,
TO_CHAR(UPDATE_TIME, 'YYYY-MM-DD HH24:MI:SS') AS UPDATE_TIME
FROM OGG.OGG_INIT_TABLE_COUNT
ORDER BY TABLE_NAME;
#### MySQL 端比对表
mysql> create table ogg.ogg_init_table_count(
table_schema varchar(200),
table_name varchar(200),
table_rows bigint,
update_time timestamp,
primary key(table_schema,table_name)
);
#### MySQL端比对存储过程
delimiter
CREATE PROCEDURE pr_get_user_table_count (IN name_schema VARCHAR(50))
BEGIN
DECLARE name_table VARCHAR(50);
DECLARE table_count INT;
DECLARE done INT DEFAULT TRUE;
DECLARE cur_schema_tables CURSOR FOR select TABLE_NAME from information_schema.tables where TABLE_SCHEMA = name_schema;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = FALSE;
OPEN cur_schema_tables;
FETCH cur_schema_tables INTO name_table;
WHILE done do
set
set
execute stml;
DEALLOCATE prepare stml;
FETCH cur_schema_tables INTO name_table;
END WHILE;
CLOSE cur_schema_tables;
END
delimiter ;
#### MySQL 结果输出
mysql> call pr_get_user_table_count('unionpaycms');
3)基于OGG增量回放线程数据比对
OGG在增量抽取和回放期间都会记录执行的增删改的处理数量,可通过该统计信息了解OGG抽取的总记录数及单增删改的记录数
#### 查看总体抽取/回放信息
ggsci> stats extract e_cms
ggsci> stats replicat r_cms
#### 查具体的表的抽取/回放信息
ggsci> stats extract e_cms,table unionpaycms.CMS_OT_AUTH_OPT
ggsci> stats replicat r_cms,table unionpaycms.CMS_OT_AUTH_OPT
提示:待全量数据比对完成后可对数据库进行全量备份,并开启增量回放进行开始增量同步
五、常用运维管理
1.目录结构说明
OGG在执行初始化操作时(create subdirs)会生成相关文件目录,如下图所示,以下为目录功能说明
-
dirchk:当使用checkpoint做回放进程(replicat)的事务回放记录时,会在数据库表中记录checkpoint点,同时也会在该目录下生成相应的checkpoint文件,文件以.cpr结尾
-
dirdat:该目录用来保存extract抽取进程抽取的trail文件
-
dirdef:该目录用来保存使用defgen工具生成的异构数据库之间表结构映射文件
-
dirjar:包含一些java可执行文件的扩展包
-
dirpcs:相关OGG进程的进程状态文件,包含进程端口等信息
-
dirprm:相关OGG进程的配置文件目录
-
dirrpt:相关OGG运行报告文件,如:抽取或回放进程的增删改同步数量等
-
dirtmp:保存相关运行trace文件或dump文件供内部支持使用
shell> ls -ld dir*
drwxr-x--- 2 root root 39 3月 20 18:14 dirchk
drwxr-x--- 2 root root 22 3月 20 18:10 dirdat
drwxr-x--- 2 root root 6 3月 8 13:54 dirdef
drwxr-x--- 2 root root 4096 5月 2 2016 dirjar
drwxr-x--- 2 root root 6 3月 8 13:54 dirout
drwxr-x--- 2 root root 37 3月 20 18:16 dirpcs
drwxr-x--- 2 root root 72 3月 20 18:16 dirprm
drwxr-x--- 2 root root 4096 3月 20 18:16 dirrpt
drwxr-x--- 2 root root 29 3月 8 14:10 dirsql
drwxr-x--- 2 root root 6 3月 20 18:16 dirtmp
2.常用mgr运维命令
ggsci> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING RMYS 00:00:00 00:00:02
ggsci> send mgr childstatus debug
Sending CHILDSTATUS, request to MANAGER ...
Child Process Status - 1 Entries
ID Group Process Retry Retry Time Start Time Port
---- -------- --------- ----- ------------------- ------------------- ----
0 RMYS 16262 0 None 2019/03/08 14:51:23 7840
ggsci> send mgr getportinfo detail
Sending GETPORTINFO, request to MANAGER ...
Dynamic Port List
Starting Index 0
Entry Port Error Process Assigned Program
----- ----- ----- ---------- ------------------- -------
0 8000 0
1 8001 0
2 8002 0
3 8003 0
...
ggsci> send mgr getpurgeolddextracts
ggsci> stats extract exmys,total,hourly,table ogg.tcustmer reportrate min,reset
ggsci> stats extract exmys
Start of Statistics at 2019-03-10 08:51:11.
Output to ./dirdat/em:
Extracting from OGG.TCUSTMER to OGG.TCUSTMER:
*** Total statistics since 2019-03-08 06:52:39 ***
Total inserts 0.00
Total updates 1.00
Total deletes 0.00
Total discards 0.00
Total operations 1.00
...
4.常用replicat运维命令
## 查看总体回放信息
ggsci> stats replicat rmys
## 查具体的表的抽取信息
ggsci> stats replicat rmys,table OGG.TCUSTMER
5.常用trail文件运维命令
6.OGG软件卸载
shell> cd /home/oracle/ogg/deinstall
shell> ./deinstall.sh -ignoreSysPrereqs -silent -responseFile /home/oracle/ogg_software/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp