前言
首届YashanDB「迁移体验官」开放后,陆续收到「体验官」们的投稿,小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《基于YMP工具实现Oracle迁移YashanDB》(作者:kawaa1),满满干货,不要错过!
号外!新的征文活动已开启,点击此处或戳一戳下方图片即可跳转活动链接,最高可获千元大奖!
1. YMP简介
1.1 YMP工具概述
崖山迁移平台(YashanDB Migration Platform,YMP)是YashanDB提供的数据库迁移产品,支持异构RDBMS与YashanDB之间进行迁移评估、离线迁移、数据校验的能力。YMP提供可视化服务,用户只需通过简单的界面操作,即可完成从评估到迁移整个流程的执行与监控,实现低门槛、低成本、高效率的异构数据库迁移。
1.2 YMP工具架构图
核心服务介绍:
- 对象评估:提供多源异构RDBMS与YashanDB之间对象兼容的评估能力。支持多种异构数据库源、SQL文件、XML文件作为输入源,提供SQL转换、DDL改写和SQL自动验证等功能。
- 元数据迁移:提供元数据迁移能力。支持对迁移范围的灵活选择,支持不同情景下的对象冲突策略选择,迁移前风险检查和实时展示迁移进度和对象级迁移结果。
- 数据迁移:提供表数据迁移能力。支持数据冲突处理选择,基于数据库原生高性能导入导出能力,采用多表并行、分表并行架构,实现原厂级高性能数据迁移。
- 数据校验:提供多源异构RDBMS与YashanDB之间的数据校验能力。包括全量校验和统计校验功能,满足迁移后数据一致性的强力支持。
1.3 YMP工具规格
2. 环境说明
3. YMP工具部署
3.1 安装前准备
3.1.1 下载安装包
YashanDB数据库软件和YMP迁移工具都可以在这个地址下载:
https://download.yashandb.com...
3.1.2 创建ymp操作系统用户
# useradd ymp
# passwd ymp
3.1.3 上传软件安装包并解压
## 上传YMP安装包到/home/ymp下并解压
# su - ymp
$ cd /home/ymp/
$ unzip yashan-migrate-platform-x86-64.zip
3.1.4 操作系统参数配置
## 注意:max user processes最大用户线程数不小于65535
## 执行执行如下命令将最大用户线程数写入/etc/security/limits.conf文件,重启后参数永久生效
echo "
* soft nproc 65536
* hard nproc 65536
" >> /etc/security/limits.conf
3.1.4 关闭防火墙
## 关闭防火墙
# systemctl stop firewalld
## 关闭开机自启
# systemctl disable firewalld
3.1.5 jdk环境配置
注意:YMP仅支持在JDK8或JDK11的环境下安装
## 以JDK安装路径为/usr/tools/jdk8为例
# vi /etc/profile
## 在文件结尾添加如下
export JAVA_HOME=/usr/tools/jdk8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
## 重新载入配置文件
# source /etc/profile
## 安装成功后查看JDK版本信息
# java -version
3.1.6 libaio依赖准备
## 确认是否已安装libaio动态库,已安装即可忽略
# rpm -qa | grep libaio
3.1.7 OCI环境准备
注意:迁移Oracle到YashanDB时,需提前安装oci环境,需要特别注意的是YMP现仅支持OCI Version 19.19.0.0.0及以上版本。
(下载来源:https://www.oracle.com/databa...)
## 修改安装包所属用户及用户组为ymp用户
# chown ymp:ymp instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip
## 从root用户切换至ymp用户
# su - ymp
## 切换至安装路径
$ cd /home/ymp
## 解压OCI安装包
$ unzip instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip
3.1.8 调整安装参数
ymp安装包解压后,可以根据具体环境更改配置文件,如服务端口、内置库字符集等。
## 内置库配置文件
$ vi /home/ymp/yashan-migrate-platform/conf/db.properties
YASDB_PASSWORD=ymppw602.
YASDB_PORT=8091
YASDB_CHARACTER_SET=UTF8 # 默认内置库字符集,还可选择ASCII, ISO88591, GBK
## YMP配置文件
$ vi /home/ymp/yashan-migrate-platform/conf/application.yml
server:
port: 8090 # YMP启动占用的端口
...
spring:
...
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的密码
migration:
...
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核数。
checkTask:
# 校验任务的配置
datasource:
max-connection: 500 #限制每个数据源支持的最大连接数
connection-timeout: 300000 #单位: ms
minimum-idle: 1
logFile:
path: ${ymp.home}/logs/ydc_log/
task:
parallel:
max-num: 20 #校验任务的最大并行任务数
subTask:
parallel:
max-num: 200 #校验任务的子任务的最大并行任务数, 即一个任务多少个表在同时校验
task:
parallel:
max-num: 500 #最大并行任务数, 依据自己的配置修改
commons:
dataMigrateSpeed: 51200 # 预计数据迁移速度,Mb/s。修改会影响评估结果预计迁移时间的大小
objMigrateSpeed: 200 # 预计对象迁移速度,number/s。修改会影响评估结果预计迁移时间的大小
shiro:
session:
timeout: 900 # 用户登录后空闲过期时间,单位秒(s),默认15分钟
...
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
ymp_direct_memory: 4 # YMP使用的最大对外内存,单位: GB
export:
csv:
exportRowsEveryFile: 2000000
isRemoveCsvFileInSuccess: true
table:
splitCount: 5
splitConditionCount: 10000000
splitConditionSize: 5
lobTable:
splitCount: 5
splitConditionCount: 1000000
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
dm: SYS,SYSDBA,SYSSSO,SYSAUDITOR,CTISYS
ympVersion: v23.1.1.1
checkService:
ip: 127.0.0.1
port: 8090
3.2 执行安装
这里使用默认内置库进行安装,也可以用自定义创建库作为内置库。
## 执行安装命令,安装成功后服务会自动启动
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh install --db /data/db/yashandb-23.2.1.0-linux-x86_64.tar.gz
3.3 检查运行情况
[ymp@yashandb1-test bin]$ ./ymp.sh status
YMP is running, pid is 32275.
Built-in database is used, pid is 32125.
3.4 常见操作说明
## 查看版本信息
[ymp@yashandb1-test bin]$ ./ymp.sh -v
Yashan-migrate-platform version: Release v23.2.1.2
YashanDB SQL Personal Edition Release 23.2.1.100 x86_64
YashanDB Loader Personal Edition Release 23.2.1.100 x86_64 2d13f1d
## 启动ymp
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh start
## 停止ymp
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh stop
## 重启ymp
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh restart
## 卸载ymp
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh uninstall
加上-f可以强制清理:
$ sh bin/ymp.sh uninstall -f
3.5 访问YMP迁移平台
默认登录用户名和密码:admin/admin
首次登录需要重置密码!
4. 迁移Oracle至YashanDB
4.1 创建任务
4.1.1 创建数据源
创建源端Oracle数据源
创建目标端YashanDB数据源
4.1.2 创建迁移任务
创建迁移任务,选择上一步添加的Oracle数据源,选择要【迁移评估】的用户和对象。
4.1.2.1 【创建任务】问题记录
问题1:SYS不能作为数据源用户连接
创建数据源过程中遇到Oracle数据库SYS不能作为数据源用户进行连接的问题,猜测是基于安全方面进行考虑,故不支持该用户进行创建。
问题2:迁移用户在内置库中被占用
创建新的任务过程中,遇到用户在内置库中被占用的问题。由于新创建的任务要迁移的用户与现有的迁移任务的用户名相同,所以出现这个问题。解决方法是等待上一个迁移任务完成之后删除该任务,才能新建该任务。实际迁移过程中多任务并行执行的场景还是挺多的,建议可以针对该功能点进行优化。
4.2 迁移评估
迁移评估的过程实际上针对所需迁移对象的元数据在内置库中进行创建。
4.2.1 评估情况
4.2.2 对象情况
4.2.2.1 【迁移评估】问题记录
【迁移评估】存在失败对象,选择”对象详情“,筛选”评估结果“为不兼容的对象进行分析,并且问题记录如下。
问题1:无效的数据类型
迁移评估过程中遇到无效的数据类型,定位具体的对象类型是SDO\_GEOMETRY数据类型,查看了YashanDB官方文档后确认该数据类型目前暂不支持。解决办法是暂时先跳过这个对象。
YashanDB官网备注说明,链接地址:https://doc.yashandb.com/ymp/...
问题2:不能在RAW数据类型上创建索引
迁移评估过程中遇到不能在RAW数据类型上创建索引问题,登录源库查看USER\_GUID字段类型确实为RAW类型,该报错属于功能不支持类型,错误代码为YAS-02097。解决办法是暂时先不创建这个索引。
问题3:表或视图不存在
迁移评估过程中遇到表或视图不存在的问题,经定位分析,失败的原因是由于包含有SDO\_GEOMETRY数据类型的表没有创建成功。解决办法是暂时先忽略这些索引对象。
问题4:不兼容对象处理后需要刷新报告
不兼容对象手动处理完成后,无法自动识别,进行下一步离线迁移,必须手动刷新报告之后,兼容性达到100%之后才能继续下一步。
4.3 迁移配置
4.3.1 基础信息
指定目标YashanDB数据库,并确认迁移信息是否正确
4.3.2 迁移范围
4.3.3 确认迁移对象
4.3.4 迁移初始化配置
4.3.5 高级配置
4.3.6 表空间初始化
注意:选择”跳过“的话,需要提前在目标端创建好表空间。
4.3.7 预检查
4.4 离线迁移
本次迁移数据134.1G,迁移时间总共耗时30分钟,迁移的速度还是蛮快的!
4.4.2 【离线迁移问题】问题记录
问题1:空间不足导致迁移报错
离线迁移过程中,任务执行一半之后突然中断,定位到磁盘空间撑爆导致。通过对磁盘空间进行扩容后,重新迁移失败对象后解决。
注意:为避免这类情况,YMP安装路径磁盘容量需预留不小于待同步表中的最大单表数据量的三倍
(YMP会使用磁盘进行缓存CSV文件)
4.5 校验初始化
4.5.1 选择校验范围
4.5.2 选择校验对象
选择需要的对象做校验
4.5.3 校验设置
校验的模式有两种:一种是完整对比,一种是统计对比。
4.5.4 高级选项
设置校验最多有多少张表可以同时校验。
4.6 一致性校验
4.6.1 完整性校验模式
选择完整性校验,执行【一致性校验】,得到如下报告结果。
4.6.2 统计对比校验模式
选择统计对比校验,执行【一致性校验】,得到如下报告结果。
4.6.3 【一致性校验】问题记录
问题1:部分数据类型不支持校验
执行完整比对模式时候,遇到部分数据类型不支持校验而被跳过校验。推测YMP工具目前暂不支持针对LONG和CLOB字段类型进行比对。
问题2:校验规范必须要求有主键和唯一键
执行完整比对模式时候,遇到表由于未创建主键或者唯一键而被跳过校验,推测YMP工具目前仅支持对有主键或唯一键的表进行完整性比对。
5. 迁移体验
- YMP工具部署简单,迁移过程也很简洁清晰,可以快速上手,方便快捷;
- YashanDB与Oracle的数据类型高度兼容,可以实现平滑迁移;
- YMP工具提供整个迁移步骤的详细报告,有助于回溯整个迁移过程;
- YMP工具目前仅支持离线迁移,不支持在线和增量迁移;
- YMP工具针对部分数据库暂未支持的功能和特性需要手动处理。
总体而言,本次的YashanDB数据库迁移体验还是很不错的,超乎了预期。YMP迁移工具也给异构数据库迁移带来了极大的便利性。希望YashanDB数据库做的越来越好!国产数据库加油!YashanDB加油!