Oracle迁移到DM
文章目录
1. 概述
Oracle到DM的迁移主要有以下几个方面的工作:
1.分析带迁移系统,确定迁移对象。
2.通过数据迁移工具DTS完成常规数据库对象及数据的迁移。
3.通过人工完成PL/SQL的迁移,只需要做少量的修改即可。
4.迁移完成后对迁移的结果进行校验,确保迁移的完整性和正确性。
5.对应用系统进行迁移、测试和优化。
1.1 合理配置INI参数
DM的INI参数文件中针对从Oracle迁移到DM,有几个专门的参数,如下:
参数 | 效果及建议 | SQL |
---|---|---|
COMPATIBLE_MODE | 是否兼容其它书记库模式。 0:不兼容 1:兼容SQL92标准 2:兼容Oracle 3:兼容MS SQL SERVER 4:兼容MySQL 5:兼容DN6 6:兼容Teradata | SP_SET_PARA_VALUE(2,‘COMPATIBLE_MODE’,2); 或 ALTER SYSTEM SET ‘COMPATIBLE_MODE’=2 SPFILE; |
CALC_AS_DECIMAL | 整数相除是否保留小数位,修改为1 |
1.2 新建用户和表空间
从Oracle迁移到DM,要求必须创建新的用户和表空间,不要把数据迁移到系统管理员SYSDBA用户下和MAIN表空间下。
2. 连接DTS
新建迁移作业:鼠标右键迁移–>选择新建迁移。
创建迁移名称,填写迁移描述。
进入欢迎页面。
选择迁移方式。
连接源端数据库。
连接目的端数据库。
进入迁移页面。
3. 常规对象及数据迁移
指定从数据源复制对象。
等待获取迁移对象。
选择迁移对象。
等待创建迁移任务。
审阅迁移任务,点击完成,开始迁移。
进行数据迁移。
查看迁移失败内容。
查看具体报错信息。
4. 常见故障案例
4.1 标度大于尺度
Oracle中number(m,n)允许n>m,但是在达梦中是不允许的,达梦中m>=n,达梦中m表示精度,n表示标度。精度是一个无符号整数,定义了总的数字数;标度定义了小数点右边的数字位数。碰到这种问题一方面要思考一下Oracle里面列定义是否弄错了,如果是特意这样设计的,要搞清楚这个列到底需要存放什么样的数据,单独迁移这张表,对达梦中的数据类型进行修改。
4.2 连接尚未建立或已经关闭
这个问题有可能是因为Oracle数据库中存在非法的数据,如:-5486-12-31 00:00:00这样的非法的时间,在批量绑定插入的时候JDBC未做校验,服务器端检测到就会把这个连接剔除,就会报这个错误。新版的JDBC驱动(2019-7月以后)已经对此类问题进行了处理,增加了校验,碰到非法的数据会直接报错。碰到这种问题建议使用最新的JDBC驱动,替换掉迁移工具使用的JDBC驱动即可。
4.3 序列最大值超出达梦范围
<最大值>指定序列能生成的最大值,如果忽略MAXVALUE子句,则降序序列的最大值缺省为-1,升序序列的最大值为9223372036854775807 (0x7FFFFFFFFFFFFFF F)。非循环序列在到达最大值之后,将不能继续生成序列数;但是Oracle中最大值28个9,迁移到DM时报序列最大值超出达梦范围的错误(最新的DTS版本已经直接将超过DM最大值的序列的最大值转换成9223372036854775807)。
4.4 字符串截断
一般从Oracle迁移到DM的时候,出现字符串阶段的一般都是字段中含有中文,出现这种问题时因为DM初始化的时候选择的字符是Unicode(即utf-8),该字符集的国际标准是一个汉字占3个字节,而Oracle中默认情况下一个汉字占2个字节,此时迁移的时候就会报该错误。
解决方案:
1.DM数据库初始化的时候,字符集选择gb18030
2.DM数据库初始化的时候,选择VARCHAR类型以字符为单位
3.因为前面2中都需要重新初始化数据库,第三种不需要重新初始化数据库即可解决,即在选择迁移方式的时候,选择字符长度隐射关系为2
4.5 记录超长
DM数据库在初始化的时候,选择的页大小影响后面表每行数据的长度,表每行的长度之和(普通数据类型)不能超过一页大小,如果超过1页大小即报记录超长的错误。
解决方法:
1.找到表中VARCHAR类型比较长的(如carchar2(8000)这种),修改为text类型
2.初始化的时候页大小选择32k。(对于表中varchar2类型较长,并且字段较多的情况不太合适,这种情况采用方法1解决即可)
4.6 违反唯一约束性
这种情况是因为表中设置了唯一性约束或者主键约束,但是数据中有重复记录造成的。这种情况有可能是原始库的约束被禁用了,或者数据重复迁移造成的。
解决方法:
在确定源数据没有问题的情况下,迁移的时候选择删除后再拷贝。
在迁移界面中,选中要迁移的表,然后点击转换。
在弹出的窗口中选择删除后拷贝。
4.7 违反引用约束
这种问题主要是由外键约束造成的,父表的数据没有迁移,先迁移了子表的数据。
解决方法:
迁移的时候先不迁移外键等约束,在选择好要迁移的表时,点击转换。
第一次只选择表定义,不选择约束等。
第一次迁移完成后(确保没有错误),第二次只选择数据。
第三步选择性约束、索引等。
4.8 视图迁移过程中顺序问题:无效的用户对象
这个问题一般是因为在迁移视图之前,没有将视图依赖的表迁移过去。
解决方法:
严格按照迁移的顺序,先迁移表,然后再迁移视图、存储过程、函数等的顺序迁移即可。
4.9 错误码以错误描述信息的对应
错误码 | 错误信息 |
---|---|
0 | 字符串截取 |
-2665 | 记录超长 |
-6602 | 违反唯一性约束 |
-6607 | 违反引用约束 |
-2107 | 无效的对象 |
码以错误描述信息的对应
错误码 | 错误信息 |
---|---|
0 | 字符串截取 |
-2665 | 记录超长 |
-6602 | 违反唯一性约束 |
-6607 | 违反引用约束 |
-2107 | 无效的对象 |
详情请参考:https://eco.dameng.com