ORACLE数据迁移到MYSQL解决乱码方法

ORACLE数据迁移到MySQL时,常见乱码可以通过以下步骤解决。
首先通过SQL语句提取数据,保证迁移过程中字符集的一致。
具体步骤如下:1、使用SQL查询参数确认当前数据库的字符集设置:SELECT*FROMnls_database_parametersWHEREparameterIN('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');2.检查MySQL变量的当前字符集信息:SHOWVARIABLESLIKE'character_set_%';3.调整MySQL数据库字符调整设置以满足您的迁移需求:ALTERDATABASEmydbCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;4、将提取的数据导出到CSV文件,使用iconv命令设转换编码为:iconv-fGBK-tutf-8-odata_utf8.csvdata.csv,其中GBK代表源编码(ORACLE编码),utf。
-8代表目标编码(MySQL编码),-o代表输出文件名。
5、最后使用LOADDATAINFILE命令将转换后的数据导入MySQL数据库:LOADDATAINFILE'data_utf8.csv'INTOTABLEmytableCHARACTERSETutf8mb4FIELDSTERMINATEDBY','ENCLOSEDBY'"'LINESTERMINATEDBY'n';其中data_utf8.csv代表数据文件的名称转换为UTF编码-8,mytable代表需要导入的MySQL数据库中的表名,utf8mb4代表迁移过程中使用的字符集当你不是通过文件传输数据,而是直接使用Python程序通过SQL语句传输数据时,乱码问题可能与字符集设置不正确有关通过SQL语句保持源数据库和目标数据库MySQL数据库字符设置信息:1、查询MySQL当前字符集设置:SELECT*FROMNLS_DATABASE_PARAMETERS2.或者使用更通用的查询命令来检查所有变量的字符集信息:SHOWVARIABLESLIKE'character_set_%'或SHOWVARIABLESLIKE'collat​​ion%';

oracle数据库中的表如何能够导入到mysql中?

OGG(OracleGoldenGate的正式名称)是Oracle官方提供的一款商业工具,用于解决异构数据环境下的数据复制。
OGG相对于其他迁移工具的优势在于,它可以直接解析源Oracle的重做日志,让您无需对原始表结构做太多调整,即可完成增量部分数据的迁移。
本篇文章我们将重点介绍如何使用OGG实现Oracle到MySQL数据的平滑迁移以及个人在迁移过程中遇到的问题的解决方案。

(一)OGG逻辑架构

为了方便大家理解,OGG逻辑架构可以参考上图进行简化介绍一下。

关于OGG数据同步流程,下一章详细介绍如何配置相关流程。
下面的过程主要涉及到OGG的使用。
和文件:

管理器进程:源终端和目标终端必须同时运行。
其主要功能是监视和管理其他进程、报告错误、分配和清理数据存储空间以及发布阈值。
报表等

提取过程:运行在数据库源端,主要用于捕获数据变化。
负责提取完整数据和增量数据

Trails文件:临时存储在磁盘上的数据文件

DataPump进程:运行在数据库的源端,是Extract进程的一部分辅助进程,如果没有配置DataPump,而配置了ExtraDataPump,则ct进程将提取的数据直接发送到目标端的Trail文件,并通过DataPump进程发送到目标端。
配置DataPump进程的好处是,即使从源到目标的网络中断,提取过程也不会终止。

收集器进程:接收从源发送的数据更改并将其写入本地跟踪文件。

Replicat进程:读取trail文件中记录的编号。
根据变化,创建相应的DML语句并在目标端重放它们。

二、迁移规划

(一)环境信息

OGG版本OGG12.2.0.2.2ForOracleOGG12.2.0.2.2ForMySQL

数据库版本Oracle11.2.0.4MySQL5.7.21

OGG_HOME/home/oracle/ogg/opt/ogg

(2)表结构迁移

表结构迁移并不困难,但是过程比较繁琐。
如果sqllines工具不能或不兼容在MySQL端创建表结构,请使用名为sqllines的开源工具。
不出所料,我们再次进行特殊处理,以提高表结构转换的效率。

注意:Oracle到MySQL迁移场景下,OGG不支持DDL语句同步,因此表结构迁移完成后、数据库切换前请勿更改表结构。

(3)数据迁移

