非常荣幸受邀参加YashanDB的迁移体验官活动。
借此机会,使用崖山自研的数据迁移平台YMP产品,对业务系统ORACLE进行了评估和迁移测试。
本次实战包含部署YMP环境、评估和迁移业务系统数据对象(包含表、约束、索引、视图、序列、同义词、触发器、自定义类型、自定义函数、包、存储过程等),考虑到生产环境的数据量巨大,这里采集了真实环境的所有数据对象和部分数据共计124.2GB进行演示。
作者:霸王龙的日常
墨天轮:https://www.modb.pro/u/368448
公众号:霸王龙的日常

首先,先大致了解一下什么是YMP?以及其核心特性和应用场景。
1 产品概述
崖山迁移平台(Yashan Migration Platform,YMP)是YashanDB提供的数据库迁移产品,支持异构RDBMS与YashanDB之间进行迁移评估、离线迁移、数据校验的能力。 YMP提供可视化服务,用户只需通过简单的界面操作,即可完成从评估到迁移整个流程的执行与监控,实现低门槛、低成本、高效率的异构数据库迁移实施。
1.1 核心特性
- 精确评估
基于可插拔数据库最小内核,在评估阶段即精确验证SQL 兼容性,评估结果真实可信。
- SQL自动转换
支持SQL语句自动转换,全面适配YashanDB语法,解决大部分不兼容SQL的适配转换问题,大大减少人工适配工作量。
- 评估迁移无缝对接
评估结果自动作为迁移的基础,迁移时即按照评估阶段所做的对象DDL 自动/手动改写来执行,实现评估兼容即迁移成功。
- 对象一键迁移
一键整合所有对象元数据迁移,充分考虑对象依赖关系,及对数据迁移的影响,并采用端到端性能最优的执行策略,智能决策元数据对象创建顺序。
- 数据高性能迁移
基于数据库原生高性能导入导出能力,采用流水线多级并行架构,实现原厂级高性能数据迁移。
- 一站式服务
将包括迁移评估、离线迁移在内的迁移方案全流程整合在一个平台上,为用户提供低门槛、可视化、可复制的一站式迁移服务。
1.2 应用场景
YMP是面向数据库迁移场景提供的离线评估迁移工具,能够解决迁移兼容性与工作量预估、异构数据库元数据迁移以及数据快速迁移的问题。
2 安装部署
2.1 安装前准备
2.1.1 系统要求
| 项目 | 说明 |
|---|---|
| 系统 | CentOS 7.6以上、KylinOS V10 |
| 架构 | X86-64/ARM-64 |
| CPU | 4核 |
| 内存 | 8G |
| 磁盘 | SSD |
数据库及迁移工具
以下项目单独部署在三台服务器上
| 项目 | 说明 |
|---|---|
| 源库 | ORACLE 11.2.0.4 |
| 目标库 | yashandb-personal-23.1.1.100 |
| 迁移工具 | yashan-migrate-platform-23.1.1.100 |
本文以CentOS 7.6为例进行部署。
2.1.2 环境要求
-
YMP支持浏览器Chrome、Firefox和Microsoft Edge,建议使用当前较新的版本。
-
YMP需要在JDK8或JDK11的环境下安装,不支持其他版本JDK。
-
YMP安装路径不可包含英文句号(.)。
-
建议YMP安装在磁盘最为充足的目录下,YMP会使用磁盘进行缓存CSV文件,建议安装路径容量不小于待同步表中的最大单表数据量的三倍。
-
建议在机器新建用户以安装部署YMP。
-
YMP部署前使用
rpm -qa | grep libaio检查环境中是否已安装 libaio 库,若未安装则使用yum install libaio安装 libaio 库及其依赖项后再进行部署。 -
需确保操作系统max user processes最大用户线程数不小于65535。
2.1.2.1 检查JDK
java -version

YMP需要在JDK8或JDK11的环境下运行,安装任一均可,此处系统以JDK8为例
注:
如果没安装JDK环境,则执行下面命令安装
## 安装JDK8 yum install -y java-1.8.0-openjdk ## 或者 ## 安装JDK11 yum install -y java-11-openjdk
4.1.2.2 检查libaio库
查看是否安装了 libaio 库
rpm -qa | grep libaio

