GoldenGate实施参考
转载一篇原厂的Oracle GoldenGate的实施参考
安装信息收集
收集客户信息(建议至少提前两周)
– 测试/生产环境
– 操作系统列表
– 数据库列表
– 数据库日志增量评估
每天日志增量、峰值日志增量
–网络配置:带宽、端口等
带宽评估(如带宽不足,是否需要启动压缩,压缩对CPU占用测试)
– 数据结构
包括表数量、是否存在无主键表、是否有不支持数据类型等
– 验证OGG版本可用性!
针对不同的操作系统和数据库版本下载需要的OGG版本并安装测试
带宽估算
根据峰值产生日志量估算带宽占用
假设条件
– 假设OGG队列与日志比例为1:4。如只复制部分表则此比
例可以假设为更低。
– 假设网络传输效率为0.7
– 假设网络传输压缩比例为1:8。根据数据内容有所变化,一
般字符数据较多时压缩比例较大,二进制对象压缩效率较低
带宽估算算法
– 以客户业务高峰期每小时产生40G为例,可以估算如下
带宽=40G/3600(秒/小时)/ 4(日志过滤比例)/8(压缩比率) * 8(每字
节8位) /0.7(网络传输效率)=4Mbps
无主键表的复制
GoldenGate可以正常复制无主键表,以所有列作为基准
代替主键
强烈建议排除掉无主键表或者增加主键(或唯一索引)
– 一般为临时表或者历史表
– 导致附加日志增量较大,可能影响生产系统性能
– 目标端replicat投递效率非常低且无法进行优化
– 容易出现数据不一致且不易修复
– 无法使用HANDLECOLLISIONS
该参数依赖于表的主键进行逻辑判断,无主键表使用该参数会导
致重复记录出现
测试安装准备
– 测试安装文档准备
拟定安装操作文档
拟定初始化方案并与客户达成一致
– 根据测试安装场景准备
数据库脚本,如建立用户、赋予权限等
准备OGG安装所需脚本,如add trandata命令脚本、目标
端禁止trigger和cascade delete脚本等
OGG参数文件,列出所有可能用到参数
OGG命令,常用命令预先放在文本里
验证参数、命令、脚本的可行性
发现潜在的问题,及时寻求解决方案
– 预订技术支持
测试安装准备 –网络端口
对于GoldenGate所在的数据库主机
– 源和目标均向对方开放端口7800-7810,用于mgr管理进程通讯和数据
传输进程传输数据。
– Director管理各个GoldenGate实例需要执行大量监控命令,每次命令需
要一个端口,建议开放7811-7850端口;
– Veridata为了实现并发比较,同样需要大量端口,建议开放7851-7950
端口;
– 综上所述,建议复制源和目标相互以及为Director Server和Veridata
Server开放7800-7950端口。
对于Veridata Server和Director Server
– 由于国网需要每个Director Server监控上百台主机,需要大量动态分配
端口,建议Director Server向所有受控服务器开放所有端口。
测试安装准备 –系统设置(源和目标)
建立GoldenGate运行用户
– 需访问数据库的动态库、在线日志及归档日志
– 使用oracle用户,也可为其创建新的系统用户将其加入到oracle安装用
户所在组(一般为oinstall)。
– 为GoldenGate运行用户配置内存限制
分析和抽取交易数据需一定内存,需放宽GoldenGate运行系统用户
对内存大小(memory)、文件大小(fsize)、DATA、STACK等参数
的值,在系统允许的情况下尽量将参数设置为-1(ulimited),一般
在/etc/security/limits文件中。
RAC各节点配置时钟同步
– GoldenGate在单节点上对所有节点日志进行解析,为了保证其在各节点
抽取数据顺序的一致性,需要在各个节点主机上配置时钟同步(例如在
AIX下配置NTP服务)。
创建OGG所需数据库用户(源和目标)
OGG用户在源端所需权限(DML)
– GRANT CONNECT TO goldengate;
– GRANT ALTER ANY TABLE TO goldengate; //用于添加表附加日志
– GRANT ALTER SESSION TO goldengate;
– GRANT CREATE SESSION TO goldengate;
– GRANT FLASHBACK ANY TABLE TO goldengate;
– GRANT SELECT ANY DICTIONARY TO goldengate;
– GRANT SELECT ANY TABLE TO goldengate;
– GRANT RESOURCE TO goldengate;
目标端DML复制需所有源端权限加上
– GRANT INSERT ANY TABLE TO goldengate;
– GRANT UPDATE ANY TABLE TO goldengate;
– GRANT DELETE ANY TABLE TO goldengate;
如需复制DDL,则两端均需要sysdba权限
– grant sysdba to goldengate;
测试安装准备 – 存储空间(源和目标)
为GoldenGate分配空间
– 建议在共享阵列,可以在单节点失败后由其它节点接管,通过
脚本可以与集群软件集成
– GoldenGate软件所需空间主要取决于队列的产生速度,一般建
议为其保留相当于数据库1-3天归档日志量的存储空间。
– 存储划分完后建立OGG安装目录并将该目录Owner设为OGG运
行用户
为数据库保留1-3天归档日志
– 长交易需要其开始时段的日志
测试安装准备 – 数据库(源)
打开归档模式
– 避免OGG重启无法找到对应日志
配置parallelism(针对Oracle 9i)
– 将LOG_PARALLELISM参数设为1,OGG不支持大于1
关闭recycle bin(针对DDL复制)
– Oracle 10g R2 and later: 将RECYCLEBIN初始化参数设置为
OFF.
– Oracle 10g R1: 将 _RECYCLEBIN初始化参数设置为FALSE.
OGG软件安装 (源和目标)
上传和解压OGG软件
– 检查安装目录Owner是否是OGG运行用户
配置环境变量
– 如使用Oracle运行用户一般无需调整
– 如非Oracle用户则建议拷贝Oracle的profile文件,至少需配置如
下环境变量
PATH
ORACLE_SID
ORACLE_HOME
LD_LIBRARY_PATH (Solaris, Linux), LIBPATH (AIX),
SHLIB_PATH (HPUX)
配置完毕可以通过能否执行sqlplus进行初步验证
– 使用ulimit –a检查内存等限制
OGG软件安装 -续(源和目标)
执行ggsci,检查是否能够进入OGG命令行界面
执行create subdirs创建子目录
执行edit param mgr为manager配置参数,然后尝试
启动mgr进程
如以上步骤均能顺利执行,则表明初步安装成功.由于
以上步骤并不影响生产库运行,可以在测试安装前几
天提前完成.
打开附加日志(源)
以渐进模式打开附加日志
– 第一步,在晚上或其他业务较空闲时段打开数据库级最小附加日
志
– 第二步,经过一段时间运行观察数据库最小附加日志对数据库是
否有影响,观察日志量的增加
– 第三步,同样选择空闲时段打开所需复制表的附加日志
– 第四步,经过一段时间运行观察数据库是否有性能下降,归档日志
量是否有明显增加
如何降低附加日志影响(☆)
– 排除一些应用的中间表
– 尽量排除无主键和唯一索引表(记录全部列会导致日志量显著增
加)或给他们加上主键、
如何打开附加日志
数据库级附加日志
– 视图v$database
SUPPLEMENTAL_LOG_DATA_MIN:最小附加日志,开关
– 打开所需复制表的表级附加日志
ALTER DATABASE add SUPPLEMENTAL LOG DATA;
目的是产生最小日志增量,避免对生产主机产生较大影响
表级附加日志
– 通过OGG命令行中的add trandata schema.table 命令添加
– 如果有主键则只加入主键;无主键添加唯一索引;两者皆无,则
自定义添加,否则添加所有列
Extract进程
设置操作系统变量
– 继承mgr进程变量
设置进程本身参数和变量
– 读取参数文件
– 设定内存限制(可以通过CACHEMGR修改,缺省单个进程32位
系统最大2G,64位系统最大8G内存)
连接数据库
– 根据下列信息登录数据库
userid参数
环境变量ORACLE_SID(也可通过setenv参数设置)
环境变量ORACLE_HOME (也可通过setenv参数设置)
– 获取数据库版本信息和字符编码
注意:环境变量中NLS_LANG设置必须与数据库保持一致
– 根据检查点确定读取日志,寻找并开始解析日志
Oracle日志的读取 – 在线日志
根据检查点中的日志序列号判断是在线还是归档
在线日志
– 由于在线日志频繁读写,在系统IO缓存中,读取速度较快
– 在线日志位置及特殊参数
文件系统
ASM。需配置如下(只能使用SYS登录ASM实例):
TRANLOGOPTIONS ASMUSER SYS@<ASM_instance>,
ASMPASSWORD <password>
RAW DEVICE。在Aix下一般需要配置如下参数:
tranlogoptions rawdeviceoffset 0
注意:该参数只在内部参考手册中存在
如果需抽取CLOB必须加上
– TRANLOGOPTIONS CONVERTUCS2CLOBS
说明:如果使用begin now时OGG读取日志序列号错误,可以尝试使
用extrba和extseqno直接指定日志位置
Oracle日志的读取 – 归档日志
缺省查询数据库中归档日志位置和格式并到指定位置查找
对应归档日志文件
可通过参数指定归档日志
– TRANLOGOPTIONS {
[ALTARCHIVEDLOGFORMAT <string>] [INSTANCE
<instance_name>] [THREADID <id>]
指定日志文件名的格式
[ALTARCHIVELOGDEST [PRIMARY] [INSTANCE
<instance_name>] <path name>]
指定归档日志目录。如果是RAC,需要访问到所有节点归档日
志,可使用共享文件系统或者使用nfs等将其它节点归档共享到
运行节点
如果为所有节点指定了归档日志目录,则可以使用PRIMARY
参数告诉GoldenGate无需再去查询log_archive_dest_N
– 可以通过降低进程对控制文件访问次数
Replicat进程
设置操作系统变量
– 继承mgr进程变量
设置进程本身参数和变量
– 读取参数文件
初始化加载之后指定开始的CSN
连接数据库
– 根据下列信息登录数据库
userid参数
环境变量ORACLE_SID(也可通过setenv参数设置)
环境变量ORACLE_HOME (也可通过setenv参数设置)
– 获取数据库版本信息和字符编码
注意:环境变量中NLS_LANG设置必须与数据库保持一致
宕机初始化步骤
完成前面所述的所有准备工作
根据约定时间停止业务应用
源端
– 锁定除去OGG数据库用户以外其余所有用户
– 停止Oracle内部的所有Job
– 关闭数据库
– 重新启动数据库
– 配置OGG抽取进程和本地队列
– 启动OGG抽取进程,验证
抽取进程是否可以正常启动,主要是验证是否能正常读取日志
观察是否有数据被抽取出来,如有则说明尚有其它连接在修改数据,
需找出原因并停止
– 停止OGG抽取进程
– 可使用脚本记录部分主要表或所有表记录总数
– 关闭数据库
OGG最佳实践 – 宕机初始化 (续一)
源端
– 使用RMAN/可传输表空间/BCV等方式将数据导出
– 在源端打开数据库
– 启动源端抽取进程(也可重新配置一遍,注意清除旧的队列)
– 解开锁定的其它用户,恢复job
– 启动应用
– 观察数据抽取是否正常
目标端
– 将数据导入到目标库
– 打开数据库
– 解锁其它用户(如允许也可保持锁定状态防止修改数据)
– 对比记录的源端数据库记录数与目标记录数是否相同,验证恢复完成
OGG最佳实践 – 宕机初始化 (续二)
源端
– 配置Data Pump和远程队列
– 启动Data Pump观察数据传输是否正常
目标端
– 配置Replicat
注意目标端用户权限比源端多几个
– 启动Replicat观察数据是否正常
注:此时一般将reperr设置为abended模式(即默认模式)并配置
discardfile参数,遇有错误进程可以立即中止,便于及时查找错误
– 如Replicat速度跟不上队列增长速度,需进行Replicat拆分
OGG最佳实践 – 基于SCN号的无宕机初始化
前提条件
– 客户具有能够将目标恢复到某一特定SCN号的备份/恢复工具
RMAN (强烈推荐)
Exp/imp
操作步骤
– 源端
完成前面所述的所有准备工作
配置OGG抽取进程和本地队列
启动OGG抽取进程并记录开始时间
查询数据库中当前交易最早的开始时间,直到该时间超过OGG抽取
启动时间点
查询和记录此时SCN号为最小所需SCN
可每隔半小时或一小时重新查询SCN号和记录此时全库所有表或部
分关键业务表中记录数
OGG最佳实践 – 基于SCN号的无宕机初始化 (续一)
目标端
– 使用备份/恢复工具恢复目标库到指定SCN号
如果是RMAN可以边恢复边观察,直到恢复出来的SCN号和时间点
大于记录的最小所需SCN号
– 查询目标库中全部表或关键表记录,看其是否大致符合源端记录数
– 删除掉目标端物化视图等无用对象
– 通过SQL禁止目标端trigger和外键或者配置GoldenGate目标端参数
在会话级禁止
– 配置Replicat
注:此时一般将reperr设置为abended模式(即默认模式)并配置
discardfile参数,遇有错误进程可以立即中止,便于及时查找错误
– 使用以下命令启动Replicat
Start myrep, AFTERCSN <目标恢复到的CSN>
– 观察数据复制是否正常
目标初始化方案
初始化的关键
– 如何避免数据丢失
– 如果处理冲突数据
使用HANDLECOLLISIONS处理冲突数据
– 条件:表均有主键或唯一索引
– 方法:在启动replicat前加入HANDLECOLLISIONS参数,依赖
表主键处理掉重复数据
– 问题:如果表没有主键则可能产生重复记录
使用SCN
– 启动extract后按照前面说述选择合适时间点获取其SCN;
– 使用exp或rman等获取对应于该SCN的影像并装载到目标端;
– 启动replicat时使用start replicat <name>, aftercsn <number>或
者在replicat的map参数加入filter ( @getenv (“TRANSACTION”,
“CSN”) > <number>) ;使replicat从该scn后的记录开始。
数据复制典型场景 – 重新获取最近数据变化
可以通过修改ext/replicat起始检查点到指定时间
– 方案一:使用alter extga,begin 2010-03-21 08:00:00
条件:对应归档日志依然存在
– 方案二:修改replicat从指定位置队列重新开始应用
ALTER REPLICAT finance, EXTSEQNO 53,EXTRBA 0
可以通过查看队列生成时间或者logdump查看记录时间戳定位时间
重复数据处理
– 在replicat使用handlecollisions(必须有主键或者唯一索引)
DDL复制的范围
只支持Oracle数据库
– 暂不支持其它数据库DDL复制!
对于Oracle数据库,GoldenGate能够支持除去数据
库系统对象之外所有对象DDL变化的复制
GoldenGate DDL复制需要关闭Oracle的
– _RECYCLEBIN参数(Oracle 10.1)
–RECYCLEBIN参数(Oracle 10.2及以后版本)。
DDL复制的原理及特点
Oracle GoldenGate的DDL复制是基于Trigger的复制,
– 在源库建立一个Oracle全库级的Trigger捕捉DDL操作到中
间表
– Extract读取中间表DDL语句并与DML语句根据csn排序
– 目标端重现该DDL操作sql语句
特点
– DDL复制与DML复制的复制机理是完全不同的
DDL复制基于Trigger,而DML复制基于日志,两者的复
制机理不同,其数据捕捉是没有联系的,只是在主
Extract进程中通过scn号按照发生的顺序进行组装,保
证DDL操作和DML操作按照其原来的顺序执行。
DDL复制的原理及特点(续)
特点(续)
– DDL复制与DML复制是相互独立的
DDL复制的Trigger建立和启用后,无论DML复制是否运
行,该Trigger一直在发生作用,捕捉DDL sql语句到中
间表。因此,DML复制的起停并不影响DDL的捕获。
同样,DDL Trigger的启用和停止并不影响DML复制,
只是该Trigger被禁止后不再抓取DDL操作。
它们之间只是在Extract进行组装时根据scn号进行排序,
没有其它任何联系。
– DDL复制只是简单的sql复制
通过Trigger捕捉DDL其实就是抓取原始的sql语句并发送
到目标重新执行一遍。
DDL复制的限制
DDL复制会影响数据库性能
– 捕获DDL语句的Trigger是全库级别的Trigger,即该数据库
上的任何一个DDL操作无论其是否在复制范围内均会触发
该Trigger并被记录到中间表供Extract进程删选。因此启用
DDL复制会导致源库的DDL操作全部触发Trigger,如果数
据库日常业务量较多并且DDL操作较多,会导致数据库性
能下降很多。
DDL语句并不一定能在目标执行成功
– 由于两端数据库总存在物理和逻辑上的不同,例如两边的
安装目录和数据文件、表空间等会有所区别,造成同样的
DDL语句在源端能够执行但无法在目标端执行。虽然可以
通过字符串替换预先定义和解决类似问题,但DDL语句有
可能在目标重现后产生与源端不同结果,需要较多的维护
操作。
何时打开DDL复制
DDL复制优点
– 打开DDL复制能够可以自动创建每次补丁新建和修改的对象,并自动
维护对应的附加日志,无需人工介入,减少人工工作量。
使用原则:
– 两端必须是Oralce数据库;
– 两端的表结构完全相同;
– 数据复制过程中没有数据的转换;
– 数据库每日产生日志量不超过50G;
– 应用系统在数据库中不能有频繁的DDL操作,如频繁建立中间表等操
作。
如果符合以上条件,可以联系Oracle GoldenGate技术支持探讨打开DDL
复制。
转载于:https://blog.51cto.com/evils798/1420535