Oracle11g GoldenGate部署
概念:
GoldenGate软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标 数据库,从而实现源数据库与目标数据库同步。
GoldenGate 可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,从而可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾等多个场景下应用。
原理:
Oracle GoldenGate,简称ogg,主要包含四大进程:Manager进程、Extract进程、Pump进程、Replicat进程。
Manager进程:是GoldenGate的控制进程,主要作用:启动、监控、重启GoldenGate的其他进程,报告错误及时间,分配数据存储空间,发布阈值报告等。
Extract进程:运行在数据库源端,负责从源端数据表或日志中捕获数据。Extract进程利用其内置的checkpoint机制,周期性地检查并记录其读写的位置,通常是写入到本地的trail文件,这种机制是为了保证如果Extract进程终止或者操作系统宕机,重启Extract进程之后,GoldenGate能从上一个断点处继续向下运行,能够避免有数据损失。
Pump进程:运行在数据库源端,作用:如果源端使用了本地trail文件,那么Pump进程就会把Trail文件以数据块的形式通过TCP/IP协议发送到目标端,如果Extract进程没有使用trail文件,Extract进程抽取完数据之后,直接投递给目标端。与Pump进程相对应的Server Collector进程,自动配置的,运行在目标端,作用:就是把Extract/Pump进程投递过来的数据块,重新组装成Trail文件。
Replicat进程:运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML或DDL语句,然后应用到目标数据库中。
Manager是监控其他进程的,两端都要安装
Extract是源端的抓取进程,在源端安装
Pump是源端的发送进程,把Extract写好的Trail文件发送到目标端,在源端安装
Replicat是目标端的读取进程,在目标端安装
部署:
演示环境centos7.4,源端和目标端均为单库,单向复制
rac部署过程同理
一. 准备2台服务器,自己选一台做为源端,另一台为目标端,分别安装oracle11g即可,安装过程略
二. 安装前准备工作
1.源端oracle必须开启归档
sqlplus / as sysdba
SQL>archive log list;
SQL>shutdown immediate;
SQL>startup mount
SQL>alter database archivelog;
SQL>alter database open;
2.源端oracle开启附加日志模式
SQL>alter database add supplemental log data;
SQL>alter system switch logfile;
3.源端开启强制日志模式
SQL>alter database force logging;
4.检查是否开启
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
三. 安装(两端执行)
源端和目标端是相对的,在多个ogg体系中,一个ogg的目标端可能是下一个ogg的源端,所以需要自定义命名的时候最好区分开
1.创建安装目录
源端source
mkdir –p /home/ogg_src
chown –R oracle:oinstall /home/ogg_src
目标端target
mkdir –p /home/ogg_trg
chown –R oracle:oinstall /home/ogg_trg
2.解压安装包安装
chown –R oracle:oinstall
/home/ogg_src/ ogg112101_fbo_ggs_Linux_x64_ora11g_64bit.zip
chown –R oracle:oinstall
/home/ogg_trg/ ogg112101_fbo_ggs_Linux_x64_ora11g_64bit.zip
su – oracle
cd /home/ogg_src(trg)
unzip ogg112101_fbo_ggs_Linux_x64_ora11g_64bit.zip
解压完是tar包,tar –xvf再解压一次
3.配置环境变量
vim .bash_profile
export GGATE=/home/ogg_src(trg)
export PATH=$
P
A
T
H
:
PATH:
PATH:ORACLE_HOME/bin:$GGATE
保存
source .bash_profile
4.创建ogg工作目录
cd /home/ogg_src(trg)
执行ggsci
GGSCI>create subdirs
GGSCI>exit
四. 配置同步环境(两端执行)
ogg默认只同步DML语句,即增删改,而不同步DDL语句,所以同步DDL需要手动配置
1.配置支持DDL语句同步
1)最好创建一个独立的表空间来存放DDL信息,和其他业务的表空间区分开
create tablespace ogg_tbs logging datafile ‘xxx/ogg_tbs.dbf’ size 200m autoextend on next 100m;
源端创建ogg用户source
create user source identified by oracle default tablespace ogg_tbs;
目标端创建ogg用户target
create user target identified by oracle default tablespace ogg_tbs;
2)源端支持序列
ggsci
GGSCI>EDIT PARAMS ./GLOBALS
文件中输入
GGSCHEMA source
保存
sqlplus / as sysdba
SQL>@sequence.sql
输入:source
SQL>grant execute on source.updateSequence to source;
SQL>grant execute on util_file to source
目标端支持序列
ggsci
GGSCI>EDIT PARAMS ./GLOBALS
文件中输入
GGSCHEMA target
保存
sqlplus / as sysdba
SQL>@sequence.sql
输入:target
SQL>grant execute on target.replicateSequence to target;
源端对sys.seq 添 加 补 充 日 志 a l t e r t a b l e s y s . s e q 添加补充日志 alter table sys.seq 添加补充日志altertablesys.seq add supplemental log data (primary key) columns;
3)源端安装DDL对象,注意先关闭所有的客户端连接
sqlplus / as sysdba
运行脚本
SQL>@marker_setup.sql
SQL>@ddl_setup.sql
执行@ddl_setup.sql报错的解决方法:
执行一次禁用DDL脚本
@ddl_disable.sql
ogg用户登录
conn source/oracle
查看ogg用户的角色,发现已经有DBA权限
select * from user_role_privs;
再次授权
grant create table,create sequence to source;
再执行@ddl_setup.sql
成功
SQL>@role_setup.sql
4)授权源端ogg用户的抽取数据权限
SQL>grant GGS_GGSUSER_ROLE to source;
源端启用DDL触发器
SQL>@ddl_enable.sql
5)源端安装性能优化工具 (可选项)
要提高DDL触发器的性能,可以通过ddl_pin脚本,该脚本会将触发器使用的包加载到内存,以此提高效率。该脚本执行时需要引用dbms_shared_pool系统包,因此在使用ddl_pin脚本前需要确保dbms_shared_pool可用。
SQL>@?/rdbms/admin/dbmspool.sql
SQL> @ddl_pin.sql source;
注: 执行ddl_pin.sql通过dbms_shared_pool.keep存储过程将DDLReplication相关对象keep在共享池中,以保证这些对象不被RELOAD,提升性能。
至此,ddl语句的支持配置完成
2.为源端和目标端配置OGG
1)源端添加表级别附加日志
ggsci
GGSCI>dblogin userid source,password oracle
GGSCI>add trandata xxx.(所有要同步数据的用户都加,例如test.)
如果不执行add trandata,insert的同步没问题,但是update和delete的同步会报主键错误
2)两端配置管理进程manager
ggsci
配置参数文件
GGSCI>edit params mgr
加入
PORT 7809(通信端口7809,source db和target db需要保持一致)
DYNAMICPORTLIST 7810-7820
(动态端口列表的范围从7810到7820。当7809被占用或者出现通信故障,管理进程将会从中选择下一个端口尝试连接,避免通信端口的单点故障)
AUTORESTART EXTRACT , RETRIES 5, WAITMINUTES 7
(当提取进程中断后尝试自动重启,每隔4分钟尝试启动一次,尝试5次。OGG运维人员通常会注释掉这条配置,更喜欢用手工重启的方式来控制)
lagreporthours 1(每隔一小时检查一次传输延迟情况)
laginfominutes 30(延迟超过30分钟将写入错误日志)*
3)源端配置抓取进程extract
ggsci
添加ext进程
GGSCI>add extract ext,tranlog,begin now
配置参数文件
GGSCI>edit params ext
加入
EXTRACT ext
setenv ( NLS_LANG = “AMERICAN_AMERICA.ZHS16GBK” )
ddl include all
USERID source,PASSWORD oracle
EXTTRAIL /home/ogg_src/dirdat/sr(源端trail队列文件的真实路径)
discardfile /home/ogg_src/dirrpt/exta.dsc, append, megabytes 1024
(将执行失败的记录保存在该目录下的文件中,大小1G,文件中已经包含记录,可以继续追加)
discardrollover at 3:00(防止discardfile被写满,每天3:00做一次文件过期设定)
dynamicresolution(有时候开启OGG进程的时候较慢,可能是因为需要同步的表太多,OGG在开启进程之前会将需要同步的表建立一个记录并且存入到磁盘中,这样就需要耗费大量的时间。使用该参数来解决此问题)
fetchoptions nousesnapshot(不从闪回日志中获取数据)
table xxx.,xxx.,…;(所有要同步数据的用户都加)
sequence xxx.,xxx.,…; (所有要同步数据的用户都加)
4)源端添加trail文件
GGSCI>add exttrail /home/ogg_src/dirdat/sr,extract ext
5)源端配置传输进程pump
GGSCI>add extract dp,exttrailsource /home/ogg_src/dirdat/sr
配置参数文件
GGSCI>edit params dp
加入
extract dp
Passthru(采用pass-through模式处理表)
RMTHOST xxx.xxx.xx.xx(目标端IP地址), MGRPORT 7809, compress(投递前进行压缩)
RMTTRAIL /home/ogg_trg/dirdat/tg(目标端保存trail队列文件的真实路径)
SEQUENCE xxx.,xxx.,…; (所有要同步数据的用户都加)
TABLE xxx.,xxx.,…; (所有要同步数据的用户都加)
6)目标端添加trail文件
GGSCI>add rmttrail /home/ogg_trg/dirdat/tg, extract dp
7)目标端配置读取进程replicat
配置replicat之前,必须创建checkpoint表
ggsci
GGSCI>dblogin userid target password oracle
GGSCI>add checkpointtable target.ckpt
ogg配置中指定checkpoint表
GGSCI>edit params ./globals
加入
CHECKPOINTTABLE target.ckpt
添加replicat进程
GGSCI>add replicat rep,exttrail /home/ogg_trg/dirdat/tg,checkpointtable target.ckpt
配置参数文件
GGSCI>edit params rep
加入
replicat rep
setenv ( NLS_LANG = “AMERICAN_AMERICA.ZHS16GBK” )
ddl include all
USERID target,PASSWORD oracle
DBOPTIONS SUPPRESSTRIGGERS,DEFERREFCONST(约束延迟设置,在复制进程的事务被提交之前,延迟级联删除和级联更新)
gettruncatess(不捕获源端的truncate table操作,防止源端没备份误删表)
discardfile /home/ogg_trg/dirrpt/rep.dsc, append, megabytes 1024m
(将执行失败的记录保存在该目录下的文件中,大小1G,文件中已经包含记录,可以继续追加)
discardrollover at 02:00
ASSUMETARGETDEFS
MAP xxx., TARGET xxx.; (所有要同步数据的用户都加)
五. 启动和调试OGG环境
如果源端是生产环境,务必先停业务,然后才能启动和调试ogg,不然数据就不一致了
1.源端启动mgr
cd /home/ogg_src
ggsci
GGSCI>start mgr
mgr是管理进程,通常源端启动mgr后,ext和dp也会随mgr同时启动,
目标端的mgr也会同时启动
2.目标端启动rep
cd /home/ogg_trg
ggsci
GGSCI>start rep
3.两端都检查一下进程启动的全不全,没启来的手动启动,如果发现错误和异常,根据OGG_ERROR_CODE排查问题
GGSCI>info mgr
GGSCI>info mgr detail
GGSCI>info rep
GGSCI>info rep detail
GGSCI>info all
OGG正常运行后,验证是否正常同步数据
4.验证DDL同步
例如源端oracle创建表student
create table student
(
EMPNO NUMBER(4) ,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPNO NUMBER(4)
);
目标端查看是否也有student表
5.验证DML同步
源端通过for循环不断向student表中插入数据
begin
for i in 1 … 10000
loop
insert into student values(7369,‘SMITH’,‘CLERK’,7902,to_date(‘17-12-1980’,‘dd-mm-yyyy’),800,null,20);
commit;
DBMS_LOCK.SLEEP(1);
end loop;
end;
/
目标端select count(*) from student;查看两端表中记录数是否一致
6.ogg能正常运行并正常同步数据后,用数据泵备份源端所有数据,导入到目标端,步骤和迁库一样,原因是ogg不同步源端已有数据,只同步新的增量,所以必须先保证两端数据一致,最后恢复业务运行,定期检查源端的抓取和传输日志以及目标端的接收日志,如果目标端少数据,肯定是这三个步骤中出的问题