OGG全称为Oracle GoldenGate,是由Oracle官方提供的用于解决异构数据环境中数据复制的一个商业工具.相比于其它迁移工具OGG的优势在于可以直接解析源端Oracle的redo log,所以呢能够实现在不需要对原表结构做太多调整的前提下完成数据增量部分的迁移.本篇文章将重点介绍如何使用OGG实现Oracle到MySQL数据的平滑迁移,以及讲述个人在迁移过程中所碰到问题的解决方案.
(一)OGG逻辑架构
参照上图简单给大家介绍下OGG逻辑架构,让大家对OGG数据同步过程有个简单了解,后面章节会详细演示相关进程的配置方式,在OGG使用过程中主要涉及以下进程及文件:
Manager进程:需要源端跟目标端同时运行,主要作用是监控管理其它进程,报告错误,分配及清理数据存储空间,发布阈值报告等
Extract进程:运行在数据库源端,主要用于捕获数据的变化,负责全量、增量数据的抽取
Trails文件:临时存放在磁盘上的数据文件
Data Pump进程:运行在数据库源端,属于Extract进程的一个辅助进程,如果不配置Data Pump,Extract进程会将抽取的数据直接发送到目标端的Trail文件,如果配置了Data Pump,Extract进程会将数据抽取到本地Trail文件,然后通过Data Pump进程发送到目标端,配置Data Pump进程的主要好处是即使源端到目标端发生网络中断,Extract进程依然不会终止
Collector进程:接收源端传输过来的数据变化,并写入本地Trail文件中
Replicat进程:读取Trail文件中记录的数据变化,创建对应的DML语句并在目标端回放
第二段:迁移方案
(一)环境信息
OGG_HOME ? ?/home/oracle/ogg ? ?/opt/ogg ?
(二)表结构迁移
表结构迁移属于难度不高但内容比较繁琐的一步,我们在迁移表结构时使用了一个叫sqlines的开源工具,对于sqlines工具在MySQL端创建失败及不符合预期的表结构再进行特殊处理,以此来提高表结构转换的效率.
注意:OGG在Oracle迁移MySQL的场景下不支持DDL语句同步,所以呢表结构迁移完成后到数据库切换前尽量不要再修改表结构.
(三)数据迁移
数据同步的操作均采用OGG工具进行,考虑数据全量和增量的衔接,OGG需要先将增量同步的抽取进程启动,抓取数据库的redo log,待全量抽取结束后开启增量数据回放,应用全量和增量这段期间产生的日志数据,OGG可基于参数配置进行重复数据处理,所以使用OGG时优先将增量进行配置并启用.此外,为了避免本章节篇幅过长,OGG参数将不再解释,有需要的朋友可以查看官方提供的Reference文档查询任何你不理解的参数.
①源端OGG配置
(1)Oracle数据库配置
针对Oracle数据库,OGG需要数据库开启归档模式及增加辅助补充日志、强制记录日志等来保障OGG可抓取到完整的日志信息
查看当前环境是否满足要求,输出结果如下图所示:
OGG需要有一个用户有权限对数据库的相关对象做操作,以下为涉及的权限,该示例将创建一个用户名和密码均为ogg的Oracle数据库用户并授予以下权限
表级补全日志需要在最小补全日志打开的情况下才起作用,之前只在数据库级开启了最小补全日志(alter database add supplemental log data;),redolog记录的信息还不够全面,必须再使用add trandata开启表级的补全日志以获得必要的信息.
Extract进程运行在数据库源端,负责从源端数据表或日志中捕获数据.Extract进程利用其内在的checkpoint机制,周期性地检查并记录其读写的位置,通常是写入到本地的trail文件.这种机制是为了保证如果Extract进程终止或者操作系统宕机,我们重启Extract进程后,GoldenGate能够恢复到以前的状态,从上一个断点处继续往下运行,而不会有任何数据损失.
pump进程运行在数据库源端,其作用非常简单.如果源端的Extract抽取进程使用了本地trail文件,那么pump进程就会把trail文件以数据块的形式通过TCP/IP协议发送到目标端,Pump进程本质上是Extract进程的一种特殊形式,如果不使用trail文件,那么Extract进程在抽取完数据后,直接投递到目标端.
补充:pump进程启动时需要与目标端的mgr进程进行连接,所以需要优先将目标端的mgr提前配置好,否则会报错连接被拒绝,无法传输抽取的日志文件到目标端对应目录下
该文件记录了源库需要复制的表的表结构定义信息,在源库生成该文件后需要拷贝到目标库的dirdef目录,当目标库的replica进程将传输过来的数据apply到目标库时需要读写该文件,同构的数据库不需要进行该操作.
(1)目标端MySQL数据库配置
确认MySQL端表结构已经存在
MySQL数据库OGG用户创建
mysql create user 'ogg'@'%' identified by 'ogg';
mysql grant all on *.* to 'ogg'@'%';
#### 提前创建好ogg存放checkpoint表的数据库
mysql create database ogg;
目标端的MGR进程和源端配置一样,可直接将源端配置方式在目标端重复执行一次即可,该部分不在赘述
checkpoint表用来保障一个事务执行完成后,在MySQL数据库从有一张表记录当前的日志回放点,与MySQL复制记录binlog的GTID或position点类似.
#### 切换至ogg软件目录并执行ggsci进入命令行终端
shell cd $OGG_HOME
shell ggsci
ggsci edit param ./GLOBALS
checkpointtable ogg.ggs_checkpoint
ggsci add checkpointtable ogg.ggs_checkpoint
Replicat进程运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML语句,然后应用到目标数据库中.
#### 添加一个回放线程并与源端pump进程传输过来的trail文件关联,并使用checkpoint表确保数据不丢失
ggsci add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint
ggsci edit params r_cms
replicat r_cms
sourcedefs /opt/ogg/dirdef/cms.def
HANDLECOLLISIONS
MAP cms.*,target cms.*;
注意:replicat进程只需配置完成,无需启动,待全量抽取完成后再启动.
至此源端环境配置完成
待全量数据抽取完毕后启动目标端回放进程即可完成数据准实时同步.
全量数据同步为一次性操作,当OGG软件部署完成及增量抽取进程配置并启动后,可配置1个特殊的extract进程从表中抽取数据,将抽取的数据保存到目标端生成文件,目标端同时启动一个单次运行的replicat回放进程将数据解析并回放至目标数据库中.
(1)源端OGG 全量抽取进程(extract)配置
#### 其中RMTFILE指定抽取的数据直接传送到远端对应目录下
ggsci edit params ei_cms
SOURCEISTABLE
SETENV (ORACLE_SID=cms)
TABLE cms.*;
#### 启动并查看抽取进程正常
shell nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt
## 查看日志是否正常进行全量抽取
shell tail -f ./dirrpt/ei_cms.rpt
ggsci edit params ri_cms
SPECIALRUN
END RUNTIME
EXTFILE /opt/ogg/dirdat/ms
DISCARDFILE ./dirrpt/ri_cms.dsc,purge
MAP cms.*,TARGET cms.*;
#### 启动并查看回放进程正常
shell nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt
#### 查看日志是否正常进行全量回放
shell tail -f ./dirrpt/ri_cms.rpt
第三段:数据校验
数据校验是数据迁移过程中必不可少的环节,本章节提供给几个数据校验的思路共大家参数,校验方式可以由以下几个角度去实现:
①通过OGG日志查看全量、增量过程中discards记录是否为0来判断是否丢失数据;
第四段:迁移问题处理
本章节将讲述迁移过程中碰到的一些问题及相应的解决方式.
(一)MySQL限制
在Oracle到MySQL的表结构迁移过程中主要碰到以下两个限制:
根据实际存储数据的长度,对超长的varchar列进行收缩;
对于无法收缩的列转换数据类型为text,但这在使用过程中可能导致一些性能问题;
mysqlset global foreign_key_checks=off;
(二)全量与增量衔接
HANDLECOLLISIONS参数是实现OGG全量数据与增量数据衔接的关键,其实现原理是在全量抽取前先开启增量抽取进程,抓去全量应用期间产生的redo log,当全量应用完成后,开启增量回放进程,应用全量期间的增量数据.使用该参数后增量回放DML语句时主要有以下场景及处理逻辑:
目标端不存在delete语句的记录,忽略该问题并不记录到discardfile
目标端丢失update记录
- 更新的是主键值,update转换成insert
- 更新的键值是非主键,忽略该问题并不记录到discardfile
目标端重复insert已存在的主键值,这将被replicat进程转换为UPDATE现有主键值的行
(三)OGG版本选择
(四)无主键表处理
(五)OGG安全规则
报错信息
错误信息含义源端报错表示为该抽取进程需要和目标端的mgr进程通讯,但是被拒绝,具体操作为:源端的extract进程需要与目标端mgr进行沟通,远程将目标的replicat进行启动,由于安全性现在而被拒绝连接.
报错原因
在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要远程启动目标端的replicat进程,需要在mgr节点增加访问控制参数允许远程调用
解决办法
在源端和目标端的mgr节点上分别增加访问控制规则并重启
(六)数据抽取方式
解决方法
将抽取进程中的RMTTASK改为RMTFILE参数 官方建议将数据先抽取成文件,再基于文件数据解析进行初始化导入
后台用servlet或者action都可以接受到前台页面传过来的数据.只要你在后台写了连接数据库的方法,并且写了入库的方法,如save方法,就可以放入数据库中了.至于连接数据库的代码,网上一大堆.
new SimpleDateFormat()来处理,百度搜索下就可以了.
前提:在做insert数据之前,如果是非生产环境,请将表的索引和约束去掉,待insert完成后再建索引和约束.
alter table tab1 nologging;
commit; alter table tab1 logging;
对于select之后的语句是全表扫描的情况,我们可以加parallel的hint来提高其并发,这里需要注意的是最大并发度受到初始化参数parallel_max_servers的限制,并发的进程可以通过v$px_session查看,或者ps -ef |grep ora_p查看.
alter session enable parallel dml;
其他方法:
INDEX BY BINARY_INTEGER;
FORALL i IN 1 .. v_col1.COUNT insert into tab1
WHERE tab1.col1 = v_col1;
END;
用批量绑定(bulk binding)的方式.当循环执行一个绑定变量的sql语句时候,在PL/SQL 和SQL引擎(engines)中,会发生大量的上下文切换(context switches).使用bulk binding,能将数据批量的从plsql引擎传到sql引擎,从而减少上下文切换过程,提升效率.该方法比较适合于在线处理,不必停机.
用copy的方法进行插入,注意此处insert没有into关键字.该方法的好处是可以设置copycommit和arrarysize来一起控制commit的频率,上面的方法是每10000行commit一次.
这两个错误一般出现在利用代码循环执行数据库命令(例如将数据导入到数据库)时,例如在C#中
①.)建立一个OracleConnection
ORA-01000: 超出打开游标的最大数
解决办法:
第二步循环中中每次执行完OracleCommand,都将command.dispose()下,释放掉这个资源就好了
此外,也可以修改数据库的最大游标数,不过这个方法治标不治本.
以上就是土嘎嘎小编为大家整理的oracle数据怎么写入相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!