原创做者: 杜开生mysql
本文目录:sql
1、OGG概述shell
(一)OGG逻辑架构数据库
2、迁移方案vim
(一)环境信息安全
(二)表结构迁移网络
(三)数据迁移session
1.源端OGG配置数据结构
(1)Oracle数据库配置架构
(2)Oracle数据库OGG用户建立
(3)源端OGG 管理进程(MGR)配置
(4)源端OGG 表级补全日志(trandata)配置
(5)源端OGG 抽取进程(extract)配置
(6)源端OGG 传输进程(pump)配置
(7)源端OGG 异构mapping文件(defgen)生成
2.目标端OGG配置
(1)目标端MySQL数据库配置
(2)目标端OGG 管理进程(MGR)配置
(3)目标端OGG 检查点日志表(checkpoint)配置
(4)目标端OGG 回放线程(replicat)配置
3.全量同步配置
(1)源端OGG 全量抽取进程(extract)配置
(2)目标端OGG 全量回放进程(replicat)配置
3、数据校验
4、迁移问题处理
(一)MySQL限制
(二)全量与增量衔接
(三)OGG版本选择
(四)无主键表处理
(五)OGG安全规则
(六)数据抽取方式
5、OGG参考资料
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版本 | OGG 12.2.0.2.2 For Oracle | OGG 12.2.0.2.2 For MySQL |
数据库版本 | Oracle 11.2.0.4 | MySQL 5.7.21 |
OGG_HOME | /home/oracle/ogg | /opt/ogg |
IP地址 | 17X.1X.84.124 | 17X.1X.84.121 |
数据库 | cms | cms |
(二)表结构迁移
表结构迁移属于难度不高但内容比较繁琐的一步,咱们在迁移表结构时使用了一个叫sqlines的开源工具,对于sqlines工具在MySQL端建立失败及不符合预期的表结构再进行特殊处理,以此来提升表结构转换的效率。
注意:OGG在Oracle迁移MySQL的场景下不支持DDL语句同步,所以表结构迁移完成后到数据库切换前尽可能不要再修改表结构。
(三)数据迁移
数据同步的操做均采用OGG工具进行,考虑数据全量和增量的衔接,OGG须要先将增量同步的抽取进程启动,抓取数据库的redo log,待全量抽取结束后开启增量数据回放,应用全量和增量这段期间产生的日志数据,OGG可基于参数配置进行重复数据处理,因此使用OGG时优先将增量进行配置并启用。此外,为了不本章节篇幅过长,OGG参数将再也不解释,有须要的朋友能够查看官方提供的Reference文档查询任何你不理解的参数。
1.源端OGG配置
(1)Oracle数据库配置
针对Oracle数据库,OGG须要数据库开启归档模式及增长辅助补充日志、强制记录日志等来保障OGG可抓取到完整的日志信息
查看当前环境是否知足要求,输出结果以下图所示:
SQL> SELECT NAME,LOG_MODE,OPEN_MODE,PLATFORM_NAME,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
若是条件不知足则实行该部分,
#### 开启归档(开启归档须要重启数据库) SQL> shutdown immediate; SQL> startup mount; SQL> alter database archivelog; SQL> alter database open; SQL> archive log list; #### 开启附加日志和强制日志 SQL> alter database add supplemental log data; SQL> alter database force logging; SQL> alter system switch logfile; #### 启用OGG支持 SQL> show parameter enable_goldengate_replication SQL> alter system set enable_goldengate_replication=true; #### 再次查看当前环境是否知足要求 SQL> SELECT NAME,LOG_MODE,OPEN_MODE,PLATFORM_NAME,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
(2)Oracle数据库OGG用户建立
OGG须要有一个用户有权限对数据库的相关对象作操做,如下为涉及的权限,该示例将建立一个用户名和密码均为ogg的Oracle数据库用户并授予如下权限
#### 查看当前数据库已存在的表空间,可以使用已有表空间或新建单独的表空间 SQL> SELECT TABLESPACE_NAME, CONTENTS FROM DBA_TABLESPACES; #### 查看当前表空间文件数据目录 SQL> SELECT NAME FROM V$DATAFILE; #### 建立一个新的OGG用户的表空间 SQL> CREATE TABLESPACE OGG_DATA DATAFILE '/u01/app/oracle/oradata/cms/ogg_data01.dbf' SIZE 2G; #### 建立ogg用户且指定对应表空间并受权 SQL> CREATE USER ogg IDENTIFIED BY ogg DEFAULT TABLESPACE OGG_DATA; SQL> grant connect,resource,unlimited tablespace to ogg; SQL> grant create session,alter session to ogg; SQL> grant execute on utl_file to ogg; SQL> grant select any dictionary, select any table to ogg; SQL> grant alter any table to ogg; SQL> grant flashback any table to ogg; SQL> grant select any transaction to ogg; SQL> grant sysdba to ogg; SQL> grant execute on dbms_streams_adm to ogg; SQL> grant execute on dbms_flashback to ogg; SQL> exec dbms_goldengate_auth.grant_admin_privilege('OGG');
(3)源端OGG 管理进程(MGR)配置
#### 切换至ogg软件目录并执行ggsci进入命令行终端 shell> cd $OGG_HOME shell> ggsci #### 编辑/建立mgr配置文件 ggsci> edit params mgr PORT 7809 DYNAMICPORTLIST 8000-8050 -- AUTOSTART extract -- AUTORESTART extract,retries 4,waitminutes 4 STARTUPVALIDATIONDELAY 5 ACCESSRULE, PROG *, IPADDR 17X.1X.*, ALLOW ACCESSRULE, PROG SERVER, ALLOW PURGEOLDEXTRACTS /home/oracle/ogg/dirdat/*, USECHECKPOINTS,MINKEEPFILES 3 #### 启动并查看mgr状态 ggsci> start mgr ggsci> info all ggsci> view report mgr
(4)源端OGG 表级补全日志(trandata)配置
表级补全日志须要在最小补全日志打开的状况下才起做用,以前只在数据库级开启了最小补全日志(alter database add supplemental log data;),redolog记录的信息还不够全面,必须再使用add trandata开启表级的补全日志以得到必要的信息。
#### 切换至ogg软件目录并执行ggsci进入命令行终端 shell> cd $OGG_HOME shell> ggsci #### 使用ogg用户登陆appdb实例(TNS配置)对cms全部表增长表级补全日志 ggsci> dblogin userid ogg@appdb,password ogg ggsci> add trandata cms.*
(5)源端OGG 抽取进程(extract)配置
Extract进程运行在数据库源端,负责从源端数据表或日志中捕获数据。Extract进程利用其内在的checkpoint机制,周期性地检查并记录其读写的位置,一般是写入到本地的trail文件。这种机制是为了保证若是Extract进程终止或者操做系统宕机,咱们重启Extract进程后,GoldenGate可以恢复到之前的状态,从上一个断点处继续往下运行,而不会有任何数据损失。
#### 切换至ogg软件目录并执行ggsci进入命令行终端 shell> cd $OGG_HOME shell> ggsci #### 建立一个新的增量抽取进程,从redo日志中抽取数据 ggsci> add extract e_cms,tranlog,begin now #### 建立一个抽取进程抽取的数据保存路径并与新建的抽取进程进行关联 ggsci> add exttrail /home/oracle/ogg/dirdat/ms,extract e_cms,megabytes 1024 #### 建立抽取进程配置文件 ggsci> edit params e_cms extract e_cms setenv (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8") setenv (ORACLE_HOME = "/data/oracle/11.2/db_1") setenv (ORCLE_SID = "cms") userid ogg@appdb,password ogg discardfile /home/oracle/ogg/dirrpt/e_cms.dsc,append,megabytes 1024 exttrail /home/oracle/ogg/dirdat/ms statoptions reportfetch reportcount every 1 minutes,rate warnlongtrans 1H,checkinterval 5m table cms.*; #### 启动源端抽取进程 ggsci> start e_cms ggsci> info all ggsci> view report e_cms
(6)源端OGG 传输进程(pump)配置
pump进程运行在数据库源端,其做用很是简单。若是源端的Extract抽取进程使用了本地trail文件,那么pump进程就会把trail文件以数据块的形式经过TCP/IP协议发送到目标端,Pump进程本质上是Extract进程的一种特殊形式,若是不使用trail文件,那么Extract进程在抽取完数据后,直接投递到目标端。
补充:pump进程启动时须要与目标端的mgr进程进行链接,因此须要优先将目标端的mgr提早配置好,不然会报错链接被拒绝,没法传输抽取的日志文件到目标端对应目录下
#### 切换至ogg软件目录并执行ggsci进入命令行终端 shell> cd $OGG_HOME shell> ggsci #### 增长一个传输进程与抽取进程抽取的文件进行关联 shell> add extract p_cms,exttrailsource /home/oracle/ogg/dirdat/ms #### 增长配置将抽取进程抽取的文件数据传输到远程对应目录下 #### 注意rmttrail参数指定的是目标端的存放目录,须要目标端存在该目录路径 shell> add rmttrail /opt/ogg/dirdat/ms,extract p_cms #### 建立传输进程配置文件 shell>edit params p_cms extract p_cms setenv (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8") setenv (ORACLE_HOME = "/data/oracle/11.2/db_1") setenv (ORCLE_SID = "cms") userid ogg@appdb,password ogg RMTHOST 17X.1X.84.121,MGRPORT 7809 RMTTRAIL /opt/ogg/dirdat/ms discardfile /home/oracle/ogg/dirrpt/p_cms.dsc,append,megabytes 1024 table cms.*; #### 启动源端抽取进程 #### 启动前确保目标端mgr进程已开启 ggsci> start p_cms ggsci> info all ggsci> view report p_cms
(7)源端OGG 异构mapping文件(defgen)生成
该文件记录了源库须要复制的表的表结构定义信息,在源库生成该文件后须要拷贝到目标库的dirdef目录,当目标库的replica进程将传输过来的数据apply到目标库时须要读写该文件,同构的数据库不须要进行该操做。
#### 建立mapping文件配置 shell> cd $OGG_HOME shell> vim ./dirprm/mapping_cms.prm defsfile ./dirdef/cms.def,purge userid ogg@appdb,password ogg table cms.*; #### 基于配置生成cms库的mapping文件 #### 默认生成的文件保存在$OGG_HOME目录的dirdef目录下 shell> ./defgen paramfile ./dirprm/mapping_cms.prm #### 将该文件拷贝至目标端对应的目录 shell> scp ./dirdef/cms.def root@17X.1X.84.121:/opt/ogg/dirdef
至此源端环境配置完成
2.目标端OGG配置
(1)目标端MySQL数据库配置
确认MySQL端表结构已经存在
MySQL数据库OGG用户建立
mysql> create user 'ogg'@'%' identified by 'ogg'; mysql> grant all on *.* to 'ogg'@'%'; #### 提早建立好ogg存放checkpoint表的数据库 mysql> create database ogg;
(2)目标端OGG 管理进程(MGR)配置
目标端的MGR进程和源端配置同样,可直接将源端配置方式在目标端重复执行一次便可,该部分不在赘述
(3)目标端OGG 检查点日志表(checkpoint)配置
checkpoint表用来保障一个事务执行完成后,在MySQL数据库从有一张表记录当前的日志回放点,与MySQL复制记录binlog的GTID或position点相似。
#### 切换至ogg软件目录并执行ggsci进入命令行终端 shell> cd $OGG_HOME shell> ggsci ggsci> edit param ./GLOBALS checkpointtable ogg.ggs_checkpoint ggsci> dblogin sourcedb ogg@17X.1X.84.121:3306 userid ogg ggsci> add checkpointtable ogg.ggs_checkpoint
(4)目标端OGG 回放线程(replicat)配置
Replicat进程运行在目标端,是数据投递的最后一站,负责读取目标端Trail文件中的内容,并将解析其解析为DML语句,而后应用到目标数据库中。
#### 切换至ogg软件目录并执行ggsci进入命令行终端 shell> cd $OGG_HOME shell> ggsci #### 添加一个回放线程并与源端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 targetdb cms@17X.1X.84.121:3306,userid ogg,password ogg sourcedefs /opt/ogg/dirdef/cms.def discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024 HANDLECOLLISIONS MAP cms.*,target cms.*;
注意:replicat进程只需配置完成,无需启动,待全量抽取完成后再启动。
至此源端环境配置完成
待全量数据抽取完毕后启动目标端回放进程便可完成数据准实时同步。
3.全量同步配置
全量数据同步为一次性操做,当OGG软件部署完成及增量抽取进程配置并启动后,可配置1个特殊的extract进程从表中抽取数据,将抽取的数据保存到目标端生成文件,目标端同时启动一个单次运行的replicat回放进程将数据解析并回放至目标数据库中。
(1)源端OGG 全量抽取进程(extract)配置
#### 切换至ogg软件目录并执行ggsci进入命令行终端 shell> cd $OGG_HOME shell> ggsci #### 增长/编辑全量抽取进程配置文件 #### 其中RMTFILE指定抽取的数据直接传送到远端对应目录下 #### 注意:RMTFILE参数指定的文件只支持2位字符,若是超过replicat则没法识别 ggsci> edit params ei_cms SOURCEISTABLE SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8") SETENV (ORACLE_SID=cms) SETENV (ORACLE_HOME=/data/oracle/11.2/db_1) USERID ogg@appdb,PASSWORD ogg RMTHOST 17X.1X.84.121,MGRPORT 7809 RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge TABLE cms.*; #### 启动并查看抽取进程正常 shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt & ## 查看日志是否正常进行全量抽取 shell> tail -f ./dirrpt/ei_cms.rpt
(2)目标端OGG 全量回放进程(replicat)配置
#### 切换至ogg软件目录并执行ggsci进入命令行终端 shell> cd $OGG_HOME shell> ggsci ggsci> edit params ri_cms SPECIALRUN END RUNTIME TARGETDB cms@17X.1X.84.121:3306,USERID ogg,PASSWORD ogg 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
数据校验是数据迁移过程当中必不可少的环节,本章节提供给几个数据校验的思路共你们参数,校验方式能够由如下几个角度去实现:
1.经过OGG日志查看全量、增量过程当中discards记录是否为0来判断是否丢失数据;
2.经过对源端、目标端的表执行count判断数据量是否一致;
3.编写相似于pt-table-checksum校验原理的程序,实现行级别一致性校验,这种方式优缺点特别明显,优势是可以彻底准确对数据内容进行校验,缺点是须要遍历每一行数据,校验成本较高;
4.相对折中的数据校验方式是经过业务角度,提早编写好数十个返回结果较快的SQL,从业务角度抽样校验。
本章节将讲述迁移过程当中碰到的一些问题及相应的解决方式。
(一)MySQL限制
在Oracle到MySQL的表结构迁移过程当中主要碰到如下两个限制:
1. Oracle端的表结构由于最初设计不严谨,存在大量的列使用varchar(4000)数据类型,致使迁移到MySQL后超出行限制,表结构没法建立。因为MySQL自己数据结构的限制,一个16K的数据页最少要存储两行数据,所以单行数据不能超过65,535 bytes,所以针对这种状况有两种解决方式:
根据实际存储数据的长度,对超长的varchar列进行收缩;
对于没法收缩的列转换数据类型为text,但这在使用过程当中可能致使一些性能问题;
2. 与第一点相似,在Innodb存储引擎中,索引前缀长度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且开启innodblargeprefix的场景下,这个限制是3072 bytes,即便用utf8mb4字符集时,最多只能对varchar(768)的列建立索引;
3. 使用ogg全量初始化同步时,若存在外键约束,批量导入时因为各表的插入顺序不惟一,可能子表先插入数据而主表还未插入,致使报错子表依赖的记录不存在,所以建议数据迁移阶段禁用主外键约束,待迁移结束后再打开。
mysql>set global foreign_key_checks=off;
(二)全量与增量衔接
HANDLECOLLISIONS参数是实现OGG全量数据与增量数据衔接的关键,其实现原理是在全量抽取前先开启增量抽取进程,抓去全量应用期间产生的redo log,当全量应用完成后,开启增量回放进程,应用全量期间的增量数据。使用该参数后增量回放DML语句时主要有如下场景及处理逻辑:
目标端不存在delete语句的记录,忽略该问题并不记录到discardfile
目标端丢失update记录
- 更新的是主键值,update转换成insert
- 更新的键值是非主键,忽略该问题并不记录到discardfile
目标端重复insert已存在的主键值,这将被replicat进程转换为UPDATE现有主键值的行
(三)OGG版本选择
在OGG版本选择上咱们也根据用户的场景屡次更换了OGG版本,最初由于客户的Oracle 数据库版本为11.2.0.4,所以咱们在选择OGG版本时优先选择使用了11版本,可是使用过程当中发现,每次数据抽取生成的trail文件达到2G左右时,OGG报错链接中断,查看RMTFILE参数详细说明了解到trail文件默认限制为2G,后来咱们替换OGG版本为12.3,使用MAXFILES参数控制生成多个指定大小的trail文件,回放时Replicat进程也能自动轮转读取Trail文件,最终解决该问题。可是若是不幸Oracle环境使用了Linux 5版本的系统,那么你的OGG须要再降一个小版本,最高只能使用OGG 12.2。
(四)无主键表处理
在迁移过程当中还碰到一个比较难搞的问题就是当前Oracle端存在大量表没有主键。在MySQL中的表没有主键这几乎是不被容许的,由于很容易致使性能问题和主从延迟。同时在OGG迁移过程当中表没有主键也会产生一些隐患,好比对于没有主键的表,OGG默认是将这个一行数据中全部的列拼凑起来做为惟一键,但实际仍是可能存在重复数据致使数据同步异常,Oracle官方对此也提供了一个解决方案,经过对无主键表添加GUID列来做为行惟一标示,具体操做方式能够搜索MOS文档ID 1271578.1进行查看。
(五)OGG安全规则
2019-03-08 06:15:22 ERROR OGG-01201 Error reported by MGR : Access denied.
错误信息含义源端报错表示为该抽取进程须要和目标端的mgr进程通信,可是被拒绝,具体操做为:源端的extract进程须要与目标端mgr进行沟通,远程将目标的replicat进行启动,因为安全性如今而被拒绝链接。
在Oracle OGG 11版本后,增长了新特性安全性要求,若是须要远程启动目标端的replicat进程,须要在mgr节点增长访问控制参数容许远程调用
在源端和目标端的mgr节点上分别增长访问控制规则并重启
## 表示该mgr节点容许(ALLOW)10.186网段(IPADDR)的全部类型程序(PROG *)进行链接访问 ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW
(六)数据抽取方式
2019-03-15 14:49:04 ERROR OGG-01192 Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').
根据官方文档说明,当前直接经过Oracle数据库抽取数据写到MySQL这种initial-load方式,不支持LOBs数据类型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 则包含了CLOB字段,没法进行传输,而且该方式不支持超过4k的字段数据类型
将抽取进程中的RMTTASK改成RMTFILE参数 官方建议将数据先抽取成文件,再基于文件数据解析进行初始化导入
阅读OGG官方文档,查看support.oracle.com上Oracle官方给予的问题解决方案是学习OGG很是有效的方式,做者这里也打包了一些文档供你们下载查看,其中我的感受比较重要而且查看比较多的文档包括: How to Replicate Data Between Oracle and MySQL Database? (文档 ID 1605674.1).pdf 这个文档的做用至关于OGG快速开始,可以帮助用户快速的配置并跑通OGG全量、增量数据同步的流程,很是适合初学者上手 Administering Oracle GoldenGate for Windows and UNIX.pdf Administering文档内容较多,其中详细介绍了各类OGG的使用配置场景,你们能够根据本身须要选择重点章节浏览 Reference for Oracle GoldenGate for Windows and UNIX.pdf Reference文档算是我查看最多的一个文档,其中包含了OGG全部参数的描述、语法及使用示例,很是的详细,这也是前面未对参数进行展开讲解的缘由。
文档资料百度网盘下载连接: