注册
关于Oracle迁移数据到DM8数据库的问题及其处理方法
培训园地/ 文章详情 /

关于Oracle迁移数据到DM8数据库的问题及其处理方法

明月装饰你的窗 2025/06/13 202 0 0

在信创领域,很多现场业务,由于国产化适配的需求,需要更换底层数据库,如mysql或者Oracle数据库,替换成国产DM8数据库。Oracle作为关系型数据库的典型代表,经常会有迁移数据到DM8数据库的需求,通过达梦DTS迁移工具,将Oracle的数据,迁移至DM8数据库。在迁移过程中,则可能遇到各种相对比较特殊的问题。以下是现场迁移数据过程中遇到的一些问题及其处理方法。

问题一:Oracle迁移数据到DM8,报错“对象已存在”
DTS任务SQL手动执行报错’对象已存在’.png
在该问题中,我们通过manager,可以看到,DM8侧的同一个模式下,已经有一个报错同名的存储过程“SYNC_SSO_DATA_INSERT”;
如果遇到该问题,可以先在Oracle侧通过SQL命令确认同名对象:
select * from dba_objects where object_name='报错的对象名';
如以上报错,Oracle侧查询结果如下所示:
oracle同名对象.png
即Oracle侧,在同一个模式下,触发器和存储过程的对象名可以相同。
这里就涉及到Oracle和DM8数据库在底层逻辑上的一些差异: Oracle支持在同一个模式下,可以存在同名的存储过程和触发器(即一个触发器名namea,则存储过程名也可以是namea);而DM8的对象名在同一个模式下必须唯一,因此如果存在该情况,在迁移到DM8时,需要把同一个模式下的其中一个对象重命名。

问题二:通过DTS迁移Oracle数据到DM8,任务报错提示"数字溢出"
一般在DTS迁移任务失败后,我们可以通过查看失败任务详情,确认具体报错原因,不过在该示例中,任务详情点击进去为空,不过通过错误数据,可以判断异常数据的大概位置,具体如下图所示:
报错’数字溢出’.png
该报错主要需要看报错的表的字段。一般该报错是存在异常数据导致,例如数值类型字段,可以查询该字段max值是否超过设置最大长度等;时间类型字段,是否有异常数据,比如时间前面加了"-"符号,或者可以通过select * from 表 where v$时间类型字段名 <'1970-01-01 00:00:00'查询是否存在异常数据;文本等类型字段,则可以通过lengthb()函数查询字段长度是否超过限制。
在该示例中,暂时无法定位到具体异常数据原因。我们可以先通过DTS,导出该表的数据到SQL文件,然后vim编辑搜索上面图片的关键词,确认报错的那条数据是否存在问题。通过排查,最终发现,是源端Oracle该表的时间类型数据存在异常,具体如下图所示:
异常数据截图.png
最终在该示例里,发现客户源端Oracle数据,存在“-9812-04-9 07:56:04”这样的异常数据。针对该类型数据,则需要沟通客户侧是否直接在Oracle源端进行清理,若不清理的话,则可以把表的数据导出SQL文件,再SQL迁移至DM,根据报错,在SQL文件里逐个注释掉异常数据行解决;

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服