ORACLE GOLDENGATE安装使用手册
1 总体说明
1.1 环境配置
源端 | ORACLE |
---|---|
HPUX | B.11.31 |
ORACLE | 11.2.0.3.0 |
JAVA | 1.8.0 |
OGG | 12.3.0.1 for oracle |
目标端 | 异构目标端 |
---|---|
LINUX | Redhat 6.7 |
JAVA | 1.8.0 |
OGG | 12.3.0.1 for bigdata |
HADOOP | 2.6.0 |
SPARK | 1.6.3 |
KAFKA | 2.11-0.11.0.0 |
目标端 | 同构目标端ORACLE |
---|---|
LINUX | Redhat 6.7 |
ORACLE | 12.2.0.1 |
JAVA | 1.8.0 |
OGG | OGG-12.3.0.1 for oracle |
目标端支持同构ORACLE目标端或者异构目标端,根据不同的目标端类型,选择对应的配置和中间件。
本文中使用的异构目标端为某大数据搜索引擎,目标端配置也与之对应。
1.2 实施前准备
1.2.1 异构环境
Hadoop安装。
某大数据检索引擎安装。
kafka安装(单机即可),新建一个topic,名字叫 oggtopic(使用默认参数即可)。
1.2.2 ORACLE环境
Oracle安装(建议11.2.0.4版本以上)
2 OGG安装
2.1 需要sysdba设置数据库
- 开启数据库归档模式
SQL>alter database archivelog; `
- 开启数据库force logging
SQL>alter database force logging;
- 开启数据库补全日志
SQL>alter database add supplemental log data (all) columns;
- 设置数据库goldengate参数
SQL>alter system set enable_goldengate_replication=true scope=both;
- 设置数据库undo_retention和undo空间大小(防止快照过旧,具体视情况定)
SQL>alter system set undo_retention=1800 scope=both;
- 创建OGG运行管理用户(不启用DDL功能)
SQL>create tablespace DT_OGG datafile ‘…’ size 3G reuse autoextend on;
SQL>create user ggs identified by ggs default tablespace DT_OGG;
--datafile 填入指定路径的文件
--tablespace和user 可自定义名称,注意前后保持一致
- OGG用户授予以下权限:
grant create session to ggs;
grant connect,resource,unlimited tablespace to ggs;
grant select any dictionary to ggs;
grant select any table to ggs;
grant select on sys.logmnr_buildlog to ggs;
grant execute on dbms_logmnr_d to ggs;
grant execute on dbms_flashback to ggs;
grant execute on utl_file to ggs;
grant flashback any table to ggs;
grant alter any table to ggs;
exec dbms_goldengate_auth.grant_admin_privilege(grantee => ggs,grant_select_privileges=>true);
2.2 安装OGG
- 设置环境变量
su - oracle
vim ~/.bash_profile
export ORACLE_HOME=/oracle/ora12c/db
export ORACLE_SID=ora11g
export JAVA_HOME=/home/oracle/jdk1.8.0_144
export GG_HOME=/opt/ogg12/ogg ##ogg安装目录
export PATH=$JAVA_HOME/bin:$ORACLE_HOME/bin:$GG_HOME:$PATH
export LD_LIBRARY_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib/amd64/server:
$ORACLE_HOME/lib:$GG_HOME:$LD_LIBRARY_PATH
##依实际情况填入对应环境变量值
- 解压安装
- 1.解压
环境中选择解压目录/opt/ogg12/
建议硬盘空间30G以上
目录属组 oracle:oinstall
在安装目录下解压ogg安装包123012_fbo_ggs_Linux_x64_shiphome.zip
- 2.执行安装
切换oracle用户
su - oracle
cd /opt/ogg12/fbo_ggs_Linux_x64_shiphome/Disk1
# 执行安装脚本:./runInstall,进入图形化界面安装。
# 若无图形化安装界面,则使用静默安装(常用)
cd /opt/ogg12/fbo_ggs_Linux_x64_shiphome/Disk1/response
配置oggcore.rsp
INSTALL_OPTION=ORA12c # oracle版本
SOFTWARE_LOCATION=/opt/ogg12/ogg # ogg安装目录(和环境变量配置对应)
START_MANAGER=true # 是否配置完成后启动mgr进程
MANAGER_PORT=7809 # mgr启动端口号
DATABASE_LOCATION=/oracle/ora12c/db # $ORACLE_HOME
INVENTORY_LOCATION=/oracle/oraInventory # INVENTORY目录位置
UNIX_GROUP_NAME=oinstall # 指定一个组
- 3.配置完成执行以下命令开始安装
su - oracle
cd /opt/ogg12/fbo_ggs_Linux_x64_shiphome/Disk1
./runInstaller –silent –responseFile /opt/ogg12/fbo_ggs_Linux_x64_
shiphome/Disk1/response/oggcore.rsp
安装完成后页面输出:
The installtion of Oracle GoldenGate Core was successful.
Please check ‘/oracle/oraInventory/logs/silentinstall….log’ for more details.
Successfully setup software. 安装成功。
- 4.进入ogg安装目录执行
./ggsci
GGSCI> create subdirs # 创建子目录
至此goldengate静默安装完成。
3 ogg配置
源端和目标端配置文件均在ogg安装目录/ogg/dirprm/目录下。
配置参数详细说明见 OGG配置文件参数详解 。
配置文件名可以自定义,启动进程时显式指定对应的配置文件。
3.1 源端配置
Manager管理进程:
- mgr.prm
PORT 7809
AUTORESTART ER *,RETRIES 3,WAITMINUTES 5,RESETMINUTES 60
purgeoldextracts /opt/ogg12/ogg/dirdat/*,usecheckpoints,minkeepdays 4
Extract抽取进程:
- ext1.prm
extract ext1 --进程名
userid ggs, password ggs --ogg管理用户
TRANLOGOPTIONS DBLOGREADER,DBLOGREADERBUFSIZE 2597152
TABLEEXCLUDE *.DBMS_TABCOMP_TEMP*
FETCHOPTIONS FETCHPKUPDATECOLS
NOCOMPRESSDELETES
exttrail ./dirdat/aa, format release 11.2 --抽取进程生成的trail文件名
table APP.APPROVE; --需同步的表名
table APP.DUTYSIMPLE;
table APP.DUTYSIMPLEHUMAN;
... --以实际情况填入
Extract投递进程:
- dmp149.prm
extract dmp149 --进程名,异构端或oracle端需要分别配置投递进程
userid ggs, password ggs
rmthost 10.0.0.149, mgrport 7809 --目标端ip
rmttrail ./dirdat/cc, format release 11.2 --在目标端生成的trail文件名
table APP.APPROVE;
table APP.DUTYSIMPLE;
table APP.DUTYSIMPLEHUMAN;
...
Defgen 表结构定义文件:
用于异构目标端
- defgen.prm
defsfile /home/oracle/fhcx.def format release 11.2
userid ggs, password ggs
table APP.APPROVE;
table APP.DUTYSIMPLE;
table APP.DUTYSIMPLEHUMAN;
...
Init 初始化数据进程:
用于在同步增量数据之前初始化全量数据,同构目标端oracle
- sinit.prm
extract sinit --进程名
userid fhcxad,password fhcxadmin --目标端具有dba权限的用户
rmthost 10.0.0.141,mgrport 7809 --目标端ip
rmttask replicat,group dinit --目标端复制进程 dinit
--table CX.OGG_XZW_1121;
--table APP.FILE;
--需初始化的表,表初始化只能执行一次,已经初始化过的表可用‘--’注释掉
table APP.FILEHUMAN;
table APP.VIOLATION;
...
3.2 目标端配置(异构)
Manager管理进程:
- mgr.prm
PORT 7809
AUTORESTART ER *,RETRIES 3,WAITMINUTES 5,RESETMINUTES 60
purgeoldextracts /opt/ogg/dirdat/*,usecheckpoints,minkeepdays 4
Repilcat复制进程: 发往kafka
- ogg2kk.prm
REPLICAT ogg2kk --复制进程名
SOURCEDEFS /home/oracle/fhcx.def --异构目标端使用源端生成的表定义文件
TARGETDB LIBFILE libggjava.so SET property=dirprm/kafka.props
REPORTCOUNT EVERY 1 MINUTES, RATE
GROUPTRANSOPS 10
MAXTRANSOPS 10
MAP app.*, TARGET da.*; --表映射关系
MAP cx.*, TARGET da.*;
...
Kafka 配置:
- custom_kafka_producer.properties
bootstrap.servers=10.0.0.149:9092 --kafka节点ip
acks=1
compression.type=gzip
reconnect.backoff.ms=1000
value.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
key.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
#100KB per partition
batch.size=102400
linger.ms=10000
- kafka.props
修改以下参数,其他使用默认
gg.handler.kafkahandler.KafkaProducerConfigFile=
custom_kafka_producer.properties
gg.handler.kafkahandler.TopicName =oggtopic --topic 名称
gg.classpath=dirprm/:/opt/software/rtp_kafka/kafka_2.10-0.10.1.0/libs/*
--填入kafka libs路径
3.3 目标端配置(oracle)
Manager管理进程:
- mgr.prm
PORT 7809
userid ggs,password ggs
AUTORESTART ER *,RETRIES 3,WAITMINUTES 5,RESETMINUTES 60
purgeoldextracts /opt/ogg12/ogg/dirdat/*,usecheckpoints,minkeepdays 7
ACCESSRULE,PROG *,IPADDR 10.4.3.98,ALLOW --源端ip
--用于初始化数据时,允许源端sini进程调起目标端的dinit进程
Replicat 复制进程:
- rep1.prm
replicat rep1
userid ggs,password ggs
--SOURCEDEFS /home/oracle/fhcx.def
ASSUMETARGETDEFS --同构数据库使用此参数,不需要定义文件
ALLOWNOOPUPDATES
HANDLECOLLISIONS
REPORTCOUNT EVERY 1 MINUTES, RATE
DISCARDFILE ./dirrpt/rep1.desc,append,megabytes 1024
REPLACEBADCHAR SKIP NOWARNING
GROUPTRANSOPS 10
MAXTRANSOPS 10
MAP app.*, TARGET hh.*;
MAP cx.*, TARGET hh.*;
Init 初始化数据进程:
- dinit.prm
replicat dinit
assumetargetdefs
userid ggs,password ggs
discardfile ./dirrpt/dinit.desc,purge
map CX.*,target hh.*;
map APP.*,target hh.*;
4 数据同步
确认源端和目标端端的ogg都已经安装配置完成。
su - oracle #切换到ogg安装目录执行
./ggsci
GGSCI> start mgr #开启源端和目标端的mgr进程
4.1 源端
- 生成表定义文件
su – oracle
#切换到ogg安装目录 ogg/ 执行以下命令生成表定义文件
./defgen paramfile ./dirprm/defgen.prm
#执行完生成/home/oracle/fhcx.def复制至异构目标端的 /home/oracle/ 目录下。若异构目标端无此目录则创建,属组oracle:oinstall
- 添加进程
#在ogg安装目录执行
./ggsci
#添加extract抽取进程
GGSCI> add extract ext1, tranlog, begin now
GGSCI> add exttrail ./dirdat/aa, extract ext1, megabytes 100
#添加datadump投递进程
GGSCI> add extract dmp1, exttrailsource ./dirdat/aa begin now
GGSCI> add rmttrail ./dirdat/cc, extract dmp1, megabytes 100
#启动进程
GGSCI> start ext1
GGSCI> start dmp1
#若进程成功开启,目标端的ogg/dirdat/下有cc开头的文件生成
4.2 目标端(异构端)
-
异构端建表:在异构端数据库创建需要同步的表
-
初始化数据:
需要同步的表在指定scn的情况下初始化全量数据至异构端数据库;
初始化全量数据需在增量trail文件ogg/dirdat/cc 已经生成后操作,以此保证数据不丢失。
- 添加进程
su - oracle
#切换到ogg安装目录执行
./ggsci
#添加replicat复制进程
GGSCI> add replicat ogg2kk, exttrail ./dirdat/cc, begin now
GGSCI> alter replicat ogg2kk,EXTSEQNO 0,EXTRBA 0
GGSCI> start ogg2kk
#若复制进程启动成功,则将trail文件解析发送到kafka
- 生成增量数据文件
编写代码消费kafka中的数据,此处使用java代码生成jar包‘ogg2kk.jar’消费kafka消息数据,写成数据文件。
将ogg2kk.jar的目录放在/home/oracle目录下
nohup java -jar ./ogg2kk.jar 10.0.0.149:9092 /home/oracle/o2kbcp/ 5 >> ./ogg2kafka.log 2>&1 &
kafka_host: kafka机器ip
port: kafka端口
bcp_dir: bcp存放目录
dura: bcp生成周期(分钟)
4.3 目标端(oracle)
-
目标端oracle建表:表结构要和源端完全一致(字段、主键、索引)
-
初始化数据
1)使用ogg进程init初始化数据
分别配置好源端的sinit和目标端的sinit进程
在源端进入ogg命令行:
GGSCI> start extract sinit
开始初始化数据。2)使用数据导入导出工具初始化数据
对于大数据量的表,sinit在初始化过程中会出现‘snap shot too old’的错误,
而且速率很慢,可用数据导入导出工具来初始化数据。 -
添加复制进程
#在目标端进入ogg命令行:
GGSCI> add replicat rep1, exttrail ./dirdat/cc, nodbcheckpoint
GGSCI> start rep1
#启动成功则直接将增量数据作用至目标端oracle表。
5 ogg常用命令
-
使用oracle用户登入ogg命令行: ./ggsci
-
启动进程:start 进程名
启动所有进程:start er * -
查看所有进程状态:info all
查看某个进程详细信息:info extract|replicat 进程名
查看某个进程关于checkpoint的详细信息:info 进程名,showch
查看进程延时:lag 进程名
查看进程运行报告:view report 进程名 -
停止进程:stop 进程名
停止所有进程:stop er * -
查看进程参数配置:view param 进程名
修改进程参数配置:edit param 进程名 -
查看长交易
Send extract 进程名,showtrans [thread n] [count n]
–thread n 可选,查看其中一个节点上未提交的交易
–count n 可选,显示n条记录
Current_checkpoint和recovery_checkpoint不一致,说明存在长事务 -
指定scn启动抽取进程
alter extract ext1,scn 15984721692176指定队列号和rba位置启动投递进程
alter extract dmp1,EXTSEQNO 15595,extrba 0指定队列号和rba位置启动复制进程
alter replicat ogg2kk,EXTSEQNO 225,extrba 0 -
追踪进程
–将进程运行情况输出至指定文件
send replicat rep1 trace /opt/ogg12/ogg/dirtmp/trace_rep1.log
–关闭追踪
send replicat rep1 trace off
6 报错汇总
Ogg安装配置及同步测试流程报错信息请参考《ogg报错汇总》。
7 常用性能调优
问题1. 目标端replicat进程优化
观察到oracle目标端复制进程rep1延迟达100多小时,且lag at chkpt不断增加。
1.查看进程状态和日志 ./dirrpt/rep1.rpt
该进程运行状态正常,但处理速率很慢,仅平均每分钟10条record
2.目标库查询ggs执行的sql及长事务
有张表正在执行长事务,执行时间达3个多小时
3.检查目标端同步表是否有主键或者唯一索引
对于ogg,将trail中的数据应用到目标端实际上是将它们构造成的sql语句早目标端执行,特别是当源端对某张表进行大数据量的批量删除时,在目标端会自动分拆一笔一笔执行删除。
1)对目标端的表建立主键或者唯一索引
2)检查sql执行计划是否合理,可重新analyze表收集统计信息
3)在rep1进程的参数文件中添加参数
GROUPTRANSOPS 1000 --将小交易合成一个大交易提交,降低IO消耗
MAXTRANSOPS 1000 --将大交易拆分提交
4.拆分进程
Ogg的extract进程读取日志,提取有用的信息做一个简单的转换传送到目标端,目标端复制进程需要将trail数据转化成sql作用到数据库,当数据变化较大时可能无法跟上队列的产生速度也会产生lag,可拆分replicat来实现并行复制以适应负载。
1)可根据schema进行拆分,一条复制链路负责一个或多个schema
可根据表进行拆分,每个进程负责一部分表
对于一张表可通过ogg带有的range进行拆分
2)本次将长事务的表拆分出来到另一条复制链路
<1>
GGSCI>info rep1,showch --记录复制进程的extseqno和extrba
GGSCI>stop rep1 --关停复制进程
<2>
复制rep1.prm配置文件为rep2.prm,修改以下参数:
replicat rep2 --进程名
DISCARDFILE ./dirrpt/rep3.desc --告警日志
MAP schema.tablename,TARGET schema.tablename; --拆分的表
修改原rep1.prm配置,添加以下
MAPEXCLUDE schema.tablename --将拆分出去的表在此进程中排除
添加在map语句之前
<3>
添加新进程,读取的trail文件和rep1相同
GGSCI> add replicat rep2, exttrail ./dirdat/cc, nodbcheckpoint
指定进程读取的chkpt,开启进程
GGSCI> alter replicat rep2,extseqno xxx,extrba xxx
GGSCI> start rep2
GGSCI> alter replicat rep1,extseqno xxx,extrba xxx
GGSCI> start rep1
5.通过在replicat使用batchsql来把相同的语句作为一批处理,而不是像普通的处理方式,每行语句单独提交。
对于经常大批量更新,使用batchsql可以大幅度提高性能。但是要注意如果应用程序中有lob字段,或是经常有只更新少量的行,这样使用batchsql没有益能好处,反而使replicat在normal和batch mode之前来回switch,而会影响性能。
对于有些不满足batchsql的条件,replicat会进行重试三次,在这样的情况下,性能下降的情况更加明显。
batchsql 两个主要的参数,定义了多少条语句作为一个语句提交
batchsql opsperqueue 30000, opsperbatch 30000