所有的数据同步操作都是使用OGG工具进行的,并且考虑到全量数据和增量数据的关系,OGG我们需要启动该流程。
首先数据库重做通过检索日志,在全量提取完成后启动增量数据重放,并应用全量和增量期间生成的日志数据,OGG允许您根据参数设置重复重放数据。
OGG优先考虑增量配置和启用。
另外,为了避免冗长本章,我们将不再进一步讨论OGG参数。
如有不明白的参数,可参考官方参考文档进行查询。

1.源端OGG配置

(1)Oracle数据库配置

对于Oracle数据库,OGG以归档方式打开数据库,添加辅助必须的。
补充日志和必需日志,保证OGG获取完整的日志信息等信息

请验证您当前的环境是否满足您的要求。
输出结果如下。

(2)创建Oracle数据库OGG用户

OGG必须执行以下步骤:用户的权限是在数据库中的相关对象上行使的。
此示例需要以下权限:使用用户名和密码ogg创建Oracle数据库用户并授予以下权限:

(3)源端OGG管理进程(MGR)配置

(4)源端OGG表级补全日志(trandata)配置

表级完成完整日志记录仅在最小完成日志记录打开时才起作用。
此前,最小完成日志记录(alterdatabaseaddsupplementallogdata;)仅在数据库级别启用,因此redolog记录的信息不够全面,必须再次使用ad。
dtrandata允许您使用表级完成日志记录来获取所需的信息。

(5)源端OGG提取进程(extraction)配置

提取进程运行在数据库源端,负责从数据库源端的数据中抓取数据马苏。
表或日志。
Extract进程使用独特的检查点机制定期检查并记录其读写位置,这些位置通常写入本地trail文件。
这种机制确保了如果Extract进程终止或者操作系统崩溃,重新启动Extract进程后,GoldenGate可以返回到之前的状态并从之前的断点继续执行,而不会丢失数据。

(6)配置源端OGG传输进程(pump)

pump进程运行在数据库源端,功能非常简单。
如果源Extract提取进程使用本地trail文件,则pump进程将trail文件通过TCP/IP协议以数据块的形式发送到目标。
泵过程本质上是提取过程的一种特殊形式。
如果不使用跟踪文件,提取过程将提取数据,然后将数据直接传送到目标。

补充:Pump进程在启动时必须连接到目标mgr进程,因此必须提前配置目标mgr进程。
否则会报告错误信息。
连接被拒绝,提取的日志文件无法传输到目标目录。

(7)生成源OGG异构映射文件(def.gen)

该文件记录了源库需要复制的表的表结构定义信息。
源库生成文件后,需要将其复制到目标库的dirdef目录中。
当目标库副本进程传输时,在目标数据库中使用传入数据时必须读取和写入此文件。
对于同构数据库不需要此操作。

2.目标端OGG配置

(1)目标端MySQL数据库配置

确保MySQL端表结构已存在马苏。

创建MySQL数据库OGG用户

createuser'ogg'@'%'identifiedby'ogg';

grantallon*.*to'ogg'@'%';

####创建ogg存储检查点表高级数据库

crEateddatabaseogg;

(2)配置目标端OGG管理进程(MGR)

目标端MGR进程与源端配置相同。
配置方法可以直接在目标端重复。
仅运行一次,这部分不会重复。

(3)配置目标OGG检查点日志表(Checkpoint)

检查点表存储事务完成后当前日志重放点和MySQL复制记录。
要记录的表存在于MySQL数据库中。
GTID或Binlog位置。

####切换到ogg软件目录,运行ggsci进入命令行终端。

cd$OGG_HOME

ggsci

editparam./GLOBALS

checkpointtableogg.ggs_checkpoint

dbloginsourcedbogg@17X.1X.84.121:3306useridogg

addcheckpointtableogg.ggs_checkpoint

(4)目标端OGG重播线程(replicat)配置

Replicat进程结束是数据传递的最后一个停止点,读取目标Trail文件的内容,解析成DML语句,它负责向数据库申请。

####切换到ogg软件目录,运行ggsci进入命令行终端。

cd$OGG_HOME

ggsci

####添加播放线程,并将其与源泵进程传输来的trail文件关联起来,使用检查点表来确保数据得到保留。
没有丢失

addreplicatr_cms,exttrail/opt/ogg/dirdat/ms,checkpointtableogg.ggs_checkpoint