如果没安装,则执行下面命令进行安装
yum install -y libaio
4.1.2.3 最大用户线程数
# 执行执行如下命令将最大用户线程数写入/etc/security/limits.conf文件,重启后参数永久生效
$ echo "
* soft nproc 65536
* hard nproc 65536
" >> /etc/security/limits.conf
2.1.3 浏览器支持
YMP支持浏览器Google Chrome、Microsoft Edge和Firefox,建议使用当前较新的版本。
| 浏览器支持 | 要求版本 |
|---|---|
| Google Chrome | 88 及以上版本 |
| Microsoft Edge | 88 及以上版本 |
| Firefox | 78 及以上版本 |
2.1.4 开放端口
安装默认端口号
| YMP监听 | 数据库监听 | 主机间通信 | yasom | yasagent |
|---|---|---|---|---|
| 8090 | 8091 | 8092 | 8093 | 8094 |
这里选择直接关闭防火墙
在主机上执行如下命令关闭防火墙:
关闭防火墙
systemctl stop firewalld
关闭开机自启
systemctl disable firewalld
关闭 SELINUX
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0 sestatus
2.1.5 创建安装用户
新建YMP用户
useradd -d /home/ymp -m ymp passwd ymp
这里设置的密码是:Trex@123
2.1.6 获取安装包
| 软件包名称 | 说明 |
|---|---|
| yashan-migrate-platform-23.1.1.100-linux-x86-64.zip | YMP安装包,用于YMP的安装和部署。 |
| yashandb-personal-23.1.1.100-linux-x86_64.tar.gz | YashanDB安装包,用于默认内置库的安装和部署, 要求使用和迁移目标库相同的版本。 |
| instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip instantclient-basic-linux.arm64-19.10.0.0.0dbru-2.zip |
OCI客户端压缩包,用于OCI客户端的安装和替换。 |
Note:
- OCI客户端压缩包可在’https://www.oracle.com/cn/database/technologies/instant-client/downloads.html’处获取。
- 使用Oralce到YashanDB的数据迁移功能时,必须使用OCI客户端压缩包,并建议使用表格里的版本,其他版本未经验证可能有未知风险。
注意:
经过测试,oracle11g使用instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip可正常迁移。使用oracle11g对应instantclient-basic-linux.x64-11.2.0.4.0版本则迁移报OCI为空。
2.2 开始安装
以下操作没有特殊说明的话,均在ymp用户下执行
2.2.1 上传安装包至服务器
-
创建目录,用于存放安装包
mkdir -p /home/ymp/data/db -
上传的安装包文件路径如下
/home/ymp/yashan-migrate-platform-23.1.1.100-linux-x86-64.zip /data/instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip /data/db/yashandb-personal-23.1.1.100-linux-x86_64.tar.gz

2.2.2 解压安装包
cd /home/ymp/ unzip yashan-migrate-platform-23.1.1.100-linux-x86-64.zip
ymp目录结构如下:
cd /home/ymp/yashan-migrate-platform/ ll

ymp安装包附属信息如下:
cat VERSION.txt

2.2.3 查看脚本参数及其使用方法
Note:
默认内置库指令与自定义内置库指令(nodb)不可混合使用。
sh bin/ymp.sh -h

