接着上一篇的话题,现在国内数据库百花齐放,超过200种关系型数据库,大家在进行数据库国产化改造的过程中,难免要进行各种数据迁移,代码转换甚至改造等工作。
实际上这几年我们做了不少数据库迁移改造项目,当然大部分是数据库国产化。因此我们也沉淀出了一些好用的工具,因此今天再分享一个好用且实用的数据异构迁移工具,实际上并不仅仅是数据迁移,还可以进行相应代码的转换。
这个工具就是 Database Migration Toolkit,我们简称为MTK. 这里给大家简单介绍一下该工具的使用和常用功能,最后并给大家演示一下。针对MTK工具的一些主要功能,简单说一下说明(软件下载地址 https://docs.mogdb.io/zh/mtk/v2.0/release-2.9)。
多数据库类型支持
-
支持 Oracle,DB2,SQL Server,MySQL,Informix,PostgreSQL、MogDB到MogDB数据库的迁移(实际上目标端还支持openGauss和PostgreSQL)。
-
支持将数据库内容导出成可执行的 SQL 脚本 (源数据库内容迁移到文本)。
迁移性能调整
-
支持调整数据迁移过程中的批量查询、批量插入大小等细粒度参数,来调整数据迁移的性能。
-
支持数据迁移时的多并发,并行和数据分片。
结构和数据分离
-
支持迁移对象结构和数据;也支持仅迁移结构或者仅迁移数据(在结构已经迁移完之后)。
-
支持表级和 Schema 级的迁移范围限定,允许指定schema下全部对象或者某些对象进行迁移 。
-
支持迁移过程中的 Schema 重映射,也就是支持将对象从源Schema迁移到目标端的不同名Schema下 。
程序迁移
-
支持Oracle/MySQL/DB2到MogDB/openGauss的存储过程,函数,触发器,包迁移并对语法进行改写。
迁移场景
源数据库 | 目标数据库 |
---|---|
Oracle | MogDB |
Oracle | openGauss |
Oracle | MySQL |
Oracle | PostgreSQL |
MySQL | MogDB |
MySQL | openGauss |
MySQL | PostgreSQL |
DB2 | MogDB |
DB2 | openGauss |
DB2 | MySQL |
DB2 | PostgreSQL |
SqlServer | MogDB |
SqlServer | openGauss |
SqlServer | MySQL |
SqlServer | PostgreSQL |
PostgreSQL | MogDB |
PostgreSQL | openGauss |
Informix | MogDB |
Informix | openGauss |
话不多说,我们这里直接来带大家玩一玩这个好用的工具。当你下载并解压后,首先会看到2个程序,一个是mtk,另外一个是mtkd。其中mtkd是图形化形式,如果你更喜欢命令行,那么使用mtk即可。
首先你需要获得license,使用邮箱申请即可(实际上你可以白嫖license,听说很多客户都在白嫖,甚至友商也在用)。
[root@Ora11g mtkd]# ./mtkd license gen
License File Not Found (default license.json)
The License code is invalid, start applying
✔ Email: zhenxu.li@enmotech.com█
Start applying for email zhenxu.li@enmotech.com authorization.
Start parsing the interface to return data.
Successful application for authorization. Please check the mail and save it as license.json.
[root@Ora11g-ogg-Target mtkd]#
将邮件获得的license.json文件拷贝到mtkd程序所在同级目录即可。
接下来就是我们的演示环节了。。。我这里模拟一下从Oracle 迁移到 MogDB。
首先你需要在你的源端数据库和目标端环境创建好相关的数据库账户。
1、Oracle端测试环境,我之前已经创建了一个测试用户roger,那么这里我就不单独创建用于数据迁移的迁移用户了;正常情况下,该用户需要具备如下的一些权限:
-
connect
-
select any dictionary
-
select any table
-
select_catalog_role
由于我这里的测试环境中,roger用户我已经都授予了DBA权限了,上述权限就无所谓了。由于我这个用户中没有数据,因此我将sysman的数据全部导入到了roger用户中,有很多错误,这里就不展示迁移过程了,很多都创建失败了,没关系,我们就是单纯的为了演示mtk工具的使用。
SQL> l
1 select owner,object_type,status,count(1) from dba_objects
2 where owner='ROGER' group by owner,object_type,status
3* order by 4
SQL> /
OWNER OBJECT_TYPE STATUS COUNT(1)
----------- --------------------- -------------- ----------
ROGER MATERIALIZED VIEW VALID 1
ROGER PROCEDURE VALID 1
ROGER EVALUATION CONTEXT VALID 1
ROGER RULE SET VALID 2
ROGER PROCEDURE INVALID 2
ROGER FUNCTION VALID 3
ROGER QUEUE VALID 4
ROGER PACKAGE BODY VALID 7
ROGER FUNCTION INVALID 9
ROGER INDEX PARTITION VALID 10
ROGER SEQUENCE VALID 13
ROGER TABLE PARTITION VALID 15
ROGER TRIGGER VALID 26
ROGER LOB VALID 42
ROGER PACKAGE VALID 53
ROGER TRIGGER INVALID 63
ROGER VIEW INVALID 111
ROGER PACKAGE INVALID 140
ROGER PACKAGE BODY INVALID 183
ROGER VIEW VALID 360
ROGER TABLE VALID 632
ROGER INDEX VALID 841
22 rows selected.
2、目标端MogDB环境中,创建一个新的database和用户,用于存放迁移数据。
[omm@yashandb1 ~]$ gsql -r
gsql ((MogDB 5.0.5 build b77f1a82) compiled at 2023-12-08 03:11:47 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
MogDB=# create database enmotech template template0 DBCOMPATIBILITY 'A';
CREATE DATABASE
MogDB=# create user enmo encrypted password 'enmo!123';
NOTICE: The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
MogDB=# GRANT ALL PRIVILEGES TO enmo;
ALTER ROLE
MogDB=# alter database enmotech owner to enmo;
ALTER DATABASE
MogDB=#
3、 你还需要提前安装好Oracle client客户端,由于我的mtk程序就部署在oracle 11g测试环境上(当然你也可以使用单独的server来部署mtk迁移程序,生产环境迁移,开并行的情况下比较消耗资源,我们大型项目交付都是单独使用服务器环境来存放mtk),因此需要就把oracle 11g server软件当客户端使用了,就不用再单独安装Oracle client了;同时使用Oracle的环境变量即可。
root@Ora11g-ogg-Target:/opt/mtkd $./mtkd
Using license file: opt/mtkd/license.json
Name : zhenxu.li@enmotech.com
Expiry: 2024-04-12 16:33:41.258436813 +0800 CST
MMMMMMMM MMMMMMMMTTTTTTTTTTTTTTTTTTTTTTTKKKKKKKKK KKKKKKKDDDDDDDDDDDDD
M:::::::M M:::::::MT:::::::::::::::::::::TK:::::::K K:::::KD::::::::::::DDD
M::::::::M M::::::::MT:::::::::::::::::::::TK:::::::K K:::::KD:::::::::::::::DD
M:::::::::M M:::::::::MT:::::TT:::::::TT:::::TK:::::::K K::::::KDDD:::::DDDDD:::::D
M::::::::::M M::::::::::MTTTTTT T:::::T TTTTTTKK::::::K K:::::KKK D:::::D D:::::D
M:::::::::::M M:::::::::::M T:::::T K:::::K K:::::K D:::::D D:::::D
M:::::::M::::M M::::M:::::::M T:::::T K::::::K:::::K D:::::D D:::::D
M::::::M M::::M M::::M M::::::M T:::::T K:::::::::::K D:::::D D:::::D
M::::::M M::::M::::M M::::::M T:::::T K:::::::::::K D:::::D D:::::D
M::::::M M:::::::M M::::::M T:::::T K::::::K:::::K D:::::D D:::::D
M::::::M M:::::M M::::::M T:::::T K:::::K K:::::K D:::::D D:::::D
M::::::M MMMMM M::::::M T:::::T KK::::::K K:::::KKK D:::::D D:::::D
M::::::M M::::::M TT:::::::TT K:::::::K K::::::KDDD:::::DDDDD:::::D
M::::::M M::::::M T:::::::::T K:::::::K K:::::KD:::::::::::::::DD
M::::::M M::::::M T:::::::::T K:::::::K K:::::KD::::::::::::DDD
MMMMMMMM MMMMMMMM TTTTTTTTTTT KKKKKKKKK KKKKKKKDDDDDDDDDDDDD
Release version: v2.9.8-beta-3de4c8e2-20240312085737
Git Commit hash: 3de4c8e2
Git Commit Date: 2024-03-12T05:29:54Z
Git Tag : v2.9.8-beta-3de4c8e2-20240312165736
Build timestamp: 20240312085737
.......
当运行上述程序之后,就可以在你的chrome浏览器打开 http://172.20.23.5:8080,进入mtkd的web界面了;如下所示:
这里我们点击 创建项目 即可开始相应的配置工作。
此时你可以看到对于源端数据库类型的支持8种类型;而目标端数据库支持4种类型。我这里测试环境是Oracle,那么就选择Oracle即可,后面再输入相应的版本号、以及数据库账号、密码即可。
注意注意:一定要设置好环境变量,否则可能会报错。我这里就遇到类似如下错误。
当用户、密码等信息都输入完毕之后,你可以点击 连接测试 进行验证,确认配置无误。
大家也看到了,上面其实还有一个 高级配置 选项,其粒度很细,可以自定义比如表拆分、并行读等子功能。如果是我们进行schema级别全部迁移,就不需要了,保持默认即可。毕竟我这里是测试演示环境,生产环境大家可以根据自己实际需求来调整。
在这里等迁移类型中,你可以选择只迁移表结构或者数据;对于迁移对象而言,我这里就迁移整个ROGER测试用户了。配置完成之后点击下一步就会看到你相关的配置细节:
最后我们点击 启动迁移 来进行此次数据迁移测试工作吧。当迁移动作开始之后,工具web界面会自动打印相关的日志,如下所示:
当整个迁移动作完成之后,你在web界面也能看到自动产生的迁移汇总报告:
如果你需要给领导汇报,那么你可以选择下载报告即可。
如果你觉得我这个测试例子中似乎错误有点多,那么给大家分享一下前几天我们team同事刚刚做的一个真实case,某客户数据库从PostgreSQL迁移到MogDB到报告截图:
实际上出了做数据迁移,代码转换,本身工具还提供了SQL转换功能,严格来讲应该叫代码转换更贴切,源端支持Oracle、MySQL和DB2 三种数据库类型;目标端支持MogDB、openGauss、PostgreSQL 三种数据库类型。
这里给大家show 一段我的测试代码,一个简单的Oracle 存储过程,看看这个功能能否自动转换成MogDB的可执行代码?
转换后的代码可以到MogDB上进行一下验证,看看能否正常执行。
当然这里所谓的代码中转换,可能并非所有类型的代码都能正常转换,如果使用过程中你遇到任何问题,可以到技术交流群进行咨询沟通,欢迎给我们提供更多的宝贵意见!
更多详情,请移步到官网了解:https://docs.mogdb.io/zh/mtk/v2.0/mtk-usage