####添加/编辑重播进程配置文件

editparamsr_cms

replicatr_cms

targetdbcms@17X.1X.84.121:3306,useridogg,passwordogg

sourcedefs/opt/ogg/dirdef/cms.def

放弃文件/opt/ogg/dirrpt/r_cms.dsc,append,megabytes1024

HANDLECOLLISIONS

MAPcms.*,targetcms.*;

注意:仅为副本配置进程已完成,因此在完全提取完成之前无需启动它。

至此,源码环境配置完成。

所有数据提取完成后,目标重放过程开始,完成数据的近实时同步。

3.配置完全同步

完全数据同步是OGG软件部署完成并且增量提取过程配置并启动后的一次性事件。

<这就是操作。
特殊的提取过程从表中提取数据,并将提取的数据保存在目标端生成文件。
目标端还启动单次运行、复制的重播过程,解析数据并将其重播到目标数据库。

(1)源端OGG完整提取流程(提取)配置

####切换到ogg软件目录,运行ggsci进入命令行终端。

cd$OGG_HOME

ggsci

####添加/编辑完整的提取过程配置文件

####RMTFILE指定提取数据直接传输到远程对应目录。

####注:RMTFILE参数指定的文件为2仅支持字符。
如果超过重复,则无法识别。

editparamsei_cms

SOURCEISTABLE

SETENV(N)LS_LANG="AMERICAN_AMERICA.AL32UTF8")

SETENV(ORACLE_SID=cms)

SETENV(ORACLE_HOME=/data/oracle/11.2/db_1)

USERIDogg@appdb,PASSWORDogg

RMTHOST17X.1X.84.121,MGRPORT7809

RMTFILE/opt/ogg/dirdat/ms,maxfiles100,megabytes1024,purge

TABLEcms.*;

####启动提取过程并验证是否成功

TABLEcms.*;

####启动提取过程并验证是否成功。

TABLEcms.*;

####启动并验证提取过程是否成功

nohup./extractparamfile./dircprm/ei_cms.prmreportfile./dirrpt/ei_cms.rpt&

##查看日志是否完全提取成功

tail-f./dirrpt/ei_cms.rpt

(2)目标OGG完整重放过程(replicat)设置

####切换到ogg进入软件目录,运行ggsci进入命令行终端。

cd$OGG_HOME

ggsci

editparamsri_cms

特别运行

ENDRUNTIME

TARGETDBcms@17X.1X.84.121:3306,USERIDogg,PASSWORDogg

EXTFILE/opt/ogg/dirdat/ms

DISCARDFILE./dirrpt/ri_cms.dsc,purge

MAPcms.*,TARGETcms.*;

####启动并验证播放过程是否成功。

nohup./replicatparamfile./dirprm/ri_cms.prmreportfile./dirrpt/ri_cms。
rpt&

####检查日志是否正常并运行完整重放。

tail-f./dirrpt/ri_cms.rpt

3.数据验证

数据验证表示数据已经迁移了,本章介绍一些数据验证的想法和参数。
验证方法可以从以下几个角度实施:

1.通过OGG日志查看完整数据和增量数据,检查过程中是否有记录被丢弃。
0判断数据是否丢失。

2、对源表和目标表进行统计,判断数据量是否一致。

3.pt表校验和创建并实现类似于验证原理的程序。
这种方法的优点和缺点对于级别一致性检查尤为明显,优点是可以完整、准确地验证数据的内容,但缺点是必须对每一行数据进行检查,并进行验证。
成本是昂贵的。

4.相对危险的数据。
验证方法预先编写了几十条SQL语句,可以快速返回结果,并从业务角度进行采样验证。

4.处理迁移问题

本章介绍迁移过程中出现的一些问题以及相应的解决方案。

(1)MySQL的限制

在将表结构从Oracle迁移到MySQL的过程中,主要遇到以下两个限制:

1.表结构Oracle端由于初始设计不够严格,有很多列使用了varchar(4000)数据类型,迁移到MySQL后,表结构超出了行数限制。
无法再创建。
由于MySQL自身数据结构的限制,一个16K的数据页必须至少存储两行数据,因此一行数据不能超过65535字节。
因此,针对这种情况有两种解决方案。

根据存储数据的实际长度,对于很长的varchas,r列将被缩小。