2.2.4 参数说明
依据实际需要对默认内置库安装及YMP启动参数进行调整。
# db.properties
YASDB_PASSWORD=ymppw602. # 默认内置库sys用户默认密码
YASDB_PORT=8091 # 默认内置库默认端口号
# conf/application.yml
server:
port: 8090 # YMP启动占用的端口
servlet:
context-path: /yashan
spring:
jackson:
default-property-inclusion: non_null
servlet:
multipart:
max-file-size: 11MB
thymeleaf:
cache: false
enabled: true
encoding: UTF-8
suffix: .html
mode: HTML
check-template: true
check-template-location: true
prefix: classpath:/static/
servlet:
content-type: text/html
produce-partial-output-while-processing: true
datasource:
schema: classpath:db/createTable.sql
driverClassName: com.yashandb.jdbc.Driver
url: jdbc:yasdb://127.0.0.1:8091/yashan # 评估数据库的JDBC URL,可以更换为自定义内置库,同时修改IP和端口号
username: YMP_DEFAULT # 评估数据库要连接的schema名称
password: ymppw602 # 评估数据库要连接的schema的密码
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath:mapper/**/*.xml
logging:
level:
org: error
com.yashandb.protocol.NativeProtocol: off
com.alibaba.druid.sql.*: off
com.sics.sqlconvert.*: off
migration:
logfile:
path: ${ymp.home}/logs/
csvfile:
Path: ${ymp.home}/tmp/
needCheckVolume: true
needDatabaseVersionCheck: true
parallel:
query: 20 # 元迁移过程中源端、目标端查询视图连接数。在元迁移过程中会有分批量的查询的动作,需要开启多个查询连接并行查询。该参数配置元数据迁移的源端、目标端查询的并行线程数,决定了对数据库的查询最大连接数,默认20。
execute: 20 # 元迁移过程中目标端执行创建连接数。在元迁移过程中会并行把对象在目标端的执行,以提升迁移效率。该参数配置元数据迁移的目标端DDL执行的并行线程数,决定了连接数据库的执行最大连接数,默认20。migration.parallel.query和migration.parallel.execute的连接总和,是最终迁移过程中所有的目标端数据库连接数。
createIndexUseParallel: true # 创建索引是否使用并行参数,true/TRUE:使用;false/FALSE:不使用。
index: 5 # 索引创建的并行度,需要考虑migration.parallel.execute。例:migration.parallel.execute:10,migration.parallel.index: 5,表示,同时10个连接在并行建索引,每个索引的并行度是5(CREATE INDEX XXX PARALLEL 5)。不填默认CPU核数。
task:
parallel:
max-num: 500
commons:
dataMigrateSpeed: 51200 # 预计数据迁移速度,Mb/s。修改会影响评估结果预计迁移时间的大小
objMigrateSpeed: 200 # 预计对象迁移速度,number/s。修改会影响评估结果预计迁移时间的大小
shiro:
session:
timeout: 900 # 用户登录后空闲过期时间,单位秒(s),默认15分钟
metrics:
rate: 3000
assessment:
ddlCount: 50 # 评估任务单个会话获取DDL的数量,如果Oracle性能较差,则需要降低该值
maxThreadCount: 20 # 评估任务最多同时拥有的会话数,如果Oracle性能较差,则需要降低该值
isLscTable: false # 评估的目标库是否为LSC表,如果用默认内置库,则设置为默认内置库的属性,默认非LSC表会影响创建的表空间
setNoLogging: false # 数据迁移前是否将表设为nologging,默认为false
DEFAULT_TABLE_TYPE: HEAP
ymp_memory: 2 # YMP使用的最大内存,单位: GB
export:
csv:
exportRowsEveryFile: 2000000
isRemoveCsvFileInSuccess: true
table:
splitCount: 5
splitConditionCount: 10000000
splitConditionSize: 5
import:
degree_of_parallelism: 16
batch_size: 2048
mode: BATCH
schemaBlackList: #系统schema过滤黑名单
oracle: ANONYMOUS,APEX_030200,APEX_PUBLIC_USER,APPQOSSYS,BI,CTXSYS,DBSNMP,DIP,EXFSYS,FLOWS_FILES,HR,IX,MDDATA,MDSYS,MGMT_VIEW,OE,OLAPSYS,ORACLE_OCM,ORDDATA,ORDPLUGINS,ORDSYS,OUTLN,OWBSYS,OWBSYS_AUDIT,PM,SCOTT,SH,SI_INFORMTN_SCHEMA,SPATIAL_CSW_ADMIN_USR,SPATIAL_WFS_ADMIN_USR,SYS,SYSMAN,SYSTEM,WMSYS,XDB,XS$NULL
mysql: information_schema,mysql,performance_schema,sys
2.3 默认内置库安装YMP
注意:
YMP安装时按默认方式自行安装YashanDB作为内置库。
YMP安装前需用户准备YashanDB安装包(注:db目录与bin/yasldr目录在部署前须为空目录)。 如需要使用Oracle到YashanDB的数据迁移功能,还需要准备OCI客户端的压缩包。
默认内置库安装YMP的方式有两种:
- 使用install参数:安装内置库,成功后自动启动。
- 使用install参数:安装内置库和OCI客户端,成功后自动启动。
Note: 默认内置库以yasboot工具方式部署并启动。 默认内置库相关信息:
- 部署形态:单机
- 集群名称:ymp
- 安装目录:yashan-migrate-platform/db
2.3.1 执行安装
安装内置库和OCI客户端并启动
有两种安装方式,这里采用方式一进行安装
cd /home/ymp/yashan-migrate-platform/ sh bin/ymp.sh install --db /data/db/yashandb-personal-23.1.1.100-linux-x86_64.tar.gz --oci /data/instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip
显示结果如下:

