前言
首届 YashanDB「迁移体验官」开放后,陆续收到「体验官」们的投稿,小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《崖山异构数据库迁移利器 YMP 初体验-Oracle 迁移 YashanDB》(作者:小草),满满干货,不要错过!
号外!新的征文活动已开启,点击此处或戳一戳下方图片即可跳转活动链接,最高可获千元大奖!
一、背景
我司主要软件生态数据库使用的是 Oracle,国产数据库中崖山兼容 Oracle 做的比较好。在国产化替换进程中崖山无疑是首选,因为替换的研发和运维成本相对较低。为了提前了解国产数据库与 Oracle 的兼容适配情况,测试并研究生产应用的可能性,特意关注国产化数据库的最新动态。通过测试国产数据库及相关生态工具验证其可行性。本文主要介绍如何通过崖山 YMP 异构迁移工具将 Oracle 数据库迁移到 YashanDB 数据库。
二、YMP 简介
2.1 概述
崖山迁移平台(YashanDB Migration Platform,YMP)是 YashanDB 提供的数据库迁移产品,支持异构 RDBMS 与 YashanDB 之间进行迁移评估、离线迁移、数据校验的能力。YMP 提供可视化服务,用户只需通过简单的界面操作,即可完成从评估到迁移整个流程的执行与监控,实现低门槛、低成本、高效率的异构数据库迁移。
2.2 产品功能
2.2.1 迁移评估
提前自动评估元数据迁移代价及可行性
预估数据迁移时间、评估风险及可行性
在线/离线评估,统计并生成评估报告
一站式完成数据库迁移方案设计,支撑自动化迁移
2.2.2 元数据迁移
自动生成 DDL 语法
PL/SQL 一键自动转换
支持源库自动抽取或手工导入
提升迁移效率,降低人力投入成本
2.2.3 数据迁移
异构数据库元数据自动迁移,全量/增量
支持传统离线方式,在线直连不停机方式
支持元数据兼容映射
全库/单表/批量/对象级灵活任务管理和调度
并行高速迁移调度
2.2.4 数据校验
支持对象校验/数据校验/全量校检
数据支持统计校验、抽样校验和精确校验
快速准确给出校验结果,确保迁移结果正确性和可靠性
可自动校检/实时校检/随时校检
2.3 产品架构
2.4 产品规格
2.4.1 数据库版本支持
2.4.2 数据类型支持
三、本次体验环境说明
四、YMP 部署
4.1 安装前准备
4.1.1 操作系统参数调整
# 查看最大用户线程数 # ulimit -u
# 执行如下命令使最大用户线程数临时生效,重启后无效 # ulimit -u 65536
# 执行执行如下命令将最大用户线程数写入/etc/security/limits.conf文件,重启后参数永久生效
# echo "
# * soft nproc 65536
# * hard nproc 65536 # " >> /etc/security/limits.conf
#使参数立即生效 # sysctl -p
复制代码
4.1.2 防火墙设置
如下为 YMP 默认使用端口
我们只需要放行 8090 管理平台 web 访问端口即可。
查看防火墙放行情况:
# firewall-cmd --zone=public --list-ports
复制代码
防火墙放行 8090 端口:
# 添加(–permanent 永久生效,没有此参数重启后失效) # firewall-cmd --zone=public --add-port=8090/tcp --permanent
# 重新载入 # firewall-cmd --reload
# 查看 # firewall-cmd --zone=public --query-port=8090/tcp
如需删除请使用如下命令:
# 删除已添加的端口 # firewall-cmd --zone=public --remove-port=8090/tcp --permanent
复制代码
4.1.3 创建 YMP 部署用户
# 新建YMP用户
# useradd -d /home/ymp -m ymp # passwd ymp
复制代码
4.1.4 JDK 环境准备
YMP 仅支持在 JDK8 或 JDK11 的环境下安装。
# 以JDK安装路径为/usr/tools/jdk8为例 # vi /etc/profile
# 在文件结尾添加如下 #java_8u221
export JAVA_HOME=/usr/local/java/jdk1.8.0_221
export MAVEN_HOME=/usr/local/maven/apache-maven-3.9.6
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib
# 重新载入配置文件 # source /etc/profile
# 安装成功后查看JDK版本信息 # java -version
复制代码
4.1.5 libaio 环境准备
YMP 运行需要 libaio 动态库。
# 查看是否已安装libaio动态库
# rpm -qa | grep libaio
# 若未有版本信息打印,安装libaio
# yum install -y libaio
复制代码
4.1.6 OCI 环境准备
如需要使用 Oracle 到 YashanDB 的数据迁移功能,需进行 OCI 环境安装。
准备 OCI 环境需从 Oracle 官网下载 OCI 客户端并依据官网所列步骤进行安装。
(https://www.oracle.com/cn/database/technologies/instant-client/linux-x86-64-downloads.html)
YMP 现仅支持 OCI Version 19.19.0.0.0 及以上版本。建议下载和安装的版本信息如下:
上传安装包至 YMP 用户/home/ymp/路径。
# 修改安装包所属用户及用户组为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
复制代码
4.1.7 YashanDB 环境准备
使用默认内置库时,本步骤可省略。(推荐使用内置库,比较省事)
使用外部内置库时:
–创建一个 ymp 用户(以 YMP_DEFAULT 为例)并为其授权
create user YMP_DEFAULT IDENTIFIED BY ymppw602 DEFAULT TABLESPACE users;
GRANT ALL PRIVILEGES TO YMP_DEFAULT; GRANT DBA TO YMP_DEFAULT;
4.1.8 软件包准备
下载 YMP 及 YashanDB 安装包。
yashan-migrate-platform-v23.2.1.0-linux-x86-64.zip
yashandb-personal-23.2.1.100-linux-x86_64.tar.gz
上传安装包至 YMP 用户/home/ymp/路径。
#修改安装包所属用户及用户组为ymp用户
# chown ymp:ymp yashandb-personal-23.2.1.100-linux-x86_64.tar.gz
# chown ymp:ymp yashan-migrate-platform-v23.2.1.0-linux-x86-64.zip
复制代码
4.1.9 客户端浏览器
YMP 支持浏览器 Google Chrome、Microsoft Edge 和 Firefox,建议使用当前较新的版本。
4.2 安装
4.2.1 解压安装包
# 从root用户切换至ymp用户
# su - ymp
# 切换至YMP安装目录
$ cd /home/ymp/
$ unzip yashan-migrate-platform-v23.2.1.0-linux-x86-64.zip
复制代码
4.2.2 安装参数调整
依据实际需要对默认内置库安装及 YMP 启动参数进行调整。
$ vi /home/ymp/yashan-migrate-platform/conf/db.properties
默认内置库安装配置文件
# db.properties
YASDB_PASSWORD=3uplbtbnyZ5XFRtpg5F5JQ== # 默认内置库sys用户默认密码密文 YYASDB_PASSWORD=ymppw602.
YASDB_PORT=8091
YASDB_CHARACTER_SET=UTF8
## character_set optional: UTF8, ASCII, ISO88591, GBK
YMP默认配置
$ vi /home/ymp/yashan-migrate-platform/conf/application.properties
# YMP服务端口
server.port=8090
# 用户登录后空闲过期时间,单位秒(s),默认15分钟
shiro.session.timeout=900
# YMP使用的最大堆内存,单位: GB
ymp_memory=4
# YMP使用的堆外内存,单位: GB ymp_direct_memory=2
#YMP业务数据库=====
# YMP业务数据库连接信息
spring.datasource.url=jdbc:yasdb://127.0.0.1:1688/yashandb
spring.datasource.username=YMP_DEFAULT
spring.datasource.password=ymppw602
spring.datasource.largePoolSize=64M
spring.datasource.cursorPoolSize=64M
# 默认内置库表类型,默认HEAP,可选HEAP,TAC,LSC
spring.datasource.defaultTableType=HEAP
spring.datasource.openCursors=3000
spring.datasource.sharePoolSize=2G
spring.datasource.dateFormat=yyyy-mm-dd hh24:mi:ss spring.datasource.ddlLockTimeout=2
#评估=====
# YMP的最大并行任务数
task.parallel.max-num=500
# 预计数据迁移速度,KB/s。修改会影响评估结果预计迁移时间的大小
commons.dataMigrateSpeed=51200
# 预计对象迁移速度,number/s。修改会影响评估结果预计迁移时间的大小
commons.objMigrateSpeed=200
# 评估任务单个会话获取DDL的数量,如果Oracle性能较差,则需要降低该值
assessment.ddlCount=50
# 评估任务最多同时拥有的会话数,如果Oracle性能较差,则需要降低该值
assessment.maxThreadCount=20
# 内置库表类型是否为LSC,默认为false
isLscTable=false
# 拦截的Oracle数据源db/schema黑名单
schemaBlackList.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数据源db/schema黑名单
schemaBlackList.mysql=information_schema,mysql,performance_schema,sys
# 拦截的dm数据源db/schema黑名单 schemaBlackList.dm=SYS,SYSDBA,SYSSSO,SYSAUDITOR,CTISYS
#迁移=====
# 元数据迁移过程中源端、目标端查询视图连接数。在元数据迁移过程中会有分批量的查询的动作, 需要开启多个查询连接并行查询。该参数配置元数据迁移的源端、目标端查询的并行线程数,决定了对数据库的查询最大连接数,不设置默认20
migration.parallel.query=20
# 元数据迁移过程中目标端执行创建连接数。在元数据迁移过程中会并行把对象在目标端的执行,以提升迁移效率。该参数配置元数据迁移的目标端DDL执行的并行线程数,决定了连接数据库的执行最大连接数,不设置默认20。migration.parallel.query和migration.parallel.execute的连接总和,是最终迁移过程中所有的目标端数据库连接数。
migration.parallel.execute=20
# 创建索引是否使用并行参数,true/TRUE:使用,false/FALSE:不使用
migration.parallel.createIndexUseParallel=true
# 索引创建的并行度,需要考虑migration.parallel.execute。例:migration.parallel.execute:10,migration.parallel.index: 5,表示,同时10个连接在并行建索引,每个索引的并行度是5(CREATE INDEX XXX PARALLEL 5)。不填默认CPU核数。
migration.parallel.index=5
# 数据迁移前是否将表设为nologging,默认为false
setNoLogging=false
# 导出oracle时使用的导出方式,支持 [dts, jdbc] 两种方式
export.oracle.tool=dts
# 导出时每个csv文件的行数
export.csv.exportRowsEveryFile=2000000
# 迁移成功时候是否删除csv文件
export.csv.isRemoveCsvFileInSuccess=true
# csv文件存储路径包含对schema和table的拼接,schema名或table名中包含以上字符时,将会被替换,以避免被操作系统识别错误导致迁移失败;不过这可能会使某些表(比如AA$与AA.)在替换后使用的csv文件存储路径相同,导致迁移失败(No such file or directory),可以通过重新迁移失败表来解决
export.csv.path.replacement.from=\ /’."*$
/dev/sda4 926G 36G 891G 4% /
# YMP服务端口 server.port=8090
# 用户登录后空闲过期时间,单位秒(s),默认15分钟
shiro.session.timeout=900
# YMP使用的最大堆内存,单位: GB
ymp_memory=4
# YMP使用的堆外内存,单位: GB ymp_direct_memory=2
#YMP业务数据库=====
# YMP业务数据库连接信息
spring.datasource.url=jdbc:yasdb://172.16.60.219:1688/yashandb
spring.datasource.username=YMP_DEFAULT
spring.datasource.password=ymppw602
spring.datasource.largePoolSize=64M
spring.datasource.cursorPoolSize=64M
# 默认内置库表类型,默认HEAP,可选HEAP,TAC,LSC
spring.datasource.defaultTableType=HEAP
spring.datasource.openCursors=3000
spring.datasource.sharePoolSize=2G
spring.datasource.dateFormat=yyyy-mm-dd hh24:mi:ss spring.datasource.ddlLockTimeout=2
#评估=====
# YMP的最大并行任务数
task.parallel.max-num=500
# 预计数据迁移速度,KB/s。修改会影响评估结果预计迁移时间的大小
commons.dataMigrateSpeed=51200
# 预计对象迁移速度,number/s。修改会影响评估结果预计迁移时间的大小
commons.objMigrateSpeed=200
# 评估任务单个会话获取DDL的数量,如果Oracle性能较差,则需要降低该值
assessment.ddlCount=50
# 评估任务最多同时拥有的会话数,如果Oracle性能较差,则需要降低该值
assessment.maxThreadCount=20
# 内置库表类型是否为LSC,默认为false
isLscTable=false
# 拦截的Oracle数据源db/schema黑名单
# 拦截的MySQL数据源db/schema黑名单
schemaBlackList.mysql=information_schema,mysql,performance_schema,sys
# 拦截的dm数据源db/schema黑名单 schemaBlackList.dm=SYS,SYSDBA,SYSSSO,SYSAUDITOR,CTISYS
#迁移=====
# 元数据迁移过程中源端、目标端查询视图连接数。在元数据迁移过程中会有分批量的查询的动作, 需要开启多个查询连接并行查询。该参数配置元数据迁移的源端、目标端查询的并行线程数,决定了对数据库的查询最大连接数,不设置默认20
migration.parallel.query=20
# 元数据迁移过程中目标端执行创建连接数。在元数据迁移过程中会并行把对象在目标端的执行,以提升迁移效率。该参数配置元数据迁移的目标端DDL执行的并行线程数,决定了连接数据库的执行最大连接数,不设置默认20。migration.parallel.query和migration.parallel.execute的连接总和,是最终迁移过程中所有的目标端数据库连接数。
migration.parallel.execute=20
# 创建索引是否使用并行参数,true/TRUE:使用,false/FALSE:不使用
migration.parallel.createIndexUseParallel=true
# 索引创建的并行度,需要考虑migration.parallel.execute。例:migration.parallel.execute:10,migration.parallel.index: 5,表示,同时10个连接在并行建索引,每个索引的并行度是5(CREATE INDEX XXX PARALLEL 5)。不填默认CPU核数。
migration.parallel.index=5
# 数据迁移前是否将表设为nologging,默认为false
setNoLogging=false
# 导出oracle时使用的导出方式,支持 [dts, jdbc] 两种方式
export.oracle.tool=dts
# 导出时每个csv文件的行数
export.csv.exportRowsEveryFile=2000000
# 迁移成功时候是否删除csv文件
export.csv.isRemoveCsvFileInSuccess=true
# csv文件存储路径包含对schema和table的拼接,schema名或table名中包含以上字符时,将会被替换,以避免被操作系统识别错误导致迁移失败;不过这可能会使某些表(比如AA$与AA.)在替换后使用的csv文件存储路径相同,导致迁移失败(No such file or directory),可以通过重新迁移失败表来解决
export.csv.path.replacement.from=\ /’."*$
# 发生csv文件存储路径字符替换时(详见export.csv.path.replacement.from),指定替换的目标字符或字符串
export.csv.path.replacement.to=_
# 导出时大表拆分的个数
export.table.splitCount=5
# 导出时触发大表拆分的行数
export.table.splitConditionCount=10000000
# 导出时触发大表拆分的表大小(G)
export.table.splitConditionSize=5
# 导出时带lob字段大表拆分的个数
export.lobTable.splitCount=5
# 导出时触发带lob字段大表拆分的行数
export.lobTable.splitConditionCount=1000000
# 导出时触发带lob字段大表拆分的表大小(G)
export.lobTable.splitConditionSize=5
# 使用jdbc导出时每个csv文件的最大行数
export.jdbc.thresholdForSplittingFileLines=5000000
# 使用jdbc导出时每个csv文件的最大大小(M)
export.jdbc.thresholdForSplittingFileSize=3072
# #yasldr More References: http://doc.yashandb.com/yashandb/22.2/zh/%E5%B7%A5%E5%85%B7%E6%89%8B%E5%86%8C/yasldr/yasldr%E4%BD%BF%E7%94%A8%E6%8C%87%E5%AF%BC.html
# yasldr导入时的并行度
import.degree_of_parallelism=16
# yasldr导入时每批次的CSV数据行数
import.batch_size=2048
# yasldr导入方式,包括BASIC方式和BATCH方式
import.mode=BATCH
import.SENDERS=7 import.CSV_CHUNK_SIZE=128
#校验=====
# 校验任务限制每个数据源支持的最大连接数
checkTask.datasource.max-connection=500
# 校验任务获取连接超时时间,单位:ms
checkTask.datasource.connection-timeout=10000
# 校验任务获取的连接池中维持的最小连接数
checkTask.datasource.minimum-idle=0
# 校验任务的最大并行任务数
checkTask.task.parallel.max-num=20
# 校验任务的子任务的最大并行任务数,即一个任务多少个表在同时校验
checkTask.subTask.parallel.max-num=200
# 校验任务的全量校验对FLOAT数据类型的校验精度
checkTask.checkFloatPrecision=6
# 校验任务的数据类型映射有一边是char数据类型就移除数据右侧空格进行对比 checkTask.isRemoveCharBlank=true
复制代码
4.2.3 执行安装
我这里采用的是安装默认内置库和 OCI 客户端并启动 YMP
更改内置库 SYS 用户默认密码(可选)
进入安装目录执行更改密码命令,以 yasdb_123 为例:
$ cd /home/ymp/yashan-migrate-platform/ $ sh bin/ymp.sh password --sys yasdb_123
# 进入安装目录执行安装命令
$ cd /home/ymp/yashan-migrate-platform/ $ sh bin/ymp.sh install --db /home/ymp/yashandb-personal-23.2.1.100-linux-x86_64.tar.gz --path /home/ymp/instantclient_19_19
复制代码
4.2.4 查看运行状态
$ cd /home/ymp/yashan-migrate-platform/ [ymp@localhost yashan-migrate-platform]$ sh bin/ymp.sh status
YMP is running, pid is 240743.
Built-in database is used, pid is 240616. [ymp@localhost yashan-migrate-platform]$
复制代码
4.2.5 查看版本
[ymp@localhost yashan-migrate-platform]$ sh bin/ymp.sh -v
Yashan-migrate-platform version: Release v23.2.1.0
YashanDB SQL Personal Edition Release 23.2.1.100 x86_64
YashanDB Loader Personal Edition Release 23.2.1.100 x86_64 2d13f1d [ymp@localhost yashan-migrate-platform]$
复制代码
4.2.6 访问 YMP
访问方式:http://IP:PORT/,PORT 默认 8090,初始账户名和密码是(admin/admin)。首次登录会提示修改密码。
4.3 卸载
$ cd /home/ymp/yashan-migrate-platform/ $ sh bin/ymp.sh uninstall
# 使用uninstall功能时可携带-f参数,强制清理环境 $ sh bin/ymp.sh uninstall -f
# 验证
$ ps -ef | grep yas ymp 20840 6322 0 10:02 pts/14 00:00:00 grep --color=auto yas
复制代码
卸载 YMP 时,会删除默认内置库(自定义内置库不受影响)并清空 db 和 yashan_client 文件夹,若想替换数据库版本,请在卸载后重新部署。
强制清理功能会使用 kill -9 强制清理当前用户下 YMP 启动的所有进程,并删除内置库及 yasldr 文件夹下所有内容,请谨慎使用,建议在专用的 YMP 用户下使用。
最后还需要手动删除~/.bashrc 中与 YashanDB 有关的环境变量。
4.4 启动与停止
4.4.1 启动 YMP
默认内置库启动 YMP:
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh start
复制代码
自定义内置库启动 YMP:
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh startnodb
复制代码
4.4.2 停止 YMP
默认内置库停止 YMP:
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh stop
复制代码
自定义内置库停止 YMP:
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh stopnodb
复制代码
4.4.3 重启 YMP
默认内置库重启 YMP:
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh restart
复制代码
自定义内置库重启 YMP:
$ cd /home/ymp/yashan-migrate-platform/
$ sh bin/ymp.sh restartnodb
复制代码
Caution:
在任务运行过程中停止或重启 YMP 会造成当前阶段任务运行失败,需重新开始当前阶段任务。
五、数据迁移
5.1 创建数据源
5.1.1 创建 Oracle 数据库数据源并测试
5.1.2 创建 YashanDB 数据库数据源并测试
5.2 创建迁移任务
5.3 评估迁移
评估完成结果如下:
5.4 迁移配置
评估迁移完毕后点击下一步迁移配置:
评估兼容非百分百的话需要在对象浏览里将所有不兼容数据进行过滤,选择忽略,然后点击重新刷新报告。
迁移对象可以根据实际情况进行选择。
点击下一步开始数据迁移。
5.5 开始迁移
迁移完毕后结果如下:
可以发现有一部分数据没有迁移成功。
5.6 一致性校验
六、遇到的问题与解决过程
6.1 遇到的问题
安装过程中使用了外置库,然后外置库和目标业务库是同一套数据,导致各种冲突现象,具体如下:
1.评估缓慢,不完全兼容的情况下忽略不兼容对象,刷下兼容报告时会报如下错误。
2.目标库数据源老提示账户锁定,反复解锁,反复锁定。
3.过段时间提示用户名或密码无效,新创建用户后进行了 dba 授权,过一会会被系统自动删除。
6.2 解决过程
1.将 YMP 单独部署在一台服务器上,使用默认内置库。
2.修改默认内置库为外置库,外置库不能和目标迁移数据库是一个实例。
在此特别感谢崖山官方的李梦莹大拿,凌晨 0:30 帮我把问题解决了
评论