暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从 Oracle 迁移到DM8达梦数据库常见问题

原创 达梦 2021-01-31
3257

只选择迁移表,多出其他对象

如下图所示:

选择对象

多出的对象

【问题原因】

勾选了目录、公共同义词和上下文。

【解决方法】

返回上一步,取消勾选则正常。

取消勾选

选择迁移对象

varchar2 (4000) 迁移后变成 (3900)

DM 数据库根据页大小,varchar 字段最大长度有限制。具体限制如下:

对照说明

DTS 内部有字段类型映射,同时也会根据差异情况判断,在 8 kB 页大小情况下,将 Oracle 的 varchar2 (4000) 迁移成 varchar2 (3900)。

Oracle 迁移到 DM 有关数据类型/语法的注意事项

需要注意 Oracle 的 datedatetimetimestamp 都转换成 DM 的 timestamp

由于 Oracledate 既可以只存日期,也可以存放日期时间,DTS 迁移表结构过程中无法识别具体字段中内容再确定目的端数据类型,所以统一迁移成了 timestamp,迁移后的数据时间信息为 00:00:00.000,不影响时间字段比较和计算,如果部分字段的确只需要 date 类型则需要在 DM 中将对应字段调整为 date 类型。

DM 数据库和 Oracle 的语法大致相同,大部分都不需要修改,可以把 Oracle 中的语法到 DM 中执行,如果有报错的部分,需要查看系统管理员手册和程序员手册来查看相应的需要修改的语法部分。

违反引用约束

这种问题主要是由外键约束造成的,父表的数据没有迁移,先迁移了子表的数据,错误如下图所示:

错误提示

【解决方法】

迁移的时候先不迁移外键等约束,在选择好要迁移的表时,点击【转换】,按照以下步骤进行迁移。

  1. 第一次只选择表定义,不选择约束等,如下图所示:

选择表定义

  1. 第一次迁移完成后(确保没有错误),第二次只选择数据,如下图所示:

选择数据

  1. 第三步选择约束、索引等,如下图所示:

选择约束索引

按照上面三步迁移,基本上都可以顺利迁移成功。

违反唯一性约束

这种情况是因为表中设置了唯一性约束或者主键约束,但是数据中有重复记录。有可能是原始库的约束被禁用了,或者数据重复迁移造成的。

错误信息

【解决方法】

在确定源数据没有问题的情况下,迁移的时候选择删除后再拷贝,如下图所示:

在迁移界面中,选中要迁移的表,然后点击【转换】。

转换

在弹出的窗口中选择删除后拷贝,如下图所示:

删除后拷贝

按照上述操作即可迁移成功。

迁移视图提示:无效的用户对象

这个问题一般是因为在迁移视图之前,没有将视图依赖的表迁移过去,如下图所示:

错误提示

【解决方法】

严格按照迁移的顺序,先迁移表,然后再迁移视图、存储过程、函数的顺序迁移即可。

连接尚未建立或已经关闭

【问题描述】

从 Oracle 迁移数据到 DM 数据库,数据迁移时提示连接尚未建立或已经关闭。

【解决方法】

  • 原因一:这个问题有可能是因为 Oracle 库中存在非法的数据,例如:-5486-12-31 00:00:00 这样的非法的时间,在批量绑定插入的时候 JDBC 未作校验,服务器端检测到就会把这个连接剔
    除,就会报这个错误。新版的 JDBC 驱动(2019 年 7 月以后)已经对此类问题进行了处理,增加了校验,碰到非法的数据会直接报错。碰到这种问题建议使用最新的 JDBC 驱动,替换掉迁移工具使用的 JDBC 驱动即可。
  • 原因二:迁移连接用户设置了会话时间限制,放开会话连接限制即可,数据库参数 max_sessions 设置。
  • 原因三:迁移过程中数据库连接断开了重新迁移。

报错:精度必须大于标度

【问题描述】

从 oracle 迁移到 DM 的时候有一个报错:精度必须大于标度。

【解决方法】

Oracle 中 number (m,n) 允许 n>m,但是在 DM 中是不允许的,DM 中 m>=n,m 表示精度,n 表示标度。精度是一个无符号整数,定义了总的数字数;标度定义了小数点右边的数字位数。

碰到这种问题一方面要思考一下 Oracle 里面列定义是否弄错了,如果是特意这样设计的,要搞清楚这个列到底需要存放什么样的数据,单独迁移这张表,对 DM 数据类型进行修改。

Oracle 中 raw 类型在 DM 中可以用哪种类型

Oracle 中 raw 类型在 DM 中可以使用 varbinary 代替。

如果您第一次使用 DM 数据库,可以参考如下链接中的 ORACLE 移植到 DM,里面有一些相关的字段类型映射内容。

http://bbs.dameng.com/forum.php?mod=viewthread&tid=51084&extra=page%3D1

Oracle 的 date 类型是对应 DM 哪种类型

【问题描述】

DM 的 DATE 类型不能存放时分秒吗?Oracle 的 date 日期类型是对应 DM 的 datetime 类型吗?

【解决方法】

如果设置兼容参数 COMPATIBLE_MODE = 2,date 类型默认会建成 timestamp 类型。

说明

Oracle 的 DATE 类型中包括年、月、日、时、分、秒,DM 中 DATE 类型只包括年、月、日,而时、分、秒在 TIME 类型中。DM 中包含年、月、日、时、分、秒的数据类型是 TIMESTAMP 类型。从 Oracle 迁移到 DM 时要注意 DATE 类型引起的日期比较问题,可以将 DATE 换成 TIMESTAMP 类型

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论