一、源端Oracle数据库检查
及迁移对象分析
1、源端Oracle数据库信息查看
2、迁移对象分析
迁移对象类型:序列、表(包括普通堆表、分区表、索引组织表以及表上的索引)、视图、自定义类型、触发器、同义词、存储过程、函数、包;
总数据量约92G,占用磁盘空间的主要为表和索引约91G,同时表中包含大字段。
二、目标端达梦数据库配置
1、达梦数据库实例初始化
达梦数据库初始化实例时需要注意如下参数的设置,根据实际情况进行合理设置:
2、INI参数配置
为了兼容Oracle数据库需要对如下参数做出调整:
3、创建表空间和用户
达梦数据库中提前创建好表空间以及用户:
三、迁移规划
依据对象间依赖关系,制定对象迁移顺序:
(1)序列
(2)表(包括索引)和同义词
(3)视图
(4)PLSQL对象
四、开始迁移
1、创建DTS迁移项目
打开“DM数据迁移工具”
新建工程
新建迁移
迁移方式选择Oracle到DM
填写源端Oracle连接信息
填写目标端达梦数据库连接信息
2、迁移序列
序列一般不依赖其他对象,所以首先迁移序列。使用DTS工具可以对序列进行批量迁移。
搜索要迁移的模式名,并勾选,同时勾选“序列”
选择所有序列
确认迁移信息
序列迁移完成
序列迁移过程注意事项
序列最大值问题
Oracle 中序列最大值 28 个 9,迁移到达梦时报序列最大值超出达梦范围的错误(最新的 dts 版本已经将超过达梦最大值的序列的最大值直接转换成 9223372036854775807);
对于这类报错,需要分析源库序列用途,目的库范围是否能够满足使用情境。如可以满足,则按照目的 DM 的可定义范围设置,如存在风险,则考虑在应用层面修改或者采取其他措施规避风险。
1、Oracle中序列定义最大值超过9223372036854775807
select s.sequence_name,s.max_value from user_sequences s where s.max_value > 9223372036854775807;
迁移到达梦数据库后最大值直接转换成 9223372036854775807,评估9223372036854775807最大值是否满足业务需求:
(1)可以满足业务需求,直接迁移;
(2)无法满足,业务上使用其他方案代替。
2、Oracle中序列值已经达到或者超过9223372036854775807
select s.sequence_name ,s.last_number from user_sequences s where s.last_number >= 9223372036854775807;
序列无法在达梦数据库中正常使用,不迁移。业务上使用其他方案代替。
序列在新库中开始值问题
使用DTS工具迁移序列时默认是以源序列的下一个值作为目标端序列的开始值。如果要使用源序列当前值作为目标端序列的开始值,需要取消该选项,并应用到所有序列:
3、迁移表和索引
表和索引是数据库的主体对象,一般情况下数据库整体大小就是由表和索引的大小决定的。
(一) 对于比较小的数据库可以使用DTS一次性批量完成迁移;
(二) 对于数据量较大的数据库,可以分批次迁移,先批量迁移小表,然后再迁移大表;
(三) 对于单表数据量特别大的表可以先迁移表数据,再手工在目标端创建索引。
搜索要迁移的模式,并勾选,同时勾选表
选择所有表
确认迁移信息
表迁移完成
表迁移注意事项以及问题
表批量迁移过程中可能存在表结构映射、索引创建、数据重复等方面的问题,需要在迁移完成后逐一核实报错信息,下面列举了表迁移过程中需要注意的方面以及本次迁移过程中遇到的问题。
违反唯一约束
源数据库Oracle中存在唯一约束的字段,数据迁移到达梦数据库后出现重复数据,一般是由于BLANK_PAD_MODE参数设置导致的,BLANK_PAD_MODE参数默认为0,会忽略字符串尾部空格,导致数据重复
解决方案:达梦数据库实例初始化时设置参数BLANK_PAD_MODE=1
字段映射
源端字段类型为UROWID的字段,DTS在映射为BINARY类型,导致出现字符串截断,部分数据导入失败:
解决方案:对于存在UROWID的字段,DTS迁移时检查字段映射情况,修改映射字段目标端为VARBINARY。
降序(DESC)索引创建失败
批量迁移时识别降序(DESC)失败,导致目标端索引创建失败
解决方案:迁移完成后目标端手工创建失败的索引
标度大于精度
对于number(m,n)数据类型,在Oracle数据库中允许 n>m,即标度大于精度。而达梦数据库中不允许。从Oracle迁移到达梦数据库时,如果存在标度大于精度的number类型字段(如number(3,4))就会报错:
解决方案:
核实Oracle端定义number类型标度大于精度在业务上的意义,是否能够改为标度小于等于精度。如果是特意这样设计的,要搞清楚这个列到底需要存放什么样的数据,单独迁移这张表,对达梦中的数据类型进行修改。
记录超长
达梦数据库实例在初始化的时候,选择的页大小影响后面表每行数据的长度,表每行的长度之和(普通数据类型)不能超过一页大小,如果超过 1 页大小即报记录超长的错误。
解决方案:
修改varchar类型比较长的字段为text类型。
索引组织形式的分区表迁移失败
索引组织形式的分区表在使用DTS迁移时自动生成的建表SQL语句出现不完整的情况,导致目标端建表失败:
解决方案:
方案一:DTS工具表转换时编辑SQL语句,根据源端建表DDL语句实际情况修改完善SQL语句。
方案二:手工在目标端创建表,然后使用DTS迁移表数据。
4、迁移视图
搜索要迁移的模式,并勾选,同时勾选视图
选择所有视图
确认迁移信息
视图迁移完成
视图迁移注意事项
视图迁移过程中需要注意视图依赖的相关对象以及权限,迁移完成后需检查是否存在无效的视图对象,对应失效的视图对象,检查视图创建语句,查看具体原因,可能存在原因如下:
(1)视图依赖的基表中存在其他模式下的表,而该基表并未迁移到目标端
解决方法:单独迁移该表到目标端
(2)视图依赖的基表在迁移到目标端后表名变更
解决方法:修改视图创建语句,使用正确的基表名
(3)视图中使用到的PL/SQL对象尚未迁移到目标端
解决方法:迁移PL/SQL对象后,重新编译视图
5、迁移PLSQL对象
搜索要迁移的模式,并勾选,同时勾选存储过程和函数、触发器、包、同义词、自定义类型。
选择所有PLSQL对象
确认迁移信息
迁移完成
PLSQL对象迁移注意事项以及问题
无法解析的成员访问表达式 [USERENV]
达梦和Oracle的USERENV函数存在规则不同,在Oracle数据库中USERENV有下面两种使用方法:
userenv('sessionid')
SYS_CONTEXT('USERENV','sessionid')
而达梦数据库中只有下面一种使用方法:
SYS_CONTEXT('USERENV','sessionid')
解决方案:
PLSQL程序中使用userenv('sessionid')的
地方修改为
SYS_CONTEXT('USERENV','sessionid')
无效的表或视图名[TABS]
在Oracle中TABS可以用来查询表的相关信息,达梦数据库中没有TABS,导致查询报错。
解决方案:
需要修改PLSQL中使用到TABS的SQL语句,使用USER_TABLES代替。
无效的表或视图名[COLS]
在Oracle中COLS可以用来查询表的相关信息,达梦数据库中没有COLS,导致查询报错。
解决方案:
需要修改PLSQL中使用到COLS的SQL语句,使用USER_TAB_COLUMNS代替。
[ROWNUM]附近出现错误: 语法分析出错
ROWNUM为达梦关键字,PLSQL程序中如果有变量使用ROWNUM,需要修改为其它字符串
解决方案:
修改ROWNUM变量名为其他字符串
[name]附近出现错误: 语法分析出错
创建函数中调用java程序,SQL语句如下:
达梦数据库中执行报错:
解决方案:如在迁移过程中识别到包含java应用,则从源库配置中获取jar包,手动上传到达梦路径
[row]附近出现错误: 语法分析出错
ROW为达梦关键字,PLSQL程序中使用会报错:
解决方案:
PLSQL中使用到ROW的变量名替换为其他字符串
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!