#迁移任务

# 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.yml中的配置项: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 → 重新迁移
源库进程异常中断 如果正处于处于表空间初始化阶段,工具会timeout,其他阶段无影响 任务失败 → 重新迁移
目标库进程异常中断 工具报错timeout 任务失败 → 恢复目标库 → 重新迁移
内/外置库进程异常中断 工具界面全部不可用 重启数据库 → 重启YMP →重新迁移
内/外置库数据故障无法重启 界面所有数据丢失 重新部署安装YMP → 重新新建任务迁移
# 5. 覆盖策略下,如果迁移表被不在迁移范围内但在目标端已存在的其他表的外键关联着,这个表元数据迁移会失败

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

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

对于常见数据库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.yml配置文件中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时,可以对数据迁移任务进行立即终止操作后再进行重试。

下载文档
复制链接