1.概述
??本文主要介紹使用MTK工具,將Oracle數據庫中的數據遷移至PostgreSQL數據庫中。
??MTK(Database Migration Toolkit)是一個異構數據庫遷移工具,支持源庫為Oracle目標庫為PostgreSQL的遷移場景,當然更多遷移場景和注意事項可以詳見MTK官方文檔:
https://docs.mogdb.io/zh/mtk/v2.0/overview
2.遷移步驟
2.0 創建測試用戶及數據庫
??注:’#’ 代表root用戶命令提示符,’$’表示普通用戶命令提示符
PostgreSQL端(監聽的端口號為5432,版本為13.1)操作:
// 連接數據庫,如果沒有指定連接的用戶和數據庫,默認會連接與當前操作系統
// 用戶同名的數據庫和用戶
$ psql
create database mtk_db encoding 'utf8';
// 切換到新創建的數據庫mtk_db,然后創建測試用戶和模式
\c mtk_db
create user mtk_user password 'test@123';
create schema mtk_user authorization mtk_user;
// 退出psql客戶端,編輯pg_hba.conf配置文件,配置mtk_user遠程連接接入
// 認證,同時修改postgresql.conf配置文件,設置listen_addresses=’*’,是數據庫服// 務監聽宿主機上的所有IP。
$ vim postgresql.conf
listen_addresses = '*'
$ vim pg_hba.conf
host mtk_db mtk_user 10.0.0.11/32 md5
// 重啟數據庫,使得配置生效
pg_ctl restart -D /usr/local/pgsql/data -l logfile
??注:MTK工具將安裝在PostgreSQL數據庫服務運行的主機(centOS7.6)上,主機IP為10.0.0.11,當MTK工具運行時,可以使用mtk_user用戶通過主機10.0.0.11遠程連接PostgreSQL數據庫,將從Oracle中讀取到的數據寫入到PostgreSQL數據庫中。
Oracle端:
??本次測試的Oracle數據庫是安裝在windows操作系統上,監聽的端口號為1521,監聽的主機IP地址為10.0.0.1。這次演示遷移scott用戶下的所有數據到PostgreSQL中,用戶密碼為test1234。Oracle版本為:11.2.0.1.0:
// 授予scott用戶管理員權限
sqlplus / as sysdba
grant dba to scott;
2.1安裝Oracle客戶端
??根據Oracle數據庫版本在Oracle客戶端下載頁面下載相應版本,Oracle客戶端與MTK工具需要安裝在同一臺主機上,這里規劃到PostgreSQL數據庫服務所在的主機,操作步驟如下:
// 創建Oracle客戶端工具包存放目錄
# mkdir -p /opt/software/mtk
# cd /opt/software/mtk
// 下載Basic Package(zip)包到當前路徑,并解壓
// 然后配置LD_LIBRARY_PATH環境變量
// 注意如下下載是登錄之后復制了下載鏈接,這里只是展示,如果服務器可以上
// 網,那么,我們可以通過wget命令直接下載,你也可以提前下載,然后上傳:
# wget https://download.oracle.com/otn/linux/instantclient/11204/instantclient-basic-linux.x64-11.2.0.4.0.zip?AuthParam=1660892062_c06aef3a746b8f5de17b1f822ed8ae3d
# unzip instantclient-basic-linux.x64-11.2.0.4.0.zip
# export LD_LIBRARY_PATH=/opt/software/mtk/instantclient_11_2/:$LD_LIBRARY_PATH
2.2下載MTK
??MTK可以到官網下載頁面下載對應操作系統和CPU架構的版本,如果可以上網,可以直接使用wget命令下載到上面創建的目錄中:
# wget https://cdn-mogdb.enmotech.com/mtk/v2.5.1/mtk_2.5.1_linux_amd64.tar.gz
//解壓
# tar -zxvf mtk_2.5.1_linux_amd64.tar.gz
2.3申請許可證
// 進入mtk解壓目錄,然后執行許可證申請命令
# cd mtk_2.5.1_linux_amd64
# ./mtk license gen
// 然后根據郵箱接收的license信息,在當前目錄下編寫license.json文件
vim license.json
// 查看MTK版本信息
./mtk -v
2.4初始化項目
// 執行如下命令,初始化遷移項目(會在當前目錄下創建同名的子目錄)
./mtk init-project -n ora2pg -s oracle -t postgresql
// 選項說明:
// -n 指定項目名
// -s 指定源庫類型
// -t 指定目標庫類型
2.5編寫遷移配置文件
??初始化項目之后,在項目目錄下的config子目錄中會自動生成示例遷移配置文件mtk.json,我們只需要對這個文件做適當的修改即可,修改后的配置文件信息如下所示:
# vim ora2pg/config/mtk.json
{
# 源庫端連接信息
"source": {
"type": "oracle",
"connect": {
"host": "10.0.0.1",
"user": "scott",
"port": 1521,
"password": "test1234",
"dbName": "orcl"
},
"parameter": {
"charAppendEmptyString": false
}
},
# 目標庫端連接信息
"target": {
"type": "postgresql",
"connect": {
"host": "10.0.0.11",
"user": "mtk_user",
"port": 5432,
"password": "test@123",
"dbName": "mtk_db"
},
"parameter": {
"parallelInsert": 1,
"dropExistingObject": false,
"truncTable": false,
"colKeyWords": {},
"objKeyWords": {},
"caseSensitive": 0,
"quoteMark": false,
"path": "ora2pg/data",
"schemaPath": "ora2pg/schema",
"dataPath": "ora2pg/data",
"errDataPath": "",
"fileType": "",
"fileSize": "",
"csvHeader": false,
"csvNullValue": "",
"csvFieldDelimiter": ",",
"csvOptionallyEnclosed": "\"",
"excludeSysTable": [],
# 設置模式的映射關系,在目標庫端將SCOTT模式改名為mtk_user
"remapSchema": {"SCOTT":"mtk_user"},
"remapTable": {},
"remapTablespace": {},
"enableSyncTabTbsPro": false,
"enableSyncCompTabPro": false,
"timeFormat": "HH:MI:SS",
"dateFormat": "YYYY-MM-DD",
"dateTimeFormat": "YYYY-MM-DD HH24:MI:SS",
"noSupportPartTabToNormalTab": true,
"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": "",
"convertOracleIntegerToNumeric": false,
"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": [],
# 設置要遷移的對象信息,tables項和schemas項是沖突的,只需配置其中一個
# 即可,如果兩項都不配置,那么就不進行數據遷移。
"schemas": ["SCOTT"],
"excludeTable": {},
"tableSplit": {}
},
"dataOnly": false,
"schemaOnly": false,
"disableTableDataComp": false,
"disableCollStatistics": false,
"reportFile": "ora2pg/report",
"debug": false,
"disableIgnoreCase": false,
"disableSelectPart": false,
"disableFKCons": false,
"disableSyncIdxAfterData": false,
"disablePrintMigDataProgress": false
}
2.6執行遷移命令
# ./mtk -c ora2pg/config/mtk.json
2.7查看遷移報告
先將遷移報告壓縮,然后下到windows主機中查看:
# cd ora2pg/report
# zip -r report.zip report_20220819140839
// 將壓縮文件上到windows主機
# sz report.zip
??將下載下來的遷移報告壓縮包解壓,然后打開其中的index.html文件,報告頁面如下圖所示:

??本次測試遷移中,全部遷移成功,主要有11張表,從遷移報告的總結中可以看到,遷移耗時,以及源庫和目標庫的基本信息。
??連接到PostgreSQL中查看數據:
[postgres@PG1 ~]$ psql mtk_db mtk_user
psql (13.1)
Type "help" for help.
mtk_db=> \dt
List of relations
Schema | Name | Type | Owner
----------+-----------+-------+----------
mtk_user | a | table | mtk_user
mtk_user | bonus | table | mtk_user
mtk_user | dept | table | mtk_user
mtk_user | dept1_bak | table | mtk_user
mtk_user | dept_bak | table | mtk_user
mtk_user | emp | table | mtk_user
mtk_user | emp1 | table | mtk_user
mtk_user | news | table | mtk_user
mtk_user | salgrade | table | mtk_user
mtk_user | test | table | mtk_user
mtk_user | users | table | mtk_user
(11 rows)
2.8補充(搭建nginx服務查看遷移報告)
在安裝了MTK工具的主機上進行如下操作:
//查看是否安裝了nginx軟件,沒有則安裝
# rpm -qa nginx
# yum install -y nginx
//啟動nginx服務
# systemctl start nginx
//編寫nginx配置文件,隨便創建一個網站服務
# cd /etc/nginx/conf.d
// 配置文件名隨便起一個
# vim report.conf
server {
listen 80;
location / {
root /opt/software/mtk/mtk_2.5.1_linux_amd64/ora2pg/report/report_20220819140839;
index index.html;
}
}
// 注意:安裝nginx服務時,會自動創建nginx用戶,需要確保nginx用戶能夠訪問報告目錄下的
// 文件,我們可以改變遷移報告目錄的權限
# chown -R nginx.nginx /opt/software/mtk/mtk_2.5.1_linux_amd64/ora2pg/report/report_20220819140839
// 檢查配置是否正確
# nginx -t
// 如果正確的話,重新加載nginx服務
# systemctl reload nginx
??上述操作準備完之后,可以在windows宿主機上輸入nginx服務所在主機的IP地址即可訪問遷移報告網頁文件(前提:windows宿主機與nginx服務所在主機之間的網絡是連通的),如下圖所示:

??到此,通過MTK工具將數據從Oracle遷移至PostgreSQL中的操作步驟就結束了。




