1. 目的说明
本文提供Oracle GoldenGate在Oracle db到Oracle db的数据复制安装配置指导,适用于入门练习使用,生产环境配置,在关键步骤和重要参数设置需要小心对待。
2. 参考文档
《叱咤风云GoldenGate企业级运维实战》
《Expert Oracle GoldenGate》
Oracle GoldenGate Document
戴明明博客
惜分飞博客
3. 准备系统
准备好两套已经装好Oracle db和Oracle GoldenGate for Oracle的环境。
source db:
ip:192.168.5.191
db type:Oracle db 11.2.1.0.4
target db:
ip:192.168.5.191
db type:Oracle db 11.2.1.0.4
GoldenGate:
ogg type:GoldenGate for Oracle 12.2.0.1
4. 配置source db
4.1 配置source db参数
source db的配置主要是归档模式修改、附加日志的添加、强制日志和ddl语句的支持。
查看source db归档、附加日志和强制日志:
select log_mode,supplemental_log_data_min,force_logging from v$database;
4.1.1 修改归档模式
创建归档目录,archivelog目录用sid区别
mkdir -p /u02/archivelog/orcl
修改归档日志存储目录
alter system set log_archive_dest_1 = 'location=/u02/archivelog/orcl' scope = both;
修改归档日志格式
alter system set log_archive_format = 'arc_%t_%s_%r.arc' scope = spfile;
重启数据库,修改归档模式
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
4.1.2 强制日志变更
alter database force logging;
4.1.3 添加附加日志
alter database add supplemental log data;
4.1.4 修改GoldenGate参数
alter system set enable_goldengate_replication = true scope = both;
4.1.4 配置DDL语句支持
创建存放ddl信息的GoldenGate用户:
create tablespace tbs_ogg datafile '/u02/oradata/orcl/tbs_ogg_dat01.dbf' size 10M autoextend on next 8M maxsize 32000M;
create user ogg identified by ogg default tablespace tbs_ogg;
授权GoldeGate用户 :
grant dba to ogg ;
进入GoldenGate目录,调用SQL脚本:
cd $GGATE
sqlplus / as sysdba
SQL> @marker_setup.sql;
#输入准备好的用户ogg
SQL> @ddl_setup.sql;
#输入准备好的用户ogg
SQL> @role_setup.sql;
#输入准备好的用户ogg
#根据上面执行结果的提示授权角色给ogg用户
SQL> grant GGS_GGSUSER_ROLE to ogg;
SQL> @ddl_enable.sql;
SQL> @ddl_pin ogg
至此,ddl语句的支持配置完成。
4.2 配置source db manager进程
进入GoldenGate目录,创建工作区目录:
cd $GGATE
./ggsci
GGSCI (dbserver) 1> create subdirs
Creating subdirectories under current directory /u01/ogg/12.2.0/oggcore_1
Parameter files /u01/ogg/12.2.0/oggcore_1/dirprm: created
Report files /u01/ogg/12.2.0/oggcore_1/dirrpt: created
Checkpoint files /u01/ogg/12.2.0/oggcore_1/dirchk: created
Process status files /u01/ogg/12.2.0/oggcore_1/dirpcs: created
SQL script files /u01/ogg/12.2.0/oggcore_1/dirsql: created
Database definitions files /u01/ogg/12.2.0/oggcore_1/dirdef: created
Extract data files /u01/ogg/12.2.0/oggcore_1/dirdat: created
Temporary files /u01/ogg/12.2.0/oggcore_1/dirtmp: created
Credential store files /u01/ogg/12.2.0/oggcore_1/dircrd: created
Masterkey wallet files /u01/ogg/12.2.0/oggcore_1/dirwlt: created
Dump files /u01/ogg/12.2.0/oggcore_1/dirdmp: created
编辑配置manager参数文件 :
#确认下进程
GGSCI (dbserver) 2> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER STOPPED
#编辑manager参数文件
GGSCI (dbserver) 4> edit params mgr
#添加以下内容
port 7809
accessrule, prog *, ipaddr 192.168.5.192, allow
dynamicportlist 7800-7900
accessrule, prog server, allow
autorestart extract *, retries 5, waitminutes 7
purgeoldextracts /u01/ogg/12.2.0/oggcore_1/dirdat/*, usecheckpoints, minkeepdays 10
lagreporthours 1
laginfominutes 30
lagcriticalminutes 45
manager参数文件解释:
port 7809
通信端口7809,source db和target db需要保持一致。
dynamicportlist 7800-7900
动态端口列表的范围从7800到7900。当制定端口被占用或者出现通信故障,管理进程将会从列表中选择下一个端口尝试连接,避免通信端口的单点故障。
autorestart extract *, retries 5, waitminutes 7
当提取进程中断后尝试自动重启,每隔7分钟尝试启动一次,尝试5次。OGG运维人员通常会注释掉这条配置,更喜欢用手工重启的方式来控制。
purgeoldextracts ./dirdat/*, usecheckpoints, minkeepdays 10
定期清理dirdat路径下的本地队列(local trail)。保留期限10天,过期后自动删除。从而控制队列文件的目录不会增长过大。
lagreporthours 1
每隔一小时检查一次传输延迟情况
laginfominutes 30
传输延时超过30分钟将写入错误日志
lagcriticalminutes 45
传输延时超过45分钟将写入警告日志
对需要的表添加trandata
cd $GGATE
./ggsci
GGSCI (oracledb1 as ogg@orcl) 3> dblogin userid ogg password ogg
Successfully logged into database.
#对需要的表添加trandata
GGSCI (oracledb1 as ogg@orcl) 4> add trandata scott.emp
Logging of supplemental redo log data is already enabled for table SCOTT.EMP.
TRANDATA for instantiation CSN has been added on table 'SCOTT.EMP'.
4.3 配置source db extract进程
添加一个extract进程 :
GGSCI (dbserver) 11> add extract exta,tranlog,begin now
EXTRACT added.
编辑extract参数文件:
GGSCI (dbserver) 13> edit params exta
#添加以下内容
extract exta
setenv (nls_lang="american_america.utf8")
userid ogg, password ogg
reportcount every 30 minutes, rate
discardfile /u01/ogg/12.2.0/oggcore_1/dirrpt/ea.dsc, append, megabytes 1024
discardrollover at 3:00
warnlongtrans 2h, checkinterval 300
exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/ea
--dynamicresolution
dboptions allowunusedcolumn
fetchoptions nousesnapshot
fetchoptions fetchpkupdatecols
--cachemgr cachesize 8000mb, cachedirectory /u01/ogg/12.2.0/oggcore_1/temp
ddl &
include mapped objname scott.emp &
include mapped objname scott.dept ;
table scott.emp;
table scott.dept;
extract参数文件说明:
setenv (NLS_LANG="american_america.utf8")
设置字符集环境变量为UTF8
如果系统中存在多个数据库有时候会用参数SETENV设置ORACLE_HOME、ORACLE_SID等,例如:
setenv (ORACLE_HOME = "/u01/app/oracle/product/11.2.0/dbhome_1")
setenv (ORACLE_SID = "orcl")
reportcount every 30 minutes, rate
每隔30分钟报告一次从程序开始到现在的抽取进程或者复制进程的事物记录数,并汇报进程的统计信息
discardfile /u01/ogg/12.2.0/oggcore_1/dirrpt/exta.dsc, append, megabytes 1024
将执行失败的记录保存在discard file中,
该文件位于/u01/ogg/12.2.0/oggcore_1/dirrpt/exta.dsc,大小为1024MB。 文件中已经包含记录的话,再后面继续追加,不删除之前的记录。
discardrollover at 3:00
为了防止discard file被写满,每天3:00做一次文件过期设定
warnlongtrans 2h, checkinterval 300
每隔300s检查一下大事务,超过2小时还没结束的进行报告
exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/ea
队列文件路径
dynamicresolution
有时候开启OGG进程的时候较慢,可能是因为需要同步的表太多,OGG在开启进程之前会将需要同步的表建立一个记录并且存入到磁盘中,这样就需要耗费大量的时间。使用该参数来解决此问题。
dboptions allowunusedcolumn
当抽取进程遇到一个没有使用的字段时只生成一个警告,进程会继续执行而不会被异常终止(abend)
fetchoptions nousesnapshot
不会从闪回日志中获取数据
fetchoptions fetchpkupdatecols
当使用了HANDLECOLLISIONS时,请使用该参数。
复制进程出现丢失update记录(missing update)并且更新的是主键,update将转换成insert。由于插入的记录可能不是完整的行,若要保证完整需要加入此参数
cachemgr cachesize 8000mb, cachedirectory /u01/ogg/12.2.0/oggcore_1/temp
在/u01/ogg/12.2.0/oggcore_1/temp目录设置虚拟内存
创建本地trail文件 :
GGSCI (dbserver) 13> add exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/ea,extract exta
EXTTRAIL added.
4.4 配置source db pump进程
添加一个pump进程(本质上也是extract进程),并指定本地trail文件:
GGSCI (dbserver) 14> add extract pumpa,exttrailsource /u01/ogg/12.2.0/oggcore_1/dirdat/ea
EXTRACT added.
编辑pump参数文件:
GGSCI (dbserver) 16> edit params pumpa
#添加以下内容
extract pumpa
rmthost 192.168.5.192, mgrport 7809, compress
passthru
numfiles 5000
rmttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pa
--dynamicresolution
ddl
table scott.emp;
table scott.dept;
pump参数文件说明:
rmthost 10.10.10.1, mgrport 7839, compress
target db主机ip,管理进程端口号,投递前压缩队列文件
numfiles 5000
最多处理5000张表
rmttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pt
target db保存队列文件的目录
passthru
采用pass-through模式处理表
dynamicresolution
动态解析表名,此参数在12.2中start进程时会提示已经deprecated(废弃)
指定远程trail文件:
GGSCI (dbserver) 19> add rmttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pa,extract pumpa
RMTTRAIL added.
指定本地trail文件:
GGSCI (dbserver1 20> add exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pa, extract pumpa
EXTTRAIL added.
4.5 启动source进程
新开一个ssh窗口,打开ggserr.log日志,实时等待查看启动日志:
cd $GGATE
tail -f 50 ggserr.log
切回前面配置窗口,检查各项配置,然后启动进程:
cd $GGATE
./ggsci
#查看extrac进程,启动进程后注意查看ggserr.log的日志信息,确认无警告错误,启动pump进程需先启动target db的mgr进程,否则会报错无法启动:
GGSCI (oracledb1) 2> start mgr
GGSCI (oracledb1) 2> start exta
GGSCI (oracledb1) 2> start pumpa
GGSCI (oracledb1) 2> info mgr detail
GGSCI (oracledb1) 2> info exta detail
GGSCI (oracledb1) 2> info pumpa detail
如果发现错误和异常,根据OGG_ERROR_CODE排查问题。
5. 配置target db
5.1 配置target db参数
5.1.1 创建GoldenGate用户
创建GoldenGate用户:
create tablespace tbs_ogg datafile '/u02/oradata/orcl/tbs_ogg_dat01.dbf' size 10M autoextend on next 8M maxsize 32000M;
create user ogg identified by ogg default tablespace tbs_ogg;
授权GoldeGate用户 :
grant dba to ogg;
5.1.2 添加checkpoint表
GGSCI (dbserver) 21> edit params ./GLOBALS
#添加以下内容
ggschema ogg
checkpointtable ogg.checkpoint
#登陆target db添加checkpoint表
GGSCI (dbserver) 1> dblogin userid ogg, password ogg
Successfully logged into database.
GGSCI (dbserver as ogg@orcl) 2> add checkpointtable ogg.checkpoint
Successfully created checkpoint table ogg.checkpoint.
5.1 配置target db manager进程
编辑manager参数文件:
GGSCI (dbserver as ogg@orcl) 4> edit params mgr
#添加以下内容
port 7809
userid ogg, password ogg
accessrule, prog *, ipaddr 192.168.5.192, allow
accessrule, prog server, allow
dynamicportlist 7840-7914
autorestart extract *,retries 5,waitminutes 3
purgeoldextracts /u01/ogg/12.2.0/oggcore_1/dirdat/*,usecheckpoints, minkeepdays 5
--purgeddlhistory minkeepdays 7, maxkeepdays 10
lagreporthours 1
laginfominutes 30
lagcriticalminutes 45
manager参数文件说明:
port 7839
通信端口7839。 生产端和灾备端需要保持一致。
dynamicportlist 7840-7914
动态端口列表的范围从7840到7914。当制定端口被占用或者出现通信故障,管理进程将会从列表中选择下一个端口尝试连接,避免通信端口的单点故障。
autorestart extract *,retries 5,waitminutes 3
当提取进程中断后尝试自动重启,每隔7分钟尝试启动一次,尝试5次。ogg运维人员通常会注释掉这条配置,更喜欢用手工重启的方式来控制。
purgeoldextracts /u01/ogg/12.2.0/oggcore_1/dirdat/*, usecheckpoints, minkeepdays 5
定期清理dirdat路径下的远程队列(remote trail)。保留期限5天,过期后自动删除。从而控制队列文件的目录不会增长过大。
purgeddlhistory minkeepdays 7, maxkeepdays 10
删除ddl历史表,最小保存7天,最大保存10天。由于此项目没有开启ddl,所以该参数被注释。
purgemarkerhistory minkeepdays 7, maxkeepdays 10
删除marker历史表,最小保存7天,最大保存10天。此项目没有使用该参数,所以该参数被注释。
lagreporthours 1
每隔一小时检查一次传输延迟情况
laginfominutes 30
传输延时超过30分钟将写入错误日志
lagcriticalminutes 45
传输延时超过45分钟将写入警告日志
5.2 配置target db replicat进程
添加一个replicat进程 :
GGSCI (dbserver as ogg@orcl) 4> add replicat repa,exttrail /u01/ogg/12.2.0/oggcore_1/dirdat/pa
编辑replicat参数文件:
GGSCI (dbserver as ogg@orcl) 6> edit params repa
#添加以下内容
replicat repa
setenv (nls_lang = "american_america.utf8")
setenv (oracle_sid = "xxxx" )
userid ogg, password ogg
--sqlexec "alter session set constraints=deferred"
dboptions deferrefconst
gettruncates
report at 06:00
reportcount every 30 minutes, rate
reportrollover at 02:00
reperror default, abend
--handlecollisions
--dynamicresolution
allownoopupdates
--assumetargetdefs
discardfile /u01/ogg/12.2.0/oggcore_1/dirrpt/repa.dsc, append, megabytes 1024
discardrollover at 02:00
ddl
map scott.emp, target scott.emp;
map scott.dept, target scott.dept;
replicat参数文件说明:
setenv (NLS_LANG="american_america.utf8")
设置字符集环境变量为utf8
如果系统中存在多个数据库有时候会用参数setenv设置oracle_home、oracle_sid等,例如:
setenv (ORACLE_HOME = "/u01/app/oracle/product/11.2.0/dbhome_1")
setenv (ORACLE_SID = "orcl")
dboptions deferrefconst
约束延迟设置,在复制进程的事物被提交之前,延迟级联删除、级联更新时的校验和实施。
gettruncates
不捕获source db truncate table的操作
report at 06:00
每天早上6点报告
reportcount every 30 minutes, rate
每隔30分钟报告一次从程序开始到现在的抽取进程或者复制进程的事物记录数,并汇报进程的统计信息
reportrollover at 02:00
为了防止report file被写满,每天2:00做一次文件过期设定
reperror default, abend
除了特殊指定的reperror语句,报告所有复制期间出现的错误,回滚非正常中断的事物和进程。
handlecollisions
当target db已经存在数据的情况下,解决复制过程中出现的冲突。如果要重新做初始化,可以删除drop target db后再rman恢复,这样做的话就不需要该参数
allownoopupdates
当source db有某些列但是目标表却没有,或者复制进程中配置了colsexcept 参数 在这些情况下,当生产端对那些列进行更新,目标表将不发生任何变化
assumetargetdefs
使用assumetargetdefs参数时,用map语句中指定的source db源表和target db目标表具有相同的列结构。它指示的oracle goldengate不在source db查找源表的结构定义
discardfile /u01/ogg/12.2.0/oggcore_1/dirrpt/rep1.dsc, append, megabytes 1024m
将执行失败的记录保存在discard file中,该文件位于/u01/ogg/12.2.0/oggcore_1/dirrpt/ext1.dsc,大小为1024mb。 文件中已经包含记录的话,再后面继续追加,不删除之前的记录
discardrollover at 02:00
为了防止discard file被写满,每天2:00做一次文件过期设定