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中的操作步骤就结束了。