背景:
因工作需要,最近对Oracle到MySQL的迁移方式进行了一些研究,现发布出来,供大家参考。
MySQL Migration Toolkit
•进入界面
•选择配置类型
•配置源数据库信息
•配置目标库信息
•连接源库,并获取元数据信息,并测试目标库信息
•选择源库SCHEMA
• 获取迁移选项
•选择迁移对象
-- 如果需要并行迁移,则需要在此处进行对象区分
•配置迁移选项
•
SCHEMA属性 可以选择字符集,需要注意的是默认为latin1,该字符集不支持中文。
选择MulitLanguage后,字符集会变成UTF8,但是MySQL中UTF8字符集是伪UTF8,应使用UTF8MB4字符集,但是此处不可选,即使手工将字符集填写为UTF8MB4,迁移后的目标库字符集仍为UTF8MB4
•
表相关属性
该项参数涉及到目标库存储引擎,以及字符集,注意第二个选项,默认存储引擎为MyISAM
•
代码相关属性,主要是指包,过程,函数等对象
•生成对象创建语句
•对象对比视图
点击单个对象,可查看对象结构明细
对于Oracle中独有的rowid数据类型,会进行特殊标记,并转换为VARCHAR(255)
如需指定字符集为UTF8MB4需在此处进行手工修改,且要进行逐表修改
下图做了一个对比,发现没有手工修改字符集的表,其字符集为UTF8
同时需要注意,默认是删表重建,如想保留表,则需要对脚本进行修改
删除DROP语句,修改create table语句
在迁移前插入测试数据
迁移后数据仍在
select * from dept ;--------+------------+----------+| deptno | dname | loc |+--------+------------+----------+| 50 | aa | ccc || 10 | ACCOUNTING | NEW YORK || 20 | RESEARCH | DALLAS || 30 | SALES | CHICAGO || 40 | OPERATIONS | BOSTON |+--------+------------+----------+5 rows in set (0.00 sec)
•在目标库建立对象
•迁移数据
•查看迁移报告
附 更改目标库名称
使用Navicat Premium 迁移
•建立数据库连接
•选择字符集
•进行数据传输
•选择源库与目标库
•选择表
•进行传输
使用Kettle进行迁移
启动Kettle新建作业并配置数据库连接
运行多表复制向导
指定源库与目标库
指定源库与目标库
Kettle会自动创建转换作业,在此指定转换存储位置
执行转换
注意:
执行的过程非常的坎坷,遇到两个问题:
1 建表语句存在关键字引起的建表失败,需要手工调整建表语句,进行特殊处理。
2 数据类型转换不理想,需要手工调整。
对比
标准 | Mysql Migration Tools | Navicat Premuim | Kettle |
是否收费 | 否 | 是 | 否 |
支持的版本 | Oracle 11.2 | 无限制 | 无限制 |
适用平台 | WINDOWS | WINDOWS | WINDOWS ,LINUNX |
是否支持并行 | 不支持单机并行 | 不支持单机并行 | 支持单机并行、支持集群操作 |
是否支持自定义字符集 | 是 逐表修改 | 否 | 是 |
是否支持自定义列类型 | 是 主表修改或提前建表 | 否 | 是 |
是否支持提前建表 | 是 | 否 | 是 |
是否支持选取部分表 | 是 | 是 | 是 |
是否支持垂直分库 | 是 | 是 | 是 |
是否支持水平分库 | 否 | 否 | 是 |
是否有迁移日志 | 是 | 是 | 是 |
是否带有索引 | 是 | 是 | 否 |
是否支持字符串换行 | 是 | 是 | 是 |
是否支持BLOB类型迁移 | 否(仅部分成功且不抱错) | 是 | 是 |
Oracle数据类型 | Mysql Migration Tools | Navicat Premuim | Kettle |
NUMBER | decimal(22,0) | decimal(65,30) | double |
NUMBER(10,4) | decimal(10,4) | decimal(10,4) | double |
VARCHAR2(200) | varchar(200) | varchar(200) | varchar(200) |
CHAR(10) | char(10) | char(10) | varchar(10) |
CHAR(2000) | varchar(2000) | text | text |
DATE | datetime | datetime | datetime |
TIMESTAMP(6) | datetime | datetime | datetime |
LONG | longtext | longtext | tinytext |
RAW | mediumblob | longblob | text |
BLOB | longblob | longblob | longblob |
CLOB | longtext | longtext | mediumtext |
ROWID | varchar(255) | 不支持,报错中断 | tinytext |
总结:对比下来,Kettle更加灵活可靠,但由于是通用ETL工具,部分内容较为粗放,需要手工配置的地方更多。受时间限制,部分功能尚待挖掘,如参数化、并行、集群等。