oracle 把字段建成序列,从 Oracle 迁移 DM

原有的系统或开发习惯为 Oracle 的用户,可以参考这个文档《DM DBA 手记之 Oracle 移植到 DM》。

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

如下图所示:

f415ab9bb06a4495218c9526e073ad9c.png

6c9c100d615b003e2b415d88da2ff7c7.png

【问题原因】:

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

【解决方法】:

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

b8834d6bc8cf8708cf5ca5374e08efd4.png

46f7a250df919ddacf6b6bdc931fdd61.png

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

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

59fb6c961478d250dd4ddafa034a6570.png

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

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

需要注意 Oracle 的 date,datetime 和 timestamp 都转换成 DM 的 timestamp。

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

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

违反引用约束

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

294466ccf7b225c4703b741e42c28e3a.png

【解决方法】:

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

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

4e3bd90d978007d968383e293c2a0dc5.png

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

8428289dd10359ecc67757f5f39f387c.png

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

0253a7f50efcfaa427906b5f4e0a083d.png

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

违反唯一性约束

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

3c729bd0eec5c3a727e3f59b5f100b02.png

【解决方法】:

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

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

c49790ee9eedad11ae921205c3aa18fe.png

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

97432323fe0d23c86b408955db63a33a.png

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

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

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

331b1159519821be62db269e421c9b0e.png

【解决方法】:

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

连接尚未建立或已经关闭

【问题描述】:

从 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。

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 类型。

Oracle 的 dmp 文件导入 DM 报错:终止导入请使用更高级别的工具

Oracle 数据库的 dmp 文件不能导入到达梦数据库,每种数据库导出的 dmp 文件,都具备自身数据库特有的加密格式,其它架构的数据库肯定是无法识别的。

Oracle 数据库的数据信息可以通过达梦数据库自带的数据库迁移工具 DTS 迁移到 DM 数据库。

迁移过程中出现的错误:JAVA HEAP SPACE

dts 所在机器内存不足导致/本机内存不足。

迁移过程中出现的错误:违反协议

一般是 Oracle 的 jdbc 驱动问题导致,尝试更换驱动包。

报错:序列最大值超出达梦范围

分析一: 指定序列能生成的最大值,如果忽略 MAXVALUE 子句,则降序序列的最大值缺省为-1 ,升序序列的最大值为 9223372036854775807(0x7FFFFFFFFFFFFFFF) 。

非循环序列在到达最大值之后,将不能继续生成序列数;但是 Oracle 中最大值 28 个 9,迁移到DM7 时报序列最大值超出达梦范围的错误(最新的 dts 版本已经将超过 DM7 最大值的序列的最大值直接转换成 9223372036854775807)

分析二:对于这类报错,需要分析源库序列用途,目的库范围是否能够满足使用情境。如可以满足,则按照目的 DM 的可定义范围设置,如存在风险,则考虑在应用层面修改或者采取其他措施规避风险。

Oracle 迁移到 DM 报错:精度超出范围Oracle 迁移到 DM 数据库,数据类型的映射关系,可以参考 DTS 迁移工具的帮助菜单-帮助主题–数据类型映射–默认数据类型映射关系。

可能是由于 Oracle 和 DM 数据库字符集不一样的原因:比如 gbk 和 utf-8 中文占用的字节数不一样。 在迁移的时候,可以将字符长度映射调正大。

1d81ea9a4ed45cf2bb417720a67bfe71.png

如果碰到中文对应到 DM 都需要三倍长度,可以检查初始化数据库的时候,达梦数据库选择字符串是否以字符为单位。(length_in_char=1试试)

Oracle 迁移过程中出现的错误:试图在 blob 或者 clob 列上排序或比较

达梦数据库中是不允许对大字段(clob blob)类型的列进行排序操作的,部分新版本可以修改配置 ini 参数 ENABLE_BLOB_CMP_FLAG=1。

包含 blob 类型的数据表都迁移不动

需要调小 dts 里面大字段表每次读取跟提交行数。

bd4ae4a20a48606868dc46b15c3a1dd0.png

DTS 使用时候选择删除后再拷贝记录,是否会删除源库的数据

不会,删除的是目的端的数据。

迁移的时候报错:ORA-00942

缺少查询字典权限导致。可以授予用户相应权限,语句如下:

grant select_catalog_role to user_name;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值