2.3.2 查看运行状态
sh bin/ymp.sh status
显示如下

2.3.3 查看默认内置库与YMP版本
sh bin/ymp.sh -v
显示如下

2.3.4 更换yasldr版本(略)
# 为满足对不同版本yasldr的需求,ymp.sh提供单独替换yasldr版本的功能,使用时需指定用来替换的数据库安装包
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh replace --yasldr /data/db/yashandb-22.2.8.100-linux-x86_64.tar.gz
Yasldr version has been changed!
Note:
- 更换yasldr版本后无需重新初始化数据库,可使用-v参数查看版本。
- 更换yasldr版本功能需在安装成功后才可使用。
2.3.5 更换OCI客户端版本(略)
# 为满足对不同版本yasldr的需求,ymp.sh提供单独替换yasldr版本的功能,使用时需指定用来替换的数据库安装包
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh replace --oci /home/ymp/data/instantclient/instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip
Yasldr version has been changed!
Note:
- 非首次更换OCI版本后,需重新启动YMP,方可生效。
2.3.6 测试访问ymp页面
访问方式:http://IP:PORT/,PORT默认8090。初始账户名和密码是(admin/admin)。
http://YMP_IP:8090/
卸载YMP(略)
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh uninstall
YMP has been stopped!
type | uuid | name | hostid | index | status | return_code | progress | cost
--------------------------------------------------------------------------------------------------------
task | 50869a02b7662b6f | CleanYasdbCluster | - | ymp | SUCCESS | 0 | 100 | 2
------+------------------+-------------------+--------+-------+---------+-------------+----------+------
task completed, status: SUCCESS
uninstall package...
rm -rf /home/ymp/yashan-migrate-platform/db
# 使用uninstall功能时可携带-f参数,强制清理环境
$ sh bin/ymp.sh uninstall -f
# 验证
$ ps -ef | grep yas
ymp 25035 22269 0 16:19 pts/0 00:00:00 grep yas
Note:
- 卸载YMP时,会删除默认内置库(自定义内置库不受影响),但不会清空db和yashan_client文件夹,若想替换数据库版本,请使用强制清理后重新部署。
- 强制清理功能会清理当前用户下YMP启动的所有进程,并删除内置库及yasldr文件夹下所有内容,请谨慎使用,建议在专用的YMP用户下使用。
- 最后还需要手动删除~/.bashrc中与YashanDB有关的环境变量。
3 启动与停止
3.1 启动ymp启动YMP
# 默认内置库启动YMP
# su - ymp
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh start
type | uuid | name | hostid | index | status | return_code | progress | cost
--------------------------------------------------------------------------------------------------------
task | 2daf47e59c7df9f2 | StartYasdbCluster | - | ymp | SUCCESS | 0 | 100 | 2
------+------------------+-------------------+--------+-------+---------+-------------+----------+------
task completed, status: SUCCESS
YMP has been started!
停止YMP
# 默认内置库停止YMP
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh stop
type | uuid | name | hostid | index | status | return_code | progress | cost
---------------------------------------------------------------------------------------------------------------
task | c056e046b0138e13 | StopYasdbCluster | - | ymp.ForceStop | SUCCESS | 0 | 100 | 2
------+------------------+------------------+--------+---------------+---------+-------------+----------+------
task completed, status: SUCCESS
YMP has been stopped!
重启YMP
# 默认内置库重启YMP
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh restart
YMP has been stopped!
type | uuid | name | hostid | index | status | return_code | progress | cost
----------------------------------------------------------------------------------------------------------
task | c8c1a1374bb38c38 | ReStartYasdbCluster | - | ymp | SUCCESS | 0 | 100 | 5
------+------------------+---------------------+--------+-------+---------+-------------+----------+------
task completed, status: SUCCESS
YMP has been started!
4 用户管理
4.1 登录
4.1.1 访问ymp页面
访问方式:http://YMP_IP:PORT/,PORT默认8090。初始账户名和密码是(admin/admin)。
http://YMP_IP:8090/
- 输入用户名和密码 (初始用户和密码是
admin/admin) - 部署后首次登录需要进行修改密码

