此项目不再更新,维护,请移步本人新项目https://github.com/iverycd/OracleSync2MySQL
💖功能特性
✨支持Linux,Windows,MacOS,Oracle 11.2.0.4及以上,MySQL 5.7,8.0及以上测试通过
✨ 支持在线迁移Oracle到MySQL的表、视图、索引、触发器、外键、自增列、以及部分触发器
✨ 不支持Oracle存储过程、函数、分区表、物化视图、虚拟列等对象迁移到MySQL
✨ 自动分析源库Oracle字段的长度并适配到MySQL合适的长度,避免MySQL字段长度太长问题 “Row size too large 65535”
✨ 自动处理Oracle触发器+序列形式的自增列适配到MySQL原生自增列
✨ 转储Oracle的函数、存储过程到平面文件以便修改人工翻译适配到MySQL
✨ 后台多进程数据迁移,数据迁移更快
✨ 支持迁移部分表结构以及数据功能
✨ 支持迁移Oracle与MySQL共同存在的列数据,即目标数据库的列字段是源数据库列字段的超集
✨ 生成迁移报告,记录迁移日志,转储表、视图等DDL对象创建失败的sql语句
✨ 支持Oracle与MySQL表数量快速比对功能
Oracle迁移到MySQL主要涉及数据结构迁移、数据迁移、业务迁移这三类,一般来说按照如下步骤操作即可:
-
使用本迁移工具迁移表结构以及数据行(参见本文
发布包
章节) -
比对Oracle、MySQL全表数据行数
-
手动处理工具无法完成的数据库对象,比如说MySQL不支持的字段类型、表长度过长、关键字、默认值、虚拟列等对象
-
业务迁移中由于MySQL不支持并行、不支持物化视图,会涉及到存储过程以及函数改造,同义词改造,DBlink、sequence、分区表以及视图复杂sql语句的改造
⭐环境要求
-
运行此工具的PC需要能连通源端Oracle以及目标MySQL数据库
-
依赖oracle客户端环境(release已集成instant client)
📷平台测试
硬件平台:
CPU | 内存 | 硬盘 | 数据库信息 |
---|---|---|---|
Intel i7-12700 2.10 GHz(12核20线程) | 芝奇皇家戟 DDR4 3600 32G | 西数SN850 | Oracle 19c,MySQL 5.7.24 |
SN850磁盘iops性能:
随机读 | 108816.88 |
---|---|
随机写 | 94763.05 |
顺序读 | 111201.16 |
顺序写 | 22127.80 |
块大小 | 8K |
源端表结构
CREATE TABLE TEST
(
ID NUMBER,
NAME VARCHAR2(100),
SEX VARCHAR2(100)
)
在以上测试平台迁移Oracle一张2000万的表,迁移耗时68秒
v1.9.21.1版本及以下
为单线程迁移数据,迁移Oracle一张2000万的表耗时709秒
📷运行概览
全库迁移
迁移报告
比对数据
记录迁移失败的DDL
转储索引、视图、存储过程、函数DDL
多进程并行迁移表数据
1、oracle客户端环境准备
Linux
下载Linux Instant Client(11.2.0.4及以上都行)
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
或者直接下载当前资源库文件linux_oracle_client.7z
以上解压,并设定oracle client为正确路径的环境变量,需要注意的是需要设定LANG
的环境变量为en_US.UTF-8
,否则中文可能会乱码无法正常显示
echo "export ORACLE_HOME=/opt/oracle_to_mysql/ora_client/instantclient_11_2"
echo "export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH"
echo "export PATH=$ORACLE_HOME:$PATH"
echo "export LANG=en_US.UTF-8"
MAC
下载当前资源库文件mac_oracle_client.7z
将以上目录放在程序相同目录或者自行设定oracle client为正确路径的环境变量
Win
下载Windows Instant Client(11.2.0.4及以上都行)
https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html
或者直接下载当前资源库文件win_oracle_client.7z
解压之后重命名目录名称为oracle_client
并放到代码同路径,如下(或者自行设定oracle client为正确路径的环境变量):
2、编辑config文件
以下分别填入源库和目标库的信息
config.ini
[oracle]
host = 192.168.212.23
port = 1521
user = admin
passwd = admin123
service_name = orcl
split_page_size = 10000 # 每个表分页查询的结果集总数
split_process = 16 # 并行执行分页查询的线程数
[mysql]
host = 192.168.209.24
port = 3306
user = root
passwd = Gep
database = temptest
dbchar = utf8mb4
row_batch_size = 10000 # 每次插入到目标表的行数
3、全库迁移
python oracle_mig_mysql.py
先修改脚本内oracle_client路径以及Python环境路径
Linux
打包
mkdir hooks
vi hooks/hook-prettytable.py
内容如下:
from PyInstaller.utils.hooks import collect_data_files, copy_metadata
datas = collect_data_files('prettytable') + copy_metadata('prettytable')
修改脚本为正确路径后,运行打包脚本 `sh pack.sh`
MacOS
打包
在程序所在目录运行
修改脚本为正确路径后,运行
sh mac_pack.sh
Win
修改脚本为正确路径后,运行bat脚本 pack.bat
下载release
解压之后即可运行此工具
1、解压,例如将oracle_mig_mysql.zip
上传到/opt目录
2、在root用户下解压
[root@localhost root]# cd /opt
[root@localhost root]# unzip oracle_mig_mysql.zip
1、进入迁移工具目录
[root@localhost opt]# cd /opt/oracle_to_mysql
2、运行环境变量脚本
[root@localhost ]# sh env_ora.sh && source run_env
3、编辑配置文件 config.ini文件,修改源数据库以及目标数据库信息
[root@localhost ]# vi config.ini
[oracle]
host = 192.168.212.23
port = 1521
user = admin
passwd = admin123
service_name = orcl
split_page_size = 10000 # 每个表分页查询的结果集总数
split_process = 16 # 并行执行分页查询的线程数
[mysql]
host = 192.168.209.24
port = 3306
user = root
passwd = Gep
database = temptest
dbchar = utf8mb4
row_batch_size = 10000 # 每次插入到目标表的行数
4、执行全库迁移
须知:如果是通过堡垒机或者是vpn连接的非图形化界面,建议使用后台方式运行此工具,避免数据迁移中断
后台执行命令(需要命令后面带-q):
示例:静默迁移同时使用4个进程并发迁移全表数据
[root@localhost ]# nohup ./oracle_mig_mysql -q -p 4 &
前台执行命令:(如果源库数据量很大,建议使用后台迁移,避免putty等终端工具超时自动断开)
示例:同时使用4个进程并发迁移全表数据
[root@localhost ]# ./oracle_mig_mysql -p 4
4、查看数据迁移运行过程
如果是在后台运行nohup ./oracle_mig_mysql -q -p 4 &
,可通过如下命令查看实时迁移过程
[root@localhost ]# tail -100f nohup.out
迁移已经完成
5、迁移完成后查看迁移任务日志
[root@localhost ]# cd /opt/oracle_to_mysql/mig_log/
此文件夹下面以时间戳名命的子文件夹内有如下日志需要关注:
ddl_failed_table.log
--> 创建失败的表、视图、索引、触发器等对象的DDL创建语句,此部分需要修改语法适配并重新在MySQL创建即可
insert_failed_table.log
--> 表数据插入失败的对象名称,此部分需要重新对个别表重新迁移数据
ddl_function_procedure.sql
--> Oracle导出的存储过程以及函数的定义,此部分需要修改语法适配并重新在MySQL创建即可
终端内执行即可:
Windows环境与Linux环境类似,下载压缩包之后解压到任意目录
1、编辑配置文件 config.ini文件,修改源数据库以及目标数据库信息
[oracle]
host = 192.168.212.23
port = 1521
user = admin
passwd = admin123
service_name = orcl
split_page_size = 10000 # 每个表分页查询的结果集总数
split_process = 16 # 并行执行分页查询的线程数
[mysql]
host = 192.168.209.24
port = 3306
user = root
passwd = Gep
database = temptest
dbchar = utf8mb4
row_batch_size = 10000 # 每次插入到目标表的行数
2、cmd进入迁移工具目录
在cmd命令行窗口内执行
进入工具所在目录
C:\Users\Administrator>g:
G:\>cd G:\oracle_mig_mysql
3、执行全库迁移
同时使用4个进程并发迁移全表数据
G:\oracle_mig_mysql>oracle_mig_mysql.exe -p 4
4、迁移完成后查看迁移任务日志
迁移工具目录下面会生成以时间戳名命的日志需要关注:
ddl_failed_table.log
--> 创建失败的表、视图、索引、触发器等对象的DDL创建语句,此部分需要修改语法适配并重新在MySQL创建即可
insert_failed_table.log
--> 表数据插入失败的对象名称,此部分需要重新对个别表重新迁移数据
ddl_function_procedure.sql
--> Oracle导出的存储过程以及函数的定义,此部分需要修改语法适配并重新在MySQL创建即可
oracle_compare_mysql.py,可以在数据迁移完成后快速比对Oracle以及MySQL的表数据量,检查是否有数据缺失。
以下执行后开始比对数据量
Linux:
[root@localhost ]# ./oracle_compare_mysql
Windows:
G:\oracle_mig_mysql>oracle_compare_mysql.exe
比对完之后,可以通过连接对应的MySQL数据库,查询比对结果 例如: 连接对应MySQL库之后查询
select * from DATA_COMPARE;
以下以Linux环境示例,windows环境操作方式类似
备注:使用-d命令前,需要确保mysql数据库已经创建了该表的表结构
需了解,使用-d命令,会先truncate(清空)目标表的数据再迁移数据
1、编辑custom_table.txt
文件输入要迁移数据的表名称
示例如下:
[root@localhost ]# vi custom_table.txt
Z_AD_I_SN
Z_D_SN
Z_F_SN
Z_R_SN
2、开始迁移部分表数据
Linux下执行命令:
[root@localhost ]# ./oracle_mig_mysql -d
Windows下执行命令:
G:\oracle_mig_mysql>oracle_mig_mysql.exe -d
+-----------------------------------------+
| Oracle Migrate MySQL Tool |
+-----------------------------------------+
| MySQL 5.7 and Oracle 11g higher Support |
| Powered By IVERYCD |
| Version v1.10.12.1 |
+-----------------------------------------+
Source Database information:
+----------+-------------+-----------------------------------------------------------+
| database | schema_info | connect_info |
+----------+-------------+-----------------------------------------------------------+
| Oracle | admin | ((HOST=192.168.212.23)(PORT=1521))((SERVICE_NAME=orcl))) |
+----------+-------------+-----------------------------------------------------------+
+---------------------------------------+
| migrate mode |
+---------------------------------------+
| Migration Mode:migrate partion tables |
+---------------------------------------+
table for migration:
+-----------------------+
| TABLE_NAME |
+-----------------------+
| Z_AD_I_SN |
| Z_D_SN |
| Z_F_SN |
| Z_R_SN |
+-----------------------+
Target Database Information:
+----------+-----------------+----------+-----------+----------+
| database | ip_addr | port_num | user_name | db_name |
+----------+-----------------+----------+-----------+----------+
| MySQL | 192.168.209.2 | 3306 | root | temptest |
+----------+-----------------+----------+-----------+----------+
2021-12-23 18:17:00
READY FOR MIGRATING DATABASE ?:(PLEASE INPUT "Y" OR "N" TO CONTINUE)
y --------> 这里输入Y确认是否迁移
GO
START MIGRATING ROW DATA! 2021-12-23 18:17:03.715882
[Z_AD_I_SN] 插入完成 源表行数:100 目标行数:100 THREAD 1 2021-12-23 18:17:04.077622
[Z_D_SN] 插入完成 源表行数:100 目标行数:100 THREAD 1 2021-12-23 18:17:04.361066
[Z_F_SN] 插入完成 源表行数:100 目标行数:100 THREAD 1 2021-12-23 18:17:04.639245
[Z_R_SN] 插入完成 源表行数:100 目标行数:100 THREAD 1 2021-12-23 18:17:04.900548
通过编辑custom_table.txt
文件以及配合命令参数可自定义哪些表需要迁移
💠命令示例:
1️⃣仅迁移自定义表的表结构以及数据包括索引等约束
./oracle_mig_mysql -c
2️⃣仅迁移自定义表的表数据,不包括表结构以及索引等约束
./oracle_mig_mysql -d
3️⃣仅迁移自定义表的元数据,即表结构(表定义、视图、索引、触发器自增列等约束),不迁移数据
./oracle_mig_mysql -m
注意以上-c -d -m不能同时使用,只能使用其中之一
4️⃣静默模式并同时使用4个进程并发迁移全表数据,命令后面跟-q之后无需在命令行界面键入“y”进行迁移前确认,即一键
./oracle_mig_mysql -q -p 4