对于无法折叠的列,将数据类型转换为文本,这可能会导致使用过程中出现性能问题。

2.与第一点类似。
,在Innodb存储引擎中,使用D时,索引前缀长度限制为767字节。
对于YNAMIC、COMPRESSED行格式和innodblargeprefix有效的场景,此限制为3072字节,即使使用utf8mb4字符集也是如此。
您最多可以对varchar(768)列建立索引。

3.如果使用ogg完全初始化同步,批量导入时如果存在外键约束,则每个表的插入顺序不唯一,因此数据可能会插入表中并且不进入主表。
由于子表不存在依赖的记录,因此建议您在数据迁移阶段禁用主键和外键约束,并在迁移完成后启用它们。

setglobalforeign_key_checks=off;

(2)全量和增量连接

HANDLECOLLISIONS参数实现OGG全量数据和增量数据的连接这是关键到。
实现原理是在全量提取之前启动增量提取过程,捕获全量应用过程中产生的redolog,当全量应用完成后,启动增量重放过程捕获全量应用过程中产生的redolog进行应用。
增量数据到.使用该参数后增量重放DML语句时的主要场景和处理逻辑是:

目标端没有删除语句的记录。
此问题将被忽略并且不会记录在丢弃文件中。

目标更新记录最后丢失

-主键值更新,更新转换为in。
sert

-更新后的键值是非主键。
忽略此问题,不要将其记录在丢弃文件中。

目标重复插入现有主键值。
具有现有主键值并通过复制过程转换为UPDATE的行

(3)OGG版本选择

OGG版本选择最初也是由于数据库版本为11.2。
0.4,我优先考虑OGG版本。
使用时我发现只要数据提取产生的trail文件达到2G左右,OGG就会报错。
连接已中断。
查看RMTFILE参数的详细说明,确保trail文件默认限制为2G。
然后我将OGG版本替换为12.3,并控制指定大小的多个trail文件的生成。
Replicat进程还可以在播放过程中自动轮流读取Trail文件,这最终将解决该问题。
但不幸的是,如果你的Oracle环境使用的是Linux5版本的系统,则需要将OGG降级到小版本,最高版本只能是OGG12.2。

(4)处理无主键的表

迁移过程中遇到的一个更棘手的问题是,目前Oracle端有很多没有主键的表。
MySQL很少允许没有主键的表,因为它们很容易出现性能问题和主/从滞后。
同时,如果表没有主键,OGG迁移过程中也存在一些隐患。
例如,对于没有主键的表,OGG默认将数据行中的所有列拼接在一起。
但是仍然可能存在重复数据导致数据同步异常,所以Oracle官方还提供了在表中添加GUID列而不使用主键作为我所在行的唯一标识的解决方案。
搜索MOS文档ID1271578.1可以找到操作说明。

(5)OGG安全规则

错误消息

2019-03-0806:15:22ERROROGG-01201ErrorreportedbyMGR:Accessdenied。

该错误信息的含义是,源端的错误表明提取进程需要与目标端的MGR进程通信,但被拒绝。
典型的操作是源端的提取过程需要做以下事情:与目标端管理器通信并远程启动目标副本。
由于安全问题连接被拒绝。

错误原因

从OracleOGG11版本开始,如果需要在目标端远程启动复制进程,必须添加访问控制参数。
连接到mgr节点以允许远程调用。

解决办法

分别在源mgr节点和目标mgr节点添加访问控制规则,然后重启。

##mgr节点连接并访问(ALLOW)10.186网段(IPADDR)ACCESSRULE,PROG*,IPADDR10.186.*.*,ALLO程序类型(PROG*)W

(6)数据提取方法

错误消息

2019-03-1514:49:04ERROROGG-01192TryingtoseRMTTASONdatatypesthatmaybewriteasLOBchunks(Table:'UNIONPAYCMS.CMS_OT_CONTENT_RTF')。

错误原因

根据官方文档,目前是直接从Oracle数据库中提取数据,并使用初始值写入MySQL。
-load方法该方法不支持LOB数据类型,表UNIONPAYCMS.CMSOTCONTENT_RTF包含无法发送的CLOB字段,并且该方法不支持大于4k的字段数据类型。

解决方案

官方建议在提取过程中将RMTTASK改为RMTFILE参数是先将数据提取到文件中,然后根据文件数据分析进行初始化。