寫在前面
MTK是一種數(shù)據(jù)遷移工具,支持異構(gòu)的數(shù)據(jù)遷移,比如從Oracle、DB2、Mysql中同步表結(jié)構(gòu)和全量數(shù)據(jù),MTK不支持增量同步,僅支持全量從一個靜態(tài)庫中同步所有的表結(jié)構(gòu)和數(shù)據(jù)。
有這樣一個現(xiàn)實場景,新老系統(tǒng)替換,由于設(shè)計和業(yè)務(wù)功能的改進,新老系統(tǒng)的數(shù)據(jù)庫設(shè)計肯定不同,新系統(tǒng)需要承接老系統(tǒng)的數(shù)據(jù),進行后續(xù)的業(yè)務(wù)處理以及查詢統(tǒng)計,這個工作也叫“業(yè)務(wù)數(shù)據(jù)遷移”,本文所指的遷移都是業(yè)務(wù)數(shù)據(jù)遷移,而不是傳統(tǒng)意義上的數(shù)據(jù)庫產(chǎn)品改變。
一般情況下在進行業(yè)務(wù)遷移的時候需要一個遷移中間環(huán)境,這個環(huán)境的數(shù)據(jù)庫產(chǎn)品可以與老系統(tǒng)數(shù)據(jù)庫產(chǎn)品一致,也可以與新系統(tǒng)數(shù)據(jù)庫產(chǎn)品一致,需要根據(jù)實際情況考慮使用哪一種,這個環(huán)境包括兩類表,一類表是老系統(tǒng)的表,一類是新系統(tǒng)的表,下圖描述了一個從老系統(tǒng)是DB2、中間環(huán)境是mysql或者db2、新系統(tǒng)是Mysql的業(yè)務(wù)遷移方案中的數(shù)據(jù)流轉(zhuǎn)過程:
此例中我們的老系統(tǒng)使用Mysql數(shù)據(jù)庫,新系統(tǒng)使用MogDB數(shù)據(jù)庫,遷移中間環(huán)境使用MogDB數(shù)據(jù)庫;具體如下表
老系統(tǒng) | 中間環(huán)境 | 新系統(tǒng) | |
數(shù)據(jù)庫產(chǎn)品 | Mysql | MogDB | MogDB |
數(shù)據(jù)流向匯總來說有以下幾個大步驟:
- 老系統(tǒng)卸載數(shù)據(jù)
- 中間庫加載老系統(tǒng)數(shù)據(jù)到老系統(tǒng)的表
- 中間庫執(zhí)行sql邏輯代碼進行數(shù)據(jù)轉(zhuǎn)換,并加工到新系統(tǒng)的表
- 導(dǎo)出中間庫中新系統(tǒng)的表
- 生產(chǎn)環(huán)境導(dǎo)入加工后的數(shù)據(jù)
此次測試,我主要是測試步驟1和步驟2的內(nèi)容,既通過MTK把全量數(shù)據(jù)從老系統(tǒng)加載到新系統(tǒng)
測試環(huán)境
Mysql | NODE1(主庫) | NODE2(從庫) |
pkt_mogdb1 | pkt_mogdb2 | |
10.80.9.150 | 10.80.9.249 | 10.80.9.250 |
安裝MTK
- 安裝MTK
如果是從Oracle或者DB2同步到MogDB需要安裝相應(yīng)的客戶端mysql不需要。
使用omm用戶解壓mtk安裝包,并配置環(huán)境變量
[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 |
編輯環(huán)境變量,增加mtk環(huán)境變量
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,因此復(fù)制一份mysql2opengauss.json進行修改
方式二、通過mtk config-gen命令交互式生成配置文件。
便于理解我選擇了使用交互式方式生成配置文件
[omm@pkt_mogdb1 mtk2.4.4]$ mtk config-gen ? mysql #選擇源數(shù)據(jù)庫類型 Please input the mysql Database machine ip : 10.80.9.150 #源數(shù)據(jù)庫地址 Please input the mysql Database port : 3306 #源數(shù)據(jù)庫端口 Please input the mysql Database User : zkh #源數(shù)據(jù)庫用戶 Please input the mysql Database User Password : ●●●●●●●●●●● #源數(shù)據(jù)庫密碼 Please input the mysql Database Name : db_mysql #源數(shù)據(jù)庫庫名 ? mogdb #目標數(shù)據(jù)庫類型 Please input the mogdb Database machine ip : 10.80.9.249 #目標數(shù)據(jù)庫ip Please input the mogdb Database port : 26000 #目標數(shù)據(jù)庫端口 Please input the mogdb Database User : zkh #目標數(shù)據(jù)庫用戶 Please input the mogdb Database User Password : ●●●●●●●●●●● #目標數(shù)據(jù)庫密碼 Please input the mogdb Database Name : db_mogdb #目標數(shù)據(jù)庫庫名 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 數(shù)據(jù)量是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,需要聯(lián)網(wǎng),但是我的虛擬機沒有外網(wǎng),難住我了,在這里感謝一下小墨同志,有困難找小墨。
[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上提交問題,很快就回復(fù)
于是我下載了一個window版本的MTk,然后使用可以聯(lián)網(wǎng)的機器重新申請了一個Lisence,然后等待郵件就可以了。
上傳到服務(wù)器對應(yīng)目錄,需要注意文件權(quán)屬應(yīng)該是omm
重新運行mtk
[omm@pkt_mogdb1 mtk2.4.4]$ ./mtk -c mtk.json |
成功了
觀察過程中1秒大概1萬條數(shù)據(jù),最后看看600多萬需要多長時間執(zhí)行完成
總共需要了13分鐘。如果把并行度再開大一些,應(yīng)該會提升不少。
查看一下備庫是否也同步過去了
從庫同步也沒有問題。
修改mtk.json修改如下兩個參數(shù)
truncTable: true #如果數(shù)據(jù)存在則truncate parallelInsert: 4 #并行插入進程數(shù) "dataOnly": true #只同步數(shù)據(jù) |
重新執(zhí)行
[omm@pkt_mogdb1 mtk2.4.4]$ ./mtk -c mtk.json |
開啟了4個并行度,發(fā)現(xiàn)速度大大提升
只用了6分鐘就導(dǎo)入了
最后
MTK在遷移過程中非常方便,可以指定一個schema,也可以指定表,如果目標庫已經(jīng)存在表了,也可以只遷移數(shù)據(jù),并且在導(dǎo)入數(shù)據(jù)的時候可以選擇truncate目標庫中的表,MTK支持的參數(shù)還有很多,到時候有機會真正使用MogDB的時候再深入研究把。
MTk如果有個web界面操作就更完美了,因為最近剛測試完Oceanbase的OMS遷移工具,專業(yè)性降低,可操作性也提高了。




