首页 > 数据库 >一款DBA开发的Oracle迁移MySQL工具-oracle_mig_mysql

一款DBA开发的Oracle迁移MySQL工具-oracle_mig_mysql

时间:2022-10-14 12:03:47浏览次数:76  
标签:DBA mysql mig Oracle MySQL oracle 迁移

这是一款由业余DBA写的数据迁移工具,可在线一键迁移Oracle数据库到MySQL数据库,包含表元数据、数据行迁移、视图、部分触发器、自增列、索引约束等对象自动创建。操作简单,开箱即用,适用全平台操作系统。

(Oracle一键迁移MySQL工具oracle_mig_mysql使用)

1.简介

:sparkling_heart:功能特性

:sparkles:支持Linux,Windows,MacOS,Oracle 11.2.0.4及以上,MySQL 5.7,8.0及以上测试通过

:sparkles: 支持在线迁移Oracle到MySQL的表、视图、索引、触发器、外键、自增列、以及部分触发器,不支持存储过程以及函数的迁移

:sparkles: 自动分析源库Oracle字段的长度并适配到MySQL合适的长度,避免MySQL字段长度太长问题 “Row size too large 65535”

:sparkles: 自动处理Oracle触发器+序列形式的自增列适配到MySQL原生自增列

:sparkles: 转储Oracle的函数、存储过程到平面文件以便修改人工翻译适配到MySQL

:sparkles: 后台多进程数据迁移,数据迁移更快

:sparkles: 支持迁移部分表结构以及数据功能

:sparkles: 支持迁移Oracle与MySQL共同存在的列数据,即目标数据库的列字段是源数据库列字段的超集

:sparkles: 记录迁移日志,转储表、视图等DDL对象创建失败的sql语句

:sparkles: 支持Oracle与MySQL表数量快速比对功能

:star:环境要求

  • 运行此工具的PC需要能连通源端Oracle以及目标MySQL数据库

  • 依赖oracle客户端环境(release已集成instant client)

2.下载

下载工具:point_right:点击此次下载:point_left:

3.平台测试

硬件平台:

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

image

源端表结构

CREATE TABLE TEST 
(
ID NUMBER,
NAME VARCHAR2(100),
SEX VARCHAR2(100)
)

在以上测试平台迁移Oracle一张2000万的表,迁移耗时68秒

截图


v1.9.21.1版本及以下为单线程迁移数据,迁移Oracle一张2000万的表耗时709秒

在这里插入图片描述

4.运行概览

全库迁移

qqqqqqq.png

比对数据

image

记录迁移失败的DDL

image

转储索引、视图、存储过程、函数DDL

image

多进程并行迁移表数据

image

5.开箱使用

下载release 在这里插入图片描述

解压之后即可运行此工具

1、解压,例如将oracle_mig_mysql.zip上传到/opt目录

2、在root用户下解压

[root@localhost root]# cd /opt

[root@localhost root]# unzip oracle_mig_mysql.zip

全库迁移示例

Linux环境

1、进入迁移工具目录

[root@localhost opt]# cd /opt/oracle_to_mysql

2、运行环境变量脚本

[root@localhost ]# sh env_ora.sh && source run_env

image

:warning:注意:此步骤仅Linux环境需要,Windows以及MacOS无需执行

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):

示例:[root@localhost ]# nohup ./oracle_mig_mysql -q &

前台执行命令:(不推荐,如果源库数据量很大,建议使用后台迁移,避免putty等终端工具超时自动断开)

示例:[root@localhost ]#  ./oracle_mig_mysql

4、查看数据迁移运行过程

如果是在后台运行nohup ./oracle_mig_mysql -q &,可通过如下命令查看实时迁移过程


[root@localhost ]# tail -100f nohup.out 

迁移已经完成

image

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创建即可

MacOS环境

终端内执行即可:

iShot20221013_14.33.27.png

iShot20221013_14.35.51.png

Windows环境

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、执行全库迁移

G:\oracle_mig_mysql>oracle_mig_mysql.exe

4、迁移完成后查看迁移任务日志

