一、概述
ORACLE 到 DM 的移植主要有以下几个方面的工作:
1. 分析待移植系统,确定移植对象。
2. 通过数据迁移工具 DTS 完成常规数据库对象及数据的迁移。
3. 通过人工完成 PL/SQL 的移植,只需要做少量的修改即可。
4. 移植完成后对移植的结果进行校验,确保移植的完整性和正确性。
5. 对应用系统进行移植、测试和优化
本文主要讲诉DTS迁移过程和常见问题
二、迁移环境
软件 | 版本 |
源数据库 | Oracle 11g |
目标数据库 | DM 8 |
操作系统 | Windows 10 |
迁移工具 | DM 数据迁移工具 (DM DTS) |
注意事项:
1、选择合适的初始化参数
初始化库,关键的点在于对初始化参数的设置,本章节明确是从 Oracle 移植到 DM 数
据库,所以具体的初始化参数建议如下:
(1)关于页大小 PAGE_SIZE。Oracle 也叫块大小(block),在 DM 数据库中,页大小可以为 4KB、8KB、16KB 或者 32KB,从 Oracle 移植到 DM,建议设置页大小为 8KB,一旦创建好了数据库,在该库的整个生命周期内,页大小都不能够改变。除了每个字段的最大长度限制外,每条记录总长度不能大于页面大小的一半。如果系统中存在或者以后可能存在含有较长的字符串类型的表,建议该参数设置为 16 或者 32。页大小设置越大,最后数据文件的物理大小就会越大,系统运行时,每次从磁盘调入内存的数据单位也就越大,所以此处要慎重。
(2)关于簇大小 EXTENT_SIZE。数据文件使用的簇大小,即每次分配新的段空间时连续的页数,只能是 16 页或 32 页,缺省使用 16 页,从 ORACLE 移植到 DM 使用默认值就可以。
(3)关于大小写敏感 CASE_SENSITIVE。DM 为了兼容不同的数据库,在初始化数据库的时候有一个参数字符串比较大小写敏感,用于确定数据库对象及数据是否区分大小写,默认为区分,不可更改。建议 MYSQL 和 SQLSERVER 迁移过来的系统,使用大小写不敏感,ORACLE 迁移过来的系统,使用大小写敏感,以便和原来系统匹配。
(4)关于字符集 CHARSET。建议采用默认值 GB18030,如果需要国际字符可以采用Unicode,GB18030 数字字母占 1 个字节,普通汉字占 2 个字节,部分繁体及少数民族文字占 4 字节,Unicode 在达梦中采用 UTF-8 编码格式,欧洲的字母字符占 1 到 2 个字节,亚洲的大部分字符占 3 个字节,附加字符为 4 个字节。如果只存储中文和字母数字,一般来说 GB18030 更节省空间一些。
(5)BLANK_PAD_MODE 空格填充模式,默认是 0,从 Oracle 移植要设置为 1。
2、创建用户和表空间
从 Oracle 移植到 DM,要求必须创建新的用户和表空间,不要把数据迁移到系统管理员 SYSDBA 用户下和 MAIN 表空间下。
3、移植状态要确定
严禁在生产环境中直接迁移。因为移植首先是一个测试的工作,所以移植应该避免从 Oracle 生产环境数据库中直接进行移植,需要提前向应用开发商提出需要搭建一个测试环境,准备 Oracle 需要移植的环境和数据。直接从生产库上进行数据移植,有很多风险存在,例如会影响生产库的效率,引发崩溃的可能等等。
推荐使用 pl/sql developer 工具进行移植测试工作。也可以使用 Oracle 自带的客户端
三、迁移过程
第一步:新建工程与迁移
第二步:选择迁移方式
第三步:选择数据源和目的库
第四步:指定对象复制或查询
第五步:选择迁移对象
第六步:审阅迁移任务
第七步:验证数据
新建工程与迁移:
DM DTS 工具存放在 DM 数据库安装目录下 tool 文件夹,执行 ./dts 即可运行 DM DTS 工具。新建工程,选择迁移,并右键新建迁移。
在新建工程对话框中填写工程名和工程描述信息,点击【确定】按钮,成功添加了一个工程。如下图所示:
展开工程节点,选择【新建迁移】。输入迁移名称:test,迁移描述:从 Oracle 迁移到 DM,点击【确定】按钮,完成迁移的创建。如下图所示:
选择迁移方式
默认打开目录为 DM DTS 工具介绍,选择【下一步】。迁移方式选择【Oracle–>DM】方式,如下图所示:
选择数据源和目的库:
分别输入主机名 (IP) 端口(Oracle 默认端口 1521,DM 默认端口 5236),服务名(Oracle 默认服务名 ORCL),角色(默认),用户名和口令,如下图所示:
指定对象复制或查询:
选择源模式和目的模式。从数据源复制对象,默认模式及模式对象、目录、同义词、上下文。
迁移对象,默认在 DM 数据库创新同名模式,并迁移表、视图、物化视图、序列、存储过程/函数、触发器、包、同义词、自定义类型。如需调整,用户可根据自身情况勾选,如下图所示:
选择迁移对象
此处选择要迁移的具体表格、视图、存储过程等。如需调整,用户可根据名称具体选择,如下图所示:
注意:
转换按钮可设置迁移策略,包括表定义、主键、约束条件、索引、数据、读写行数设置等参数,可供用户调整策略。
列映射选项中可调整列名、数据类型、精度、主键(唯一)、空值限制等参数,用户可自行调整。
审阅迁移任务
用户可查看迁移过程重要参数和修改条件,如需修改,可执行上一步进行修改,确认无误后,点击【完成】,如下图所示:
验证数据
完成数据迁移后,我们还需对迁移的数据进行验证,表、视图、存储过程、序列都存在且与原数据一致,迁移完成。如下图所示:
四、迁移过程中常见问题
1、标度大于精度
Oracle 中 number(m,n)允许 n>m,但是在达梦中是不允许的,达梦中 m>=n,达梦中 m 表示精度,n 表示标度。精度是一个无符号整数, 定义了总的数字数;标度定义了小数点右边的数字位数。碰到这种问题一方面要思考一下 Oracle 里面列定义是否弄错了,如果是特意这样设计的,要搞清楚这个列到底需要存放什么样的数据,单独迁移这张表,对达梦中的数据类型进行修改。
2、连接尚未建立或已经关闭
这个问题有可能是因为 Oracle 库中存在非法的数据如:-5486-12-31 00:00:00 这样的非法的时间,在批量绑定插入的时候 JDBC 未作校验,服务器端检测到就会把这个连接剔除,就会报这个错误。新版的 JDBC 驱动(2019-7 月以后)已经对此类问题进行了处理,增加了校验,碰到非法的数据会直接报错。碰到这种问题建议使用最新的 JDBC 驱动,替换掉迁移工具使用的 JDBC 驱动即可。
3、序列最大值超出达梦范围
<最大值> 指定序列能生成的最大值,如果忽略 MAXVALUE 子句,则降序序列的最大值缺省为- 1 ,升序序列的最大值为 9223372036854775807(0x7FFFFFFFFFFFFFF F ) 。非循环序列在到达最大值之后,将不能继续生成序列数;但是 oracle 中最大值 28 个 9,迁移到 DM7 时报序列最大值超出达梦范围的错误(最新的 dts 版本已经直接将超过 DM7 最大值的序列的最大值转换成 9223372036854775807)
4、字符串截断
一般从 oracle 迁移到 DM7 的时候,出现字符串截断的一般都是字段中含有中文,出现这种问题是因为 DM7 初始化的时候选择的字符集是 Unicode(即 utf-8),该字符集的国际标准是一个汉字占 3 个字节,而 oracle 中默认情况下一个汉字占 2 个字节,此时迁移的时候就会报错。
遇到该错误有 3 种解决办法。
1 是在初始化的时候,字符集选择 gb18030
2 是初始化数据实例时选择 VARCHAR 类型以字符
3 是选择迁移方式的时候,选择字符长度隐射关系为 2。
5、记录超长
DM7 在初始化的时候,选择的页大小影响后面表每行数据的长度,表每行的长度之和(普
通数据类型)不能超过一页大小,如果超过1 页大小即报记录超长的错误。
解决办法:
(1) 找到表中 varchar 类型比较长的(如 varchar2(8000)这种),修改成 text 类型; (2) 初始化的时候页大小选择 32k。(对于表中 varchar2 类型较长,并且字段较多的情 况不太适合,这种情况采用方法 1 解决。)
6、违反唯一性约束
这种情况是因为表中设置了唯一性约束或者主键约束,但是数据中有重复记录造成的。
这种情况有可能是原始库的约束被禁用了,或者数据重复迁移造成的。
解决办法: 在确定源数据没有问题的情况下,迁移的时候选择删除后再拷贝,如下图:
在迁移界面中,先中要迁移的表,然后点击转换在弹出的窗口中选择删除后拷贝,如下图:
这样既可迁移成功。
7、违反引用约束
这种问题主要是由外键约束造成的,父表的数据没有迁移,先迁移了子表的数据。
解决办法:
(1)第一次迁移只选择表定义,不选择约束等
(2)第一次迁移完成后(确保没有错误),第二次只选择数据
(3)第三步选择约束、索引等
8、视图迁移过程中顺序问题:无效的用户对象
这个问题一般是因为在迁移视图之前,没有将视图依赖的表迁移过去。
解决办法: 严格按照迁移的顺序,先迁移表,然后再迁移视图、存储过程、函数等的顺序迁移即可。