5 数据源管理
目前支持添加数据源有3种,Oracle、MySQL和YashanDB。
需要注意的是,在添加数据源时,会首先测试数据库连接,只有连接成功才可以添加成功。
如果连接失败则会根据失败原因提示相对应的失败消息,例如用户名或密码错误等。
在添加数据源时会同步获取数据源的版本和连接信息。
5.1 源库
在ORACLE库中创建迁移用户并授权
SQL> create user ymp identified by "Trex123" account unlock;
SQL> grant dba to ymp;
添加ORACLE数据源

5.2 目标库
在YashanDB中创建迁移用户并授权
$ yasql 'sys/"Trex@123"'
SQL> CREATE USER trex IDENTIFIED BY trex;
SQL> GRANT DBA TO trex;
添加YashanDB数据源

添加完成后,可以再数据源列表中看到如下信息

注: Oracle 11.2.0.1版本 如果提示查询用户信息失败,则需要用sys给数据源用户赋权,执行:
exec dbms_metadata_util.load_stylesheets。
注:YashanDB目标数据库暂不支持配置三权分立模式,即便赋予DBA角色,迁移过程还是会报错。用户迁移前需关闭三权分立:
ALTER SYSTEM SET ENABLE_SEPARATE_DUTY=false SCOPE=SPFILE,重启数据库生效,迁移完成后再打开。
# 查看ENABLE_SEPARATE_DUTY参数值
SQL> show parameter ENABLE_SEPARATE_DUTY
NAME VALUE
--------------------- ------
ENABLE_SEPARATE_DUTY FALSE
# 如果不是FALSE,请执行下面命令关闭三权分立
SQL> ALTER SYSTEM SET ENABLE_SEPARATE_DUTY=false SCOPE=SPFILE;
# 重启数据库生效
$ yasboot cluster restart -c yashandb
type | uuid | name | hostid | index | status | return_code | progress | cost
-----------------------------------------------------------------------------------------------------------
task | 2f13236dc2e703e3 | StartYasdbCluster | - | yashandb | SUCCESS | 0 | 100 | 7
------+------------------+-------------------+--------+----------+---------+-------------+----------+------
task completed, status: SUCCESS
# 查看数据库状态
$ yasboot cluster status -c yashandb -d
hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path
------------------------------------------------------------------------------------------------------------------------------------------------
host0001 | db | 1-1:1 | 56246 | open | normal | primary | 192.168.7.22:1688 | /data/yashan/yasdb_data/db-1-1
----------+-----------+--------+-------+-----------------+-----------------+---------------+-------------------+--------------------------------
6 数据迁步骤介绍
6.1 迁移评估
该阶段主要评估MySQL或Oracle数据库想要迁移的database或schema与YashanDB的兼容程度。 YMP通过对象维度对异构数据库进行兼容度评估,在评估过程中会对对象的DDL进行一定程度的自动改写。
6.2 迁移配置
该阶段为离线迁移前的准备阶段,用户可以配置任务,选择要迁移的对象和迁移的策略。
6.3 离线迁移
该阶段主要实现元数据和数据的迁移。在迁移前会进行多项检查,检查通过后开始迁移,用户可以实时查看迁移进度和详情。
迁移完成后用户可以查看迁移报告。
7 迁移评估
7.1 前提条件
数据源可正常连接。
7.2 创建任务
创建任务是一切迁移评估任务的起点,如下图