迁移工具目录下面会生成以时间戳名命的日志需要关注:

ddl_failed_table.log --> 创建失败的表、视图、索引、触发器等对象的DDL创建语句,此部分需要修改语法适配并重新在MySQL创建即可

insert_failed_table.log --> 表数据插入失败的对象名称,此部分需要重新对个别表重新迁移数据

ddl_function_procedure.sql --> Oracle导出的存储过程以及函数的定义,此部分需要修改语法适配并重新在MySQL创建即可

6.比对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;

在这里插入图片描述

7.迁移部分表以及数据

仅迁移数据(不创建表结构以及表索引)

以下以Linux环境示例,windows环境操作方式类似

:warning:备注:使用-d命令前,需要确保mysql数据库已经创建了该表的表结构

:warning:需了解,使用-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

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

8.完整命令列表

通过编辑custom_table.txt 文件以及配合命令参数可自定义哪些表需要迁移

:diamond_shape_with_a_dot_inside:命令示例:

:one:仅迁移自定义表的表结构以及数据包括索引等约束

./oracle_mig_mysql -c

:two:仅迁移自定义表的表数据,不包括表结构以及索引等约束

./oracle_mig_mysql -d

:three:仅迁移自定义表的元数据,即表结构(表定义、视图、索引、触发器自增列等约束),不迁移数据

./oracle_mig_mysql -m

:four:静默模式,输入-q之后无需在命令行界面键入“y”进行迁移前确认,默认为一键:bangbang:全库迁移:bangbang:

./oracle_mig_mysql -q 

标签:DBA,mysql,mig,Oracle,MySQL,oracle,迁移
From: https://blog.51cto.com/u_10893615/5753641

相关文章

  • MySQL事务隔离
    MySQL事务隔离该文摘抄自林晓斌老师的文章提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银......
  • linux 安装mysql8.0.11
    1.使用系统的root账户2.切换到/use/local目录下3.下载mysql?wgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz也可以......
  • MySql时间处理函数的学习与实践
    前言日常业务开发中,我们经常需要跟SQl的日期打交道,比如查询最近30天的订单,查询某一个月的订单量,统计某天每小时的下单量等等,于是整理了以下MySql时间处理函数。DATE_ADD()定......
  • MySQL日志15连问
    前言大家好,我是田螺哥。金九银十已经来了,整理了15道经典MySQL日志面试题,希望对大家有帮助。1.redolog是什么?为什么需要redolog?redolog是什么呢?redolog是重做日......
  • MySQL 中的 “My” 是什么意思?
    前两天,我跟一个面试官聊天,发现一个普遍现象,不少候选人,对数据库的认知,还处在比较基础的阶段,以为会写“增删改查”、做表关联就足够了,那些工作中经常出现的问题,却支支吾吾答不......
  • 美团二面:Redis与MySQL双写一致性如何保证?
    前言四月份的时候,有位好朋友去美团面试。他说,被问到Redis与MySQL双写一致性如何保证?这道题其实就是在问缓存和数据库在双写场景下,一致性是如何保证的?本文将跟大家一起来探讨......
  • Windows 安装 MySQL 5.7 x64 位
    下载地址:https://downloads.mysql.com/archives/installer/安装网站上只有x86没有x64位,之前下了x64的zip包,配置比较麻烦,其实这个x86包里面,已经包含了x64的包......
  • linux mysql定时备份存异地服务器
    参考资料帖子:https://blog.51cto.com/u_1472521/5108597https://blog.csdn.net/zhou920786312/article/details/123354503https://zhuanlan.zhihu.com/p/201086165http......
  • mysql数据表的管理
    1.进入数据库use数据库名;2.查看当前数据库下的所有表showtables;3.创建表createtable表名称(列名称类型,列名称类型,列名称类......
  • MySQL事务:事务隔离
    对数据进行并发操作时,事务可以确保数据的完整性,在银行、证券交易等业务场景需要用到它,本文将介绍MySQL事务是如何保证数据的一致性的。目录事务特性事务启动与提交事务回......