#迁移任务

# 1. 在迁移过程中遇到报错信息为:“YAS-00008 type convert error : literal does not match format string”

目标端数据库需要设置 alter system set DATE_FORMAT='yyyy-mm-dd hh24:mi:ss' scope=spfile,并重启目标端数据库。

# 2. 在迁移过程中遇到报错信息为:“YAS-02011 no free blocks in large pool”

方案一:修改位于conf/application.properties中的配置项:import.degree_of_parallelism,默认值为16个并发,需要根据目标数据库使用情况减小并发的值,并重启YMP。
方案二:目标端数据库调大LARGE_POOL_SIZE到64M,默认16M,执行 ALTER SYSTEM SET LARGE_POOL_SIZE = 64M SCOPE=spfile,并重启目标端数据库。

# 3. Oracle作为源端时,创建表空间数据文件时指定的最大大小为何与YMP界面显示的不一致?如创建表空间数据文件时指定MAXSIZE为100K,但YMP界面却显示104K?

YMP通过视图 DBA_DATA_FILES 查询表空间数据文件参数,例如最大大小:SELECT TABLESPACE_NAME, MAXBYTES FROM DBA_DATA_FILES,Oracle下该视图的值并不一定与实际执行的SQL语句保持一致,系Oracle规格问题。

# 4. 元数据迁移阶段一些常见故障场景分类和解决方式
故障原因 表现形式 解决方法
YMP进程异常中断 YMP界面打不开 重启YMP → 重新迁移
源库进程异常中断 如果正处于处于表空间初始化阶段,YMP会timeout,其他阶段无影响 任务失败 → 重新迁移
目标库进程异常中断 YMP报错timeout 任务失败 → 恢复目标库 → 重新迁移
内/外置库进程异常中断 YMP界面全部不可用 重启数据库 → 重启YMP →重新迁移
内/外置库数据故障无法重启 YMP界面所有数据丢失 重新部署安装YMP → 重新新建任务迁移
# 5. 覆盖策略下,如果迁移表被不在迁移范围内但在目标端已存在的其他表的外键关联着,这个表元数据迁移会失败

根本原因在于覆盖表的时候,需要把关联的外键先删掉,在表迁移完成后,再把迁移范围外的这个外键补建回来,如果补建报错,会记录在这个表的详情里失败。可能失败的原因有:

  1. 主键变动,名称变化或者类型不匹配,创建外键语句报错。
  2. 外键所在的表有数据,覆盖后的表已经没有了数据,创建外键的时候,会报错:“YAS-02033 foreign key constraint violated: parent key not found”。
# 6. 数据迁移阶段一些常见故障场景分类和解决方式
故障原因 表现形式 解决方法
YMP进程异常中断 YMP界面打不开 重启YMP(会删除临时的csv文件) → 重新迁移未成功的表
源库进程异常中断 YMP报错timeout,迁移任务失败 任务失败 → 重新迁移未成功的表
目标库进程异常中断 YMP报错timeout,迁移任务失败 任务失败 → 恢复目标库 → 重新迁移未成功的表
内/外进程异常中断 YMP界面全部不可用 恢复内/外内置库 → 刷新可以看到任务还是继续数据迁移中
内/外置库数据故障无法重启 YMP界面所有数据丢失 重新部署安装YMP → 重新新建任务迁移
# 7. Oracle作为源端时,创建表空间数据文件不选择自动增长,为何YMP界面显示的文件最大大小原始值为0,比数据文件大小还小?

YMP通过视图 DBA_DATA_FILES 查询表空间数据文件参数,当不选择自增时,Oracle下该视图显示的MAXSIZE为0,系Oracle规格问题。

# 8. 当在MySQL数据库建立一个表空间时,如CREATE TABLESPACE ZX\_DATA ADD DATAFILE 'zx\_data.ibd' ENGINE = InnoDB INITIAL\_SIZE = 500k AUTOEXTEND\_SIZE = 500k;为什么在表空间迁移一栏显示的参数与建立时不符?

MySQL表空间显示值问题

这实际上是建立表空间时,MySQL内部对其参数做了合法化调整,工具显示的是MySQL调整后的真实表空间大小,并为其推算出适合YashanDB的表空间初始化参数。

# 9. MySQL、达梦数据库的空字符串如''迁移到YashanDB时的表现是什么?

工具会将MySQL、达梦数据库空字符串迁移到YashanDB数据库时转换为null,原因是其值在YashanDB是非法值(YashanDB会自动转化空字符串为null),但在MySQL是合法值。

# 10. MySQL数据库日期、时间类型的全0值(如time类型值为00:00:00)迁移到YashanDB时的表现是什么?

工具会将MySQL、达梦数据库日期、时间类型全0值迁移到YashanDB时转换为null,原因是其值在YashanDB是非法值(非有效格里高利日期时间),但在MySQL是合法值(实际上是MySQL部分版本设置了SQL MODE,在插入null时自动转化为全0值)。

