写在前面
MTK是一种数据迁移工具,支持异构的数据迁移,比如从Oracle、DB2、Mysql中同步表结构和全量数据,MTK不支持增量同步,仅支持全量从一个静态库中同步所有的表结构和数据。
有这样一个现实场景,新老系统替换,由于设计和业务功能的改进,新老系统的数据库设计肯定不同,新系统需要承接老系统的数据,进行后续的业务处理以及查询统计,这个工作也叫“业务数据迁移”,本文所指的迁移都是业务数据迁移,而不是传统意义上的数据库产品改变。
一般情况下在进行业务迁移的时候需要一个迁移中间环境,这个环境的数据库产品可以与老系统数据库产品一致,也可以与新系统数据库产品一致,需要根据实际情况考虑使用哪一种,这个环境包括两类表,一类表是老系统的表,一类是新系统的表,下图描述了一个从老系统是DB2、中间环境是mysql或者db2、新系统是Mysql的业务迁移方案中的数据流转过程:
此例中我们的老系统使用Mysql数据库,新系统使用MogDB数据库,迁移中间环境使用MogDB数据库;具体如下表
老系统 | 中间环境 | 新系统 | |
数据库产品 | Mysql | MogDB | MogDB |
数据流向汇总来说有以下几个大步骤:
- 老系统卸载数据
- 中间库加载老系统数据到老系统的表
- 中间库执行sql逻辑代码进行数据转换,并加工到新系统的表
- 导出中间库中新系统的表
- 生产环境导入加工后的数据
此次测试,我主要是测试步骤1和步骤2的内容,既通过MTK把全量数据从老系统加载到新系统
测试环境
Mysql | NODE1(主库) | NODE2(从库) |
pkt_mogdb1 | pkt_mogdb2 | |
10.80.9.150 | 10.80.9.249 | 10.80.9.250 |
安装MTK
- 安装MTK
如果是从Oracle或者DB2同步到MogDB需要安装相应的客户端mysql不需要。
使用omm用户解压mtk安装包,并配置环境变量
[omm@pkt_mogdb1 software]$ cd /opt/mogdb/software [omm@pkt_mogdb1 software]$ tar -zxvf mtk_2.4.4_linux_amd64.tar.gz [omm@pkt_mogdb1 software]$ mv mtk_2.4.4_linux_amd64 mtk2.4.4 |
编辑环境变量,增加mtk环境变量
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/opt/mogdb/software/mtk2.4.4 |
- 修改MTK配置文件
方式一、在mtk解压目录中有一个example文件夹,里面有实例配置文件
[omm@pkt_mogdb1 example]$ ll total 28 -rw------- 1 omm omm 3148 Jun 23 13:20 db22mysql.json -rw------- 1 omm omm 3585 Jun 23 13:29 db22openGauss_file.json -rw------- 1 omm omm 3740 Jun 23 13:20 db22openGauss.json -rw------- 1 omm omm 2805 Jun 23 13:29 mysql2opengauss_file.json -rw------- 1 omm omm 2775 Jun 23 13:21 mysql2opengauss.json -rw------- 1 omm omm 2964 Jun 23 13:29 oracle2opengauss_file.json -rw------- 1 omm omm 2988 Jun 23 13:20 oracle2opengauss.json |
因为我们的是从Mysql到MogDB,因此复制一份mysql2opengauss.json进行修改
方式二、通过mtk config-gen命令交互式生成配置文件。
便于理解我选择了使用交互式方式生成配置文件
[omm@pkt_mogdb1 mtk2.4.4]$ mtk config-gen ✔ mysql #选择源数据库类型 Please input the mysql Database machine ip : 10.80.9.150 #源数据库地址 Please input the mysql Database port : 3306 #源数据库端口 Please input the mysql Database User : zkh #源数据库用户 Please input the mysql Database User Password : ●●●●●●●●●●● #源数据库密码 Please input the mysql Database Name : db_mysql #源数据库库名 ✔ mogdb #目标数据库类型 Please input the mogdb Database machine ip : 10.80.9.249 #目标数据库ip Please input the mogdb Database port : 26000 #目标数据库端口 Please input the mogdb Database User : zkh #目标数据库用户 Please input the mogdb Database User Password : ●●●●●●●●●●● #目标数据库密码 Please input the mogdb Database Name : db_mogdb #目标数据库库名 Please input the degree of parallelism: 2 #同步的使用并行度 Please input fetch Size: 1000 # 每次处理1000条 Please input batch size: 1000 Please input copy buffer size: 8 Please input reader buffer size: 8 Please input oracle select parallel: 2 ✔ table #是同步表还是同步schema Please input the Migrate tables,Separated by commas.(schema1.tab1,schema2.tab1): db_mysql.dump_tables_mysql |
我这里的测试源表为dump_tables_mysql 数据量是600多万条
完成上述交互命令会打印出配置文件信息
{ "source": { "type": "mysql", "connect": { "host": "10.80.9.150", "user": "zkh", "port": 3306, "password": "Zkh12345678", "dbName": "db_mysql" }, "parameter": { "charAppendEmptyString": false } }, "target": { "type": "mogdb", "connect": { "host": "10.80.9.249", "user": "zkh", "port": 26000, "password": "Zkh12345678", "dbName": "db_mogdb" }, "parameter": { "parallelInsert": 1, "dropExistingObject": false, "truncTable": false, "colKeyWords": {}, "objKeyWords": {}, "caseSensitive": 0, "quoteMark": false, "path": "./data/mysql", "schemaPath": "", "dataPath": "", "fileType": "", "fileSize": "", "csvHeader": false, "csvNullValue": "", "csvFieldDelimiter": ",", "csvOptionallyEnclosed": "\"", "excludeSysTable": [], "remapSchema": {}, "remapTable": {}, "remapTablespace": {}, "enableSyncTabTbsPro": false, "enableSyncCompTabPro": false, "timeFormat": "HH:MI:SS", "dateFormat": "YYYY-MM-DD", "dateTimeFormat": "YYYY-MM-DD HH24:MI:SS", "noSupportPartTabToNormalTab": false, "ignoreDB2PartInclusive": false, "igNotSupportIntervalPart": false, "igErrorData": false, "enableBatchCommit": false, "ignoreTabPartition": false, "autoAddMaxvaluePart": false, "autoAddMySQLAutoIncr": false, "autoAddMySQLAutoIncrTabList": [], "ignoreNotSupportDefault": false, "replaceZeroDate": "", "virtualColToNormalCol": false, "virtualColConv": {}, "mySQLSkipErrorDateTimeData": false, "ignoreTableDDLCompErr": false, "convertPackageMethod": "", "enableOgBlobClob": false, "enableConvertSrid": false, "defaultSrid": "4326", "seqLastNumAddNum": 0, "skipColumnType": {}, "skipColumnName": {}, "templateSeqName": "", "charAppendEmptyString": false, "tableOptions": {}, "indexOptions": {} } }, "limit": { "parallel": 2, "fetchSize": 1000, "batchSize": 1000, "bufferSize": 8, "cpBufferSize": 8, "oracleSelectParallel": 2, "channelCacheNum": 10000, "limit": 0 }, "object": { "tables": [ "db_mysql.dump_tables_mysql" ], "schemas": [], "excludeTable": { "MTK": [ "MTK_TAB1", "MTK_TAB2" ], "SYS": [ "TAB$", "OBJ$" ] }, "tableSplit": { "MTK": { "TAB_1": [ " rowid between 'AAAeoSAAEAAAACpAAA' and 'AAAeoSAAEAAAA4oEI/'", " rowid between 'AAAeoSAAEAAAA4pAAA' and 'AAAeoSAAEAABVSoEI/'", " rowid between 'AAAeoSAAEAABVSpAAA' and 'AAAeoSAAFAABOEoEI/'", " rowid between 'AAAeoSAAFAABOEpAAA' and 'AAAeoSAAFAABOGIEI/'" ], "TAB_2": [ "MOD(\"ID\",4)=0", "MOD(\"ID\",4)=1", "MOD(\"ID\",4)=2", "MOD(\"ID\",4)=3" ], "TAB_3": [ "MOD(`ID`,4)=0", "MOD(`ID`,4)=1", "MOD(`ID`,,4)=2", "MOD(`ID`,4)=3" ] } } }, "dataOnly": false, "schemaOnly": false, "disableTableDataComp": false, "disableCollStatistics": false, "reportFile": "./mtk_report", "debug": false, "disableIgnoreCase": false, "disableSelectPart": false, "disableFKCons": false, "disableSyncIdxAfterData": false, "disablePrintMigDataProgress": false } |
把信息保存到mtk.json中
- 运行MTK
负责直接运行mtk会报错,不存在licence
[omm@pkt_mogdb1 mtk2.4.4]$ ./mtk -c mtk.json License File Not Found (default license.json) read License failed: Config File "license" Not Found in "[/opt/mogdb/software/mtk2.4.4]" Please use ./mtk license gen command to request |
需要先申请license命令:mtk license gen,需要联网,但是我的虚拟机没有外网,难住我了,在这里感谢一下小墨同志,有困难找小墨。
[omm@pkt_mogdb1 mtk2.4.4]$ mtk license gen License File Not Found (default license.json) The License code is invalid, start applying Email: zhangkh@yusys.com.cn Start applying for email zhangkh@yusys.com.cn authorization. Failure : Post "http://ymzspitwutgk0.license.enmotech.com/api/v1/license": dial tcp: lookup ymzspitwutgk0.license.enmotech.com on [::1]:53: read udp [::1]:37467->[::1]:53: read: connection refused The application for authorization failed. Please apply for or replace the server manually. |
也感谢官方大大,在gitee上提交问题,很快就回复
于是我下载了一个window版本的MTk,然后使用可以联网的机器重新申请了一个Lisence,然后等待邮件就可以了。
上传到服务器对应目录,需要注意文件权属应该是omm
重新运行mtk
[omm@pkt_mogdb1 mtk2.4.4]$ ./mtk -c mtk.json |
成功了
观察过程中1秒大概1万条数据,最后看看600多万需要多长时间执行完成
总共需要了13分钟。如果把并行度再开大一些,应该会提升不少。
查看一下备库是否也同步过去了
从库同步也没有问题。
修改mtk.json修改如下两个参数
truncTable: true #如果数据存在则truncate parallelInsert: 4 #并行插入进程数 "dataOnly": true #只同步数据 |
重新执行
[omm@pkt_mogdb1 mtk2.4.4]$ ./mtk -c mtk.json |
开启了4个并行度,发现速度大大提升
只用了6分钟就导入了
最后
MTK在迁移过程中非常方便,可以指定一个schema,也可以指定表,如果目标库已经存在表了,也可以只迁移数据,并且在导入数据的时候可以选择truncate目标库中的表,MTK支持的参数还有很多,到时候有机会真正使用MogDB的时候再深入研究把。
MTk如果有个web界面操作就更完美了,因为最近刚测试完Oceanbase的OMS迁移工具,专业性降低,可操作性也提高了。