只选择迁移表,多出其他对象
如下图所示:
【问题原因】:
勾选了目录、公共同义词和上下文。
【解决方法】:
返回上一步,取消勾选则正常。
varchar2 (4000) 迁移后变成 (3900)
DM 数据库根据页大小,varchar 字段最大长度有限制。具体限制如下:
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 中执行,如果有报错的部分,需要查看系统管理员手册和程序员手册来查看相应的需要修改的语法部分。
违反引用约束
这种问题主要是由外键约束造成的,父表的数据没有迁移,先迁移了子表的数据,错误如下图所示:
【解决方法】:
迁移的时候先不迁移外键等约束,在选择好要迁移的表时,点击【转换】,按照以下步骤进行迁移。
- 第一次只选择表定义,不选择约束等,如下图所示:
- 第一次迁移完成后(确保没有错误),第二次只选择数据,如下图所示:
- 第三步选择约束、索引等,如下图所示:
按照上面三步迁移,基本上都可以顺利迁移成功。
违反唯一性约束
这种情况是因为表中设置了唯一性约束或者主键约束,但是数据中有重复记录。有可能是原始库的约束被禁用了,或者数据重复迁移造成的。
【解决方法】:
在确定源数据没有问题的情况下,迁移的时候选择删除后再拷贝,如下图所示:
在迁移界面中,选中要迁移的表,然后点击【转换】。
在弹出的窗口中选择删除后拷贝,如下图所示:
按照上述操作即可迁移成功。
迁移视图提示:无效的用户对象
这个问题一般是因为在迁移视图之前,没有将视图依赖的表迁移过去,如下图所示:
【解决方法】:
严格按照迁移的顺序,先迁移表,然后再迁移视图、存储过程、函数的顺序迁移即可。
连接尚未建立或已经关闭
【问题描述】:
从 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 中文占用的字节数不一样。 在迁移的时候,可以将字符长度映射调正大。
- 如果碰到中文对应到 DM 都需要三倍长度,可以检查初始化数据库的时候,达梦数据库选择字符串是否以字符为单位。(length_in_char=1试试)
Oracle 迁移过程中出现的错误:试图在 blob 或者 clob 列上排序或比较
达梦数据库中是不允许对大字段(clob blob)类型的列进行排序操作的,部分新版本可以修改配置 ini 参数 ENABLE_BLOB_CMP_FLAG=1。
包含 blob 类型的数据表都迁移不动
需要调小 dts 里面大字段表每次读取跟提交行数。
DTS 使用时候选择删除后再拷贝记录,是否会删除源库的数据
不会,删除的是目的端的数据。
迁移的时候报错:ORA-00942
缺少查询字典权限导致。可以授予用户相应权限,语句如下:
grant select_catalog_role to user_name;
|
DTS 迁移工具未响应/卡住
- 可能与客户端机器性能有关
- 建议一次少选一些表;在进行重新迁移时,迁移时勾选清空数据库迁移,避免数据重复
- 数据库迁移的顺序,参考达梦云适配中心的迁移手记
- 低版本的客户端将低版本的数据库中的数据迁移到高版本中,比如:使用 DM7 迁移工具,迁移 DM7 至 DM8,迁移卡住。这时请更换成 DM8 的 DTS 工具进行迁移。
迁移报错,提示“-3236 此列列表已索引”
出现这个提示,证明列表已经有索引了,可以到目标数据库查一下,有的话就忽略这个报错。
当前对象被占用
【问题描述】:
oracle 迁移 dm 之后,想把迁移的模式删了,重新迁移一份,删除不了,一直提示错误号: -6509 错误消息: 第 1 行附近出现错误: 当前对象被占用。
【问题解答】:
查看是否开了多个窗口的管理工具,把无用的界面关闭了。是否有未结束的应用连接在操作。
删除模式时加上级联删除选项,例如:
DROP SCHEMA <模式名> CASCADE;
|
迁移过程中出现的错误:被引用列未添加索引
一般出现在添加外键,建议先添加唯一约束然后添加外键约束。
迁移过程中出现的错误:对象不再存在
一般是导入的表是临时表,重新导入即可。
修改兼容性参数COMPATIBLE_MODE=2后,SQL走索引查询is null无法查询出空字符串数据
【问题说明】:
在修改兼容性参数COMPATIBLE_MODE=2后,SQL查询where条件X is null,执行计划走X列单列索引或者以X列为前导列的组合索引无法查询出空字符串数据,且重建索引也没有作用,禁用或者删除对应索引可以正常查询出包含空字符串的数据。
原因是由于在修改兼容性参数COMPATIBLE_MODE=2之前,数据表中已有空字符串数据,修改COMPATIBLE_MODE=2之后新插入的空字符串数据自动转换为NULL存入表中。
COMPATIBLE_MODE参数相当于初始化参数,需要在创建数据库实例之后或者创建业务用户表之前设置好。
【解决方法】:
新建实例在创建业务用户表之前修改兼容性参数COMPATIBLE_MODE=2,然后使用迁移工具重新迁移数据。或者手动update空字符串数据为null。
DTS工具从oracle迁移到dm库,提示迁移完成,但实际数据量与源库不匹配,缺失数据。
明确迁移源库oracle数据库的具体版本信息,一定要在DTS迁移工具中指定源oracle数据库的驱动为自动义的且是与oracle版本适配的jdk版本,因为默认dts工具在选择源端驱动时时默认的一个驱动版本,不一定和真实的库完全匹配。
oracle数据库版本与JDK的版本选择,参考如下:
Oracle Database versionJDBC Jar files specific to the release 21.1—— ojdbc11.jar with JDK11, JDK12, JDK13, JDK14 and JDK15;ojdbc8.jar with JDK8, JDK11, JDK12, JDK13, JDK14 and JDK15 19.x——ojdbc10.jar with JDK10, JDK11;ojdbc8.jar with JDK8, JDK9, JDK11 18.3——ojdbc8.jar with JDK8, JDK9, JDK10, JDK11 12.2 or 12cR2——ojdbc8.jar with JDK 8 12.1 or 12cR1——ojdbc7.jar with JDK 7 and JDK 8;ojdbc6.jar with JDK 6 11.2 or 11gR2——ojdbc6.jar with JDK 6, JDK 7, and JDK 8(Note: JDK7 and JDK8 are supported in 11.2.0.3 and 11.2.0.4 only);ojdbc5.jar with JDK 5 |
oracle迁移到DM,表结构一致,迁移数据报错:数据溢出
【问题说明】:
有两种可能的情况:
- Oracle的int类型自动转换成number(38);
- Oracle的number类型存放精度超过38位;
情况一:
Oracle创建int类型,默认自动转换成number(38)
实际上在做插入的时候,精度超过38位,插入也是可以成功的
以下显示插入40位数字是成功的:
迁移到DM时,也会创建相同的表结构:
但DM的number(38)类型,严格限制最大仅能存38位,超过这个精度在迁移的时候就会报:数字溢出
情况二:
Oracle创建number类型,实际插入超过38位:
迁移到DM,也是number类型,但超过38位,DM会报数字溢出
【解决方法】:
- 确认数据本身有没有错误,在Oracle中存储这种超长的数值,理论上也是不支持;
- DM超过38位的number类型,建议改成varchar类型;
数据库迁移,在执行任务迁移表的时候长时间卡住不动
【原因及解答】:
- 表的数量较多,查询源端元数据时间较长;
- 快速装载的问题,建议在表–》转换中,把大字段的每次读取的行数改成1,关掉快速装载;
- 目的端表被锁住,此时再用DTS向目的端的表做插入会被阻塞造成长时间卡顿,将目的端的表 drop 掉或者解锁重新迁移;
说明:以上内容转载自达梦官网。
评论