Note

如果您选择数据迁移兼容null值选项(默认不勾选),则会根据数据冲突情况,智能的删除YashanDB的非空约束,保证数据可以正常迁移,您不必担心找不回被删除的约束,这些将在迁移报告中有所体现,但需要格外注意,工具创建主键在元数据阶段2,此时已经完成了数据迁移,由主键和数据冲突导致的兼容性问题,可能导致主键迁移失败,对迁移失败的主键,将会有相应的报错提示。

# 11. 为什么我在MySQL、达梦数据库中的charvarchar字段插入了若干空格,如,迁移后,在YashanDB的表现是null' '
CREATE TABLE T(
   A CHAR(10),
   B VARCHAR(10)
);

INSERT INTO T(A,B) VALUES (‘ ’,‘ ’);
Copied!

对于常见数据库char字段等类型中插入字符,会默认使用' '补全整行,而varchar字段等类型不会;故迁移中工具采取将多余的' '去除策略插入YashanDB,则对YashanDB来说认为空字符串''即是null(见第5点),而varchar不做任何处理则表现即为null' '

# 12. MySQL作为源端时,为什么数据迁移阶段显示的表大小和真实的表大小有很大差距?

工具对MySQL5.7以上的使用共享表空间的表大小,采用查询MySQL的information_schema.TABLES的视图来确定,您可以尝试使用ANALYZE TABLE test_table的方式刷新统计信息(该操作可能非常耗费资源,建议在业务低峰期使用),根据MySQL官方文档的描述,该视图查询的表大小存在误差,且数据量越多或含LOB列情况,误差越大。

# 13. 在迁移过程中报错为:“YAS-04857 column ID duplicated” 是为什么?

该问题系yasldr旧版本问题,取 yasldr 新版本即可解决。

# 14. 在数据迁移及元数据迁移第二阶段终止任务时无法立即终止,较差情况下终止过程可能需要约10min

等待终止完成或者重启YMP后台服务(具体操作:到YMP的安装路径下,执行sh ymp.sh restartsh ymp.sh restartnodb)。

# 15. 元数据迁移,策略为覆盖时,某外键所在表不迁移,该外键迁移失败,报错:“YAS-02051 such a referential constraint already exists in the table”

根据创建外键DDL获知该外键所在表及所在列:

  • 若已存在的外键无需重建,则忽略该错误保留现有外键即可。
  • 若需要重建该外键,可手动在目标端删除该外键,重新进行迁移即可。目标端外键名查询可通过:SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE OWNER = 'schema_name' AND TABLE_NAME = 'table_name' AND CONSTRAINT_TYPE IN ('FOREIGN KEY', 'R', 'F') 获取,删除该外键可通过:ALTER TABLE schema_name.table_name DROP CONSTRAINT constraint_name 删除。
# 16. 在迁移过程中,元数据迁移遇到报错信息为:“YAS-02010 user 'XXX' does not exist”

元数据迁移前,默认会迁移涉及到的用户(YashanDB中名称同SCHEMA),以保证元数据迁移不会报错。
迁移策略是:如果目标端数据库用户存在则保留,不存在则创建。 迁移中,对象异常信息中报YAS-02010,大概率是因为创建用户时异常,从日志可见具体的异常原因,目前遇到过以下原因导致:

  1. 创建用户时,报错:“YAS-00103 no free block in dictionary cache”。 遇到该报错,目标端数据库需要设置 alter system set SHARE_POOL_SIZE= xxx scope=spfile,并重启目标端数据库。其中xxx需要根据迁移涉及到的用户数来设定,经验值每多创建一个用户,建议增加1.5M的内存配置。
    256M可以创建165个 ~=1.55M。
    300M可以创建207个 ~=1.44M。
    1024M可以创建889个 ~=1.15M。
    2048M可以创建1851个 ~=1.1M。
# 17. 当模式名或表名带有application.properties配置文件中export.csv.path.replacement.from配置项指定的字符时,由于导入工具限制,YMP会替换此类符号,替换后可能出现相同路径,导致迁移失败,报错信息为:YAS-00313 failed to open file xxx.csv, errno 2, error message "No such file or directory"

规避方案为:对失败表重新迁移。

# 18. 当达梦数据库作为数据源时,有概率出现部分表长时间处于迁移中而无法完成时,怎么办?

若根据硬件资源及对应表的数据量判断预估应该在预期时间段内完成迁移的表却迟迟处于迁移中,且对应时间的I/O为0时,可以对数据迁移任务进行立即终止操作后再进行重试。

# 19. 评估时,使用批量修改(或者查看DDL时单个修改)对象原有的表空间到源端不存在的表空间上后,评估通过后对象在迁移时报错,找不到这个表空间,怎么办?

