GoldenGate实施经验总结

GoldenGate实施经验总结

进程监控的依据
ggsci命令
- 通过在OGG命令行中查看进程信息命令的输出结果监控进程运行状态
- 常用命令是info命令,如infall, infer *等
- 通过自定义脚本执行ggsci命令可以监控OGG运行状态
ggserr.log
- 该日志文件由Manager进程维护
- 记录所有进程的启动和停止信息及其它日志信息,按照严重级别划分为
INFO/WARNING/ERROR
- 可以通过Director,第三方监控工具或自定义脚本监控
进程报告
- 进程报告里面包含了该进程从启动至今的运行信息
- 一旦进程中止,是排除错误的首要依据
OGG监控最佳实践- 使用Director
配置告警邮件
- 监控ggserr.log出现Warning和Error信息进行邮件告警
- 可为每个OGG实例、进程设定不同的告警接收人
OGG监控最佳实践- 使用脚本
使用脚本执行ggsci命令,根据结果判断运行状态,如进程异
常可以发送告警邮件,可以将进程报告放到邮件中作为附件
脚本示例
#!/usr/bin/ksh
LD_LIBRARY_PATH=/app/oracle/10.2/db_1/lib
ORACLE_SID=ggs
ORACLE_BASE=/app/oracle
PATH=/usr/lib/qt-
3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin:/app/oracle/10.2/db_1/bin
SLEEPTIME=30 # number of seconds tsleep between iterations
[email protected] #Email address treceive alert message.
OGG_HOME=/home/oracle/goldengate #GoldenGate installation directory.
OGG监控最佳实践- 使用脚本(续)
while (( 1 ))
do
cd $OGG_HOME
ech"infall" | ./ggsci |grep -E "MANAGER|EXTRACT|REPLICAT" > gginfo.tmp
while read Program Status Group Lag Time
do
if [ "$Program" = "MANAGER" -a "$Status" = "STOPPED" ]; then
mail -s "GoldenGate MANAGER STOPPED." $ALERT_EMAIL <
$OGG_HOME/dirrpt/MGR.rpt
exit
else
if [ "$Status" = "ABENDED" -"$Status" = "STOPPED" ]; then
mail -s "GoldenGate $Program $Group $Status." $ALERT_EMAIL <
$OGG_HOME/dirrpt/$Group.rpt
fi
fi
done < gginfo.tmp
rm gginfo.tmp
sleep $SLEEPTIME
done
exit 0 提示:本例使用mail命令发送有邮件,请联系系统管理员确认或修改发送邮件方法
REPORT
- REPORT AT 14:00
- REPORT ON FRIDAY AT 23:00
REPORTCOUNT
- REPORTCOUNT EVERY 1000000 RECORDS
- REPORTCOUNT EVERY 30 MINUTES, RATE
配置Report收集统计信息
- REPORTCOUNT EVERY 2 HOURS
REPORTROLLOVER
- REPORTROLLOVER AT 01:00
配置定时删除过期队列
用于自动删除过期队列,节省硬盘空间
建议配置在Mgr进程中,可集中管理所有队列
- 在mgr参数中加入以下行
purgeoldextracts //dirdat/*, usecheckpoint,
minkeepdays 7
其中,第一个参数为队列位置,*可匹配备份中心所有队列文件;
第二个参数表示是首先要保证满足检查点需要,不能删除未处理队列;
第三个参数表示最小保留多少天,后面的数字为天数。例如,如果希望只
保留队列/ggs/dirdat/xm文件3天,可以配置如下:
purgeoldextracts /ggs/dirdat/xm, usecheckpoint, minkeepdays 3
- 说明
Mgr进程参数需重启Mgr进程后生效
临时停止mgr进程并不影响数据复制。
配置自动定时重启进程
用于自动恢复由于网络临时中断、数据库或系统维护
等原因造成的进程终止,降低人工工作量
建议在Mgr进程配置
- 在mgr参数文件加入以下行
AUTORESTART ER *, RETRIES 3, WAITMINUTES 5, RESETMINUTES 60
以上参数表示每5分钟尝试重新启动所有进程,共尝试三次。以后每60分钟清
零,再按照每5分钟尝试一次共试3次。
说明
- 需重启Mgr进程使参数生效
- 可查询ggserr.log文件查看重启尝试信息
长交易的管理
停止Extract之前需验证检查点和长交易,以防止下次启动无法
找到归档日志:
ggsci> infextXX, showch
查看长交易
例如,查看extsz进程中节点1上最长的10个交易,可以通过下列命令:
Ggsci> send extract extsz , showtrans thread 1 count 10
强制跳过或接受长交易
Ggsci> SEND EXTRACT <进程名>, SKIPTRANS <5.17.27634> THREAD
<2> //跳过交易
Ggsci>SEND EXTRACT <进程名>, FORCETRANS <5.17.27634>
THREAD <1> //强制认为该交易已经提交
说明:使用这些命令只会让GoldenGate进程跳过或者认为该交易已经提交
,但并不改变数据库中的交易,他们依旧存在于数据库中。因此,强烈建议
使用数据库中提交或者回滚交易而不是使用GoldenGate处理。
长交易的管理(续)
配置长交易告警
- 可以在extract进程中配置长交易告警,参数如下所示:
warnlongtrans 12h, checkintervals 10m
以上表示GoldenGate会每隔10分钟检查一下长交易,如果有超过
12个小时的长交易,GoldenGate会在根目录下的ggserr.log里
面加入一条告警信息。通过察看ggserr.log或者在ggsci中执行
view ggsevt命令查看这些告警信息,可以配置Director或自定义
脚本发送告警邮件。
修改检查点- Extract
修改主Extract的读检查点
- 修改全部检查点
Alter extract begin [now]|[yyyy-mm-dd hh:mm:ss]
- 修改单个检查点
Startup检查点无需修改
Current Checkpoint的修改
ALTER EXTRACT myext [, THREAD 2], EXTSEQN1126, EXTRBA 0
- RAC环境下读取日志的Extract必须针对每一个节点单独指
定thread号和日志序列号/字节进行修改
Recovery Checkpoint的修改(内部命令)
ALTER EXTRACT myext [, THREAD 2], IOEXTSEQN IOEXTRBA
- 同Current Checkpoint,对RAC各节点均需单独修改
举例:如果重启时确认长事务无需复制,可以将Recovery设置为Current
Checkpoint相同或之前的特定位置,跳过某些归档日志
修改检查点(续一)
修改主Extract的写检查点
- 不能强制指定Extract写检查点的extseno和extrba
- 只能通过重启或者ALTER EXTRACT myext, ETROLLOVER让Extract滚
动到下一个队列,由于该命令不会写队列文件头尾信息需手工修改后继进
程检查点以保证其顺利读到下一个队列。
注:如果是旧版本,只能通过ETROLLOVER滚动
修改Data Pump的读检查点
- 不能通过begin now或指定时间点修改Data Pump读检查点!
-只能修改Data Pump读取的队列序列号和字节
ALTER EXTRACT mydp, EXTSEQN26, EXTRBA 0
注:如果想要设定为从某个时间点开始,只能手工通过logdump查找队列中
时间点附近的记录并指定从该记录位置开始
修改检查点(续二)
修改Data Pump的写检查点
- 同修改主Extract的写检查点,只能通过etrollover向下滚动一个队列
修改Replicat读检查点
- 同修改Data Pump的读检查点,只能通过指定队列序列号和RBA
修改Replicat写检查点
- N/A,Replicat只使用一个检查点
增加复制表的步骤
停止Extract/Data Pump/Replicat进程
- 注意停止Extract时检查长交易和归档日志
在源和目标建立复制表
在源端为该表添加附加日志
修改Extract/Data Pump/Replicat参数中复制范围包含该表
重启Extract/Data Pump/Replicat进程
可以开始对新增表进行操作
注意:以上操作仅限于DML复制。如配置了DDL复制则可以自动
生成附加日志和在目标端创建表结构。
场景分析- 添加复制表忘记附加日志
场景描述
- 在添加复制表时,忘记了添加新增表附加日志
场景分析
- Insert操作可以正常复制,不受附加日志影响
- Update/Delete因为没有主键列信息记入日志,目标端无法生
成对应SQL
处理方法
- 源库对该表添加附加日志
- 重新对该表进行初始化(见后面)
Q:可否修改时间点或使用当前队列进行恢复?
删除复制表的步骤
停止Extract/Data Pump/Replicat进程
- 注意停止Extract时检查长交易和归档日志
修改Extract/Data Pump/Replicat参数中复制范围排除该表
- 如使用通配符时,Extract/Data Pump可通过tableexclude排除表
tableexclude ctais2.KJ_*;
tableexclude ctais2.DJ_YZCWSBQC;
table ctais2.*;
- 如使用通配符时,Replicat可通过mapexclude排除表
MAPEXCLUDE fin.TEST
MAP fin.*, TARGET fin.*;
重启Extract/Data Pump/Replicat进程
说明:在一个复制链路的任何一个环节去掉该表即可排除该表复制,但建
议在主Extract进行排除,可以避免各进程做不必要的工作;同时,在各
个进程参数均明确去掉该表可以保持前后的逻辑统一性和易读性
修改复制表结构的步骤
OGG在读取表结构定义后将其缓存在内存中,不自动进行刷新
,因此凡涉及表结构变更,例如表中列的增删改和主键(或唯
一索引)的变化均需按照下列步骤执行(Q:普通索引如何?)
操作步骤
- 检查无延迟后停止源和目标端各进程(注意检验重启时归档日志可用性)
- 修改目标表结构;
- 修改源表结构;
- 如果表有主键(或唯一索引),并且本次修改未修改主键,则可以直接启动
源和目标所有进程继续复制,完成本次修改;否则,如果表无主键和唯一
索引或者本次修改了主键则需重新为该表增加附加日志
ggsci> dblogin userid goldengate, password XXXXXX
ggsci> delete trandata schema.mytable
ggsci> add trandata schema.mytable
- 重新启动源端和目标端的抓取和复制进程。
复制表的重新初始化
监控各进程到全部没有延迟
停止各进程,从源端导出此部分表并导入目标端
在Replicat参数中单独对该部分表加入冲突处理:
MAP dbo.tcust, TARGET dbo.tcust, HANDLECOLLISIONS;
启动各进程直到没有延迟,去除该表的handlecollisions参数并
重启Replicat
注意:如该表没有主键或唯一索引,不能使用本方法。只能在
一个空闲时段或者锁定该表进行重新初始化。
Q:为什么不像安装实施时那样,等待所有交易最早开始时间小
于进程停止时间后再做重新初始化?
常用调优方法- 寻找extract瓶颈
使用系统工具监控Extract运行的CPU/IO/Mem
- CPU:top,topas,sar等
- IO:iostat等
- Mem:vmstat等
使用TESTMAPPINGSPEED
- 可以使Extract只解析日志但不写队列,用于测试日志抽取速度
- 如果加入该参数使Extract性能能够显著提高,则写队列为可能瓶颈
缩小Extract包含的表范围
- 只保留一个数据变化较小表或者加一个测试表,观察Extract处理速
度是否得到提高,如有显著提高则可能瓶颈在数据库fetch,可通过
查询运行期间存在哪些select语句予以验证
Extract的瓶颈一般在于LCR转换为UDF
常用调优方法- extract调优方法
进程拆分
- 最有效方式,可以使用多个CPU并行处理
- 注:每个进程可以最多占用CPU个数为RAC节点数+1,即如果是2
节点RAC则每个抽取进程最高占用3个CPU内核
如果系统IO出现瓶颈:
- 增大日志读取间隔
EOFDELAY 3 //间隔3秒,缺省为1秒
- 增大内存刷新间隔
FLUSHSECS 3 //间隔为3秒,缺省为1秒
常用调优方法- data pump调优
使用PASSTHRU避免与源数据库交互
如网络带宽较低
- 加入数据压缩
RMTHOST …, COMPRESS //压缩在网络上传输的数据。如果本地局域网
则无须加入压缩,因为其会增加CPU压力。
- 增大tcp缓存大小
RMTHOST newyork, MGRPORT 7809, TCPBUFSIZE 100000,
TCPFLUSHBYTES 300000
如IO出现瓶颈
- 增大队列读取间隔
EOFDELAY 3 //间隔3秒,缺省为1秒
- 增大内存刷新间隔
FLUSHSECS 5 //间隔为5秒,缺省为1秒
常用调优方法- 寻找Replicat瓶颈
使用系统工具监控Extract运行的CPU/IO/Mem
- CPU:top,topas,sar等
- IO:iostat等
- Mem:vmstat等
使用TESTMAPPINGSPEED
- 可以使Replicat只解析队列但不实际写数据库,用于测试读队列速度
- 如果能使Replicat性能能够显著提高,则写数据库队为瓶颈
Replicat的瓶颈一般在于写数据库
常用调优方法- replicat调优
表一定要指定主键或者唯一索引
使用操作合并
BATCHSQL BATCHESPERQUEUE 100, OPSPERBATCH 8000
- 说明:只适用于小表,对于列特别多或者字段特别长的表反而可
能降低性能;对于少量表重复进行操作的情景例如批处理比较有
效。可以通过对两个子参数的组合进行尝试获取最佳性能。
对于密集小交易使用交易合并
GROUPTRANSOPS 1000
对大交易使用交易分拆
MAXTRANSOPS 10000
使用insertappend加速插入速度
拆分为多个replicat
GROUPTRANSOPS与MAXTRANSOPS
Grouptransops示例
三个交易,分别有25/50/60个记录
假如grouptransops 为100 (缺省值),则Replicat一直要等待到第三个交易时
25 + 50 + 60 > 100才后Commit
两参数关系算法
if end of transaction OR num of operations >= maxtransops then
if num of operations >= grouptransops then
COMMIT transaction.
举例
- 假设Grouptransops = 100, maxtransops = 1,则上述例子中同样要等
待第三个交易后提交
- 假设Grouptransops = 1, maxtransops = 1,则每个交易提交一次
- 假设Grouptransops = 10, maxtransops = 10,则每10个记录提交一次
- 建议二者设置为相同值MAXTRANSOPS = GROUPTRANSOPS
常用调优方法- 并行处理与进程拆分
拆分粒度
- 可以通过schema进行区分,每个复制链路负责一个或多个schema;
- 也可以根据表进行分割,每个进程负责不同表的集合;
- 对于同一个表也可以通过Range拆分为几个进程同时处理。例如:
Replicat 1:
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 2));
Replicat 2:
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 2));
进程拆分的注意事项
- 各进程间没有同步机制,应尽量确保同一交易涉及表在一个进程
常用调优方法- 并行处理交易一致性
保证抽取一致性
- 由于OGG的Extract性能较高,可以使用尽量少的Extract完成抽取,多
个之间以业务或Schema进行区分
- 单个Extract抽取出来的队列中可以保证交易的一致性和先后顺序
尽量保证投递一致性
- 如单个Replicat无法满足一个队列投递数据要求
可以根据表进行分割,每个进程负责不同表的集合,尽量保证同一业
务涉及表放在一个Replicat中,可以保证一致性;(需临时禁止表间
的外键链接保证Replicat可进行拆分)
对于同一个表也可以通过Range拆分为几个进程同时处理
- Replicat拆分可能临时造成各进程间不同步,但是
多个Replicat性能会得到很大提高,可以保证数据复制始终是实时的
当源端出现灾难后,由于Extract可以保证源端抽取时数据的一致性
,而目标端多Replicat读取的是同一个队列,当它们应用队列数据完
毕后是可以达到数据一致的


你可能感兴趣的:(oracle)