一、前言
我司主要软件生态数据库使用的是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 数据库版本支持
| 数据库 | 说明 |
|---|---|
| Oracle | 支持的版本为 11g,12c,19c,21c,部署形态为单机和RAC。 |
| MySQL | 支持的版本为 5.6,5.7,8.0。 |
| DM | 支持的版本为 8。 |
2.4.2 数据类型支持
| 数据库 | 支持数据类型 |
|---|---|
| Oracle | CHAR、NCHAR、VARCHAR2、NVARCHAR2、NUMBER、FLOAT、INT、INTEGER、SMALLINT、DEC、NUMBERIC、DECIMAL、DOUBLE PRECISION、DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE、INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND、LONG、RAW、LONG RAW、CLOB、NCLOB、BLOB、JSON |
| MySQL | TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、DECIMAL、FLOAT、DOUBLE、TINYINT UNSGINED、SMALLINT UNSIGNED、MEDIUMINT UNSIGNED、INT UNSIGNED、BIGINT UNSIGNED、CHAR、VARCHAR、DATE、DATETIME、TIMESTAMP、TIME、YEAR、BINARY、VARBINARY、TINYBLOB、TINYTEXT、BLOB、TEXT、MEDIUMBLOB、MEDIUMTEXT、LONGBLOB、LONGTEXT、JSON、BIT、ENUM、SET |
| DM | TINYINT、SMALLINT、INT、INTEGER、BIGINT、DEC、DECIMAL、REAL、FLOAT、DOUBLE、DOUBLE PRECISION、NUMBER、NUMERIC、CHAR、CHARACTER、VARCHAR、VARCHAR2、NVARCHAR、NVARCHAR2、NCHAR、DATE、TIME、DATETIME、TIMESTAMP、TIME WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE、TIMESTAMP WITH TIME ZONE、DATETIME WITH TIME ZONE、INTERVAL DAY TO SECOND、INTERVAL YEAR TO MONTH、BINARY、BLOB、CLOB、IMAGE、LONG、VARBINARY、LONGVARBINARY、LONGVARCHAR、RAW、TEXT |
三、本次体验环境说明
| 正式环境 | 软件名称 | 软件版本 | 硬件配置 | 操作系统 | 备注 |
|---|---|---|---|---|---|
| 源端数据库 | Oracle | 企业版11.2.0.4 | CPU:8V 内存:16G 磁盘:1T | CentOS Linux release 7.4.1708 (Core) | 独立服务器 |
| 目标端数据库 | YaShanDB | 个人版23.2.1.100 | CPU:24V 内存:32G 磁盘:1T | CentOS Linux release 7.6.1810 (Core) | YaShanDB服务器与YMP共用一台服务器 |
| 迁移平台 | Yashan Migration Platform | 23.2.1 | CPU:24V 内存:32G 磁盘:1T | CentOS Linux release 7.6.1810 (Core) | YMP服务器与YaShanDB共用一台服务器 |
四、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默认使用端口
| YMP监听 | 数据库监听 | 主机间通信 | yasom | yasagent |
|---|---|---|---|---|
| 8090 | 8091 | 8092 | 8093 | 8094 |
我们只需要放行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官网 (https://www.oracle.com/cn/database/technologies/instant-client/linux-x86-64-downloads.html)下载OCI客户端并依据官网所列步骤进行安装。
YMP现仅支持OCI Version 19.19.0.0.0及以上版本。建议下载和安装的版本信息如下:
x86平台使用:instantclient-basic-linux.x64-19.19.0.0.0dbru.el9.zip
arm平台使用:instantclient-basic-linux.arm64-19.10.0.0.0dbru-2.zip
上传安装包至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环境准备
使用默认内置库时,本步骤可省略。(推荐使用内置库,比较省事。)
使用外部内置库时:
-
如需一个全新的YashanDB单机环境,参考YashanDB官网文档进行安装部署。
-
如为一个已有的YashanDB单机环境,则需由DBA在该环境中执行如下脚本:
–创建一个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,建议使用当前较新的版本。
| 浏览器支持 | 要求版本 |
|---|---|
| Google Chrome | 88 及以上版本 |
| Microsoft Edge | 88 及以上版本 |
| Firefox | 78 及以上版本 |
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帮我把问题解决了。
七、总结与建议
7.1总结
1.部署起来相对简单,如果能出个一键部署脚本更好。
2.对象兼容性评估和数据迁移速度都很快。
3.发现一个问题,元数据和数据一起迁移的时候没等元数据迁移完毕数据就开始迁移了,我做的这个迁移过程有百分之40多的数据没有迁移成功。

4.不兼容对象问题汇总:
(1)带有LOB字段的表,带有存储的DDL不兼容。

(2)自定义类型TABLETYPE长度不兼容。

只要长度不超过32000可以成功创建。

(3)创建相关对象提示表或视图不存在。
创建索引提示表或视图不存在。

这个应该是目标数据源用户和源端的用户不一致导致。
创建约束提示表或视图不存在。

创建触发器提示表或视图不存在。

(4)触发器不兼容

(5)视图不兼容

(6)自定义函数不兼容

(7)对象夸用户访问会报错

(8)创建包失败

5.数据迁移失败


看了下几乎都是这一个错误就是字段长度问题,源库字符集为zhs16gbk目标端为utf8,两种编码所占字节长度不同需要进行扩增长度。
6.新建任务时如果原来的源端用户被评估过,不能再次进行评估,提示被占用。

需要删除原有任务才能进行重新评估。
7.2建议
1.内置库和外置库容易混淆,建议只搞一个配置,由用户自己选择或填写,并在软件界面提示不能和目标数据库选择一个实例,或者能实现在选完之后软件自动做一个校验最好,因为一旦客户填选错误会导致目标端生产数据丢失的风险。
2.关于对象兼容评估不是百分比兼容不允许迁移的问题建议可以先迁移评估成功的,不成功统一弄到迁移失败报告和任务里,后续进行处理。目前是必须百分百,如果不兼容对象太多不可能一直在界面进行兼容性修改,时间长了客户端会话会过期。
3.元数据和数据一起迁移的时候应该控制一下先后顺序,或者是已经迁移的元数据表可以进行数据迁移,保障不会出现元数据没有迁移完的情况数据就开始迁移了,导致数据迁移失败,这个需要官方确认一下是不是有这种情况存在,我看进度条是这样的情况。
4.不兼容对象问题的建议:
(1)带有LOB字段的表,带有存储的DDL不兼容。
建议读取DDL的时候不要带存储信息,不是崖山数据库不兼容BLOB字段,是存储DDL写法有差异,完全可以使用目标用户的默认表空间,或者指定一个新的表空间,如果支持指定表空间应该支持批量修改。
(2)自定义类型TABLETYPE长度不兼容。
长度可以和Oracle做进一步的兼容。
(3)创建相关对象提示表或视图不存在。
建议迁移的时候数据源只是一个迁移用户,迁移过程中可以指定目标端模式对应关系,这样比较好点,目前我看源端的模式可以选择,目标端的没有选择的地方。
(4)触发器不兼容
单独测试了一下还是提示不兼容,应该是不支持:new这种写法,具体需要官方再确认一下。
YAS-04253 PL/SQL compiling errors:
[21:22] YAS-04243 invalid identifier ":NEW"."F_ID"
(5)视图不兼容
看到不兼容的语句里注释部分有分号,应该是按语句处理的,不是按行注释进行解析的,可以进行兼容一下。
(6)自定义函数不兼容
utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => passwd))这个是Oracle独有的包,后期可以考虑兼容进去。
(7)对象夸用户访问会报错
建议迁移评估的时候把对象权限及相关依赖也进行评估一下。
(8)创建包失败
继续加强自定义类型及相关系统包的兼容支持。
5.数据迁移失败
关于数据迁移失败主要是两端字符集不同导致的,这个可以借鉴一下达梦的做法,数据库初始化的时候字段长度可以按字节也可以按字符长度,这样做数据迁移的时候就不会有这个问题了。
6.新建任务时如果原来的源端用户被评估过,不能再次进行评估,提示被占用。
建议可以创建多个任务进行重新评估,新建任务的评估记录可以加个版本号或者时间戳都可以。
7.其他建议
(1)建议数据迁移增加一个预估时间。
(2)建议增加一个数据迁移的定时任务功能,可以选择数据迁移在什么时间点执行,比如白天业务忙,可以选择凌晨几点自动迁移。
(3)增加任务失败单独列表,专门处理迁移失败的任务。
(4)增强相关依赖性检测,例如对象授权,系统权限,用户角色等,例如要迁移走的用户都有那些用户依赖这个用户的对象,这样可以知道迁移完毕停止该用户服务后对其他用户的影响,亦或者是该用户依赖其他那些用户的对象访问,比如夸用户对象访问。
注:可以参考一下阿里早期有一款亚当工具的思路,两端都创建专用的迁移用户,授予相关的系统视图和数据字典查询权限进行详细分析,包括系统权限,对象权限,角色,跨用户访问,慢sql等。慢sql迁移的时候可以帮助客户一起优化了,要不迁移过去慢的话会说目标库有问题。