填写基础信息

选择评估对象,这里我全选

选择评估的范围,就是你要迁移ORACLE数据库中哪些用户的数据
这里不用勾选上述步骤中创建的ymp用户。

其他设置,根据实际情况填写

进入下一步,迁移评估。

评估的速度还是很快的,1分钟左右已经完成了1w+的对象评估任务。
通过可视化界面能够很直观的可以看到兼容度。并且兼容度还是相当高的!
你可以在【刷新报告】的左侧下载该评估报告。

此处主要评估数据库对象和PLSQL代码的兼容信息。
对于不能自动迁移的对象,可通过【查看DDL】直观的看到oracle和YashanDB的DD详细代码和错误信息,具体到行。此时,你可以根据提示修改对应的DDL进行手工匹配。
对于一些极度复杂或者本身不兼容的内容可以先选择忽略。等迁移完成再详细修改。

只有评估100%兼容,才能进入下一步进行迁移配置。这里先选择忽略。
忽略部分不兼容的对象后,需要刷新报告。

刷新完成后,可以看到兼容100%后,进入下一步。

8 迁移配置

从源端数据库往目标数据库YashanDB做元数据与数据迁移。主要步骤有3个:
- 元数据迁移1
将源端数据库的除主键约束、唯一约束、外键约束、索引和触发器之外的其他对象迁移至目标数据库YashanDB。
- 全量数据迁移
将源端数据库的数据迁移至目标数据库YashanDB。
- 元数据迁移2
将源端数据库的主键约束、唯一约束、外键约束、索引和触发器迁移至目标数据库YashanDB。
确认迁移对象,选择全部

迁移初始化配置

这里需要注意下,对于初次迁移,YashanDB中并没有ORACLE中的相关的表空间。
表空间初始化要选择【不通过】,并且全选所有表空间,YashanDB会自动创建。并且可以在【展开】项中修改表空间对应数据文件的大小。

进入预检查。
预检查包括连接检查、权限检查、容量检查、部署方式检查、版本检查、默认表类型检查、表空间检查、类型检查和其他检查。
其中部署方式检查、类型检查和其他检查为可选项,可不做检查。

点击【离线迁移】会进行预检查。

容量检查
容量检查将检查离线迁移任务的文件保存路径(${ymp.home}/tmp/)容量是否充足。
- 若路径容量小于待同步表中的最大单表数据量,检查不通过,且阻塞接下来的离线迁移操作。
- 若路径容量小于待同步表中的最大单表数据量的三倍,检查不通过,但仅报风险提示。
- 若路径容量不小于待同步表中的最大单表数据量的三倍,检查通过。
注:当跳过数据迁移时,不会进行该项检查。
当预检查通过后,如果无风险提示,会自动开始离线迁移,如果有风险提示,会提示后确认开始离线迁移。
进入离线迁移界面

你可以在数据迁移过程中,过滤迁移中的对象,查看具体表的迁移进度。


迁移完成后,显示如下

你可以下载迁移报告和迁移日志以便后期进行分析处理。
至此,前期的迁移评估和迁移任务已完成。
总结
相较于传统的异构数据库迁移方式的繁杂,该迁移工具在实际使用中表现出色。
方便易用:崖山迁移平台YMP提供了直观的操作界面与流程指导,有助于用户在无需深入了解数据库底层细节的情况下完成数据迁移任务。
兼容性良好:YashanDB在复杂的Oracle业务场景下兼容性方面表现出色。
高效稳定:通过一键式或自动化迁移流程,YMP可以减少人工干预,实现快速、稳定的数据迁移,降低因迁移导致的服务中断时间和潜在风险。
由于时间仓促,本次迁移中还有许多待优化的迁移配置项未进行验证,后期还会继续做相关测试以释放YMP的迁移效率。