目前迁移配置界面展示的表空间信息是迁移范围内源端对象涉及到的表空间信息,对于评估手动修改指向的新的表空间,如果超出源端数据库已存在表空间,暂时不支持自动迁移,需迁移前在目标端手动创建后再迁移对象。

# 20. 大量对象迁移时,下一步:离线迁移失败报错:“YAS-04003 maximum number of open cursors is xxx”,怎么办?

YMP使用默认内置库安装时,会自动调整内置库配置参数:ALTER SYSTEM SET OPEN_CURSORS=3000 SCOPE=SPFILE; ALTER SYSTEM SET CURSOR_POOL_SIZE=64M SCOPE=SPFILE
自定义内置库安装YMP,需要手动保证自定义的内置库配置满足迁移业务使用,可参考默认内置库配置。OPEN_CURSORS=xxx的值需根据任务中迁移对象个数调整,经验来看,迁移1000个对象,OPEN_CURSORS需要3个左右的游标配置。

# 21. start.log日志中打印 "### 直接内存不足,导出降速" 时,应如何处理?

出现此警告,表示直接内存池被消耗殆尽,这会导致导出速率下降,但不会导致任务失败。解决方式为:调大application.properties中的ymp_direct_memory配置项,并重启YMP。此项默认值为2GB,可以保证单个基于JDBC的数据迁移任务拥有足够的直接内存;当同时启动多个基于JDBC的数据迁移任务时,可能会出现直接内存不足的情况。

# 22. 迁移过程中,YMP出现响应变得极慢,且日志或迁移失败原因中出现 java.lang.OutOfMemoryError: GC overhead limit exceeded 时,应如何处理?

出现此报错,意味着程序的内存耗尽,无法响应正常的业务请求,一般是用户增大了迁移配置页面中[高级配置-性能配置]的参数,提高了可以同时进行数据迁移的表数量导致的。 数据迁移阶段的内存占用参考如下:

  • 如果表内存在大量的大lob列(超过8K),则每张表对内存的占用不超过1.6GB。对于此情况,如果[高级配置-性能配置]的值为4,则ymp_memory的值应该配置为7G或更高;
  • 如果表内不存在大量的大lob列(超过8K),则每张表对内存的占用不超过1GB。对于此情况,如果[高级配置-性能配置]的值为4,则ymp_memory的值也应该配置为4G或更高;

解决方案:

  1. 在YMP所在机器的可用内存充裕的情况下,通过调高配置文件中ymp_memory的值,并重启YMP来解决此问题;
  2. 如果YMP所在机器的可用内存并不充裕,可适当减小[高级配置-性能配置]的值来保证迁移成功;
# 23. 由于yasldr 22.2版本限制, 数据迁移在dts模式下暂不支持密码中含有“@”字符
# 24. DM做源迁移时,查询表空间初始化信息报错:“表空间xxx处于脱机状态”,怎么办?

该提示为DM数据库服务端提示,查询时有处于脱机状态的表空间,可刷新再查询一次,刷新操作见截图:
刷新表空间信息

# 25. 出现数据迁移失败,报错信息为 BufferOverflowException 时,怎么办?

规避方案为:将配置项 export.jdbc.lob.headSize 设置为0,关闭小lob行内导入优化。

# 26. 迁移任务失败,提示:元数据迁移阶段失败:获取连接池连接异常:Oracle连接池 - Connection is not available, request timed out after xxx ms。

出现该问题是由于元数据迁移线程等待从Oracle源端连接池获取连接超时导致的,规避方案为:

  1. 将配置项migration.connectionMaxWaitTime调大,增加等待连接池获取连接的时间。
  2. 可以适当调大migration.parallel.query,增加连接池的数据库连接个数,避免线程等待。

# 27. 迁移任务失败,日志中出现报错 Yasldr异常信息 YAS-02143 invalid username/password, login denied

出现该问题可能的原因是YMP环境的OPENSSL版本低于1.1.1或YMP环境与目标端环境OPENSSL版本不一致。
解决方案为:检查和升级YMP环境,使部署环境和目标端数据库部署环境OPENSSL版本是否一致且不低于1.1.1版本。

# 28. 迁移任务失败,日志中出现报错 file too short

出现该问题可能的原因是安装包解压出错,数据迁移使用的依赖文件软链接失效,请排查环境机器使用的unzip工具版本。
软链接失效
已知的问题是机器上unzip指令由BusyBox工具箱提供,在v.1.27.0版本中的unzip解压有问题,软链接失效。
解决方案:

  1. 升级BusyBox的版本,测试v1.36.1版本可行,建议升级到v1.36.1及以上版本。
  2. 不使用BusyBox提供unzip工具,自行安装unzip工具使用。
    正常解压的文件如: 软链接正常
pdf-btn 下载文档
copy-btn 复制链接