公司有项目要求国产化适配,考虑到当前项目使用的Oracle数据库,为了减少迁移成本,数据库方面经过调研以及和客户确认,我们最终选择了达梦数据库(DM8),在数据迁移方面达梦做得比较完善,提供了DTS工具,能够很方便的进行数据迁移。如图1:可以看到支持很多数据库间的迁移。
在迁移之前,对于初步接触达梦数据的朋友应该注意一下内容:
1、迁移前根据实际需求确定好相关的数据库版本,选择合适的 jdk 版本(一般jdk8是OK的)。
2、达梦数据库安装时,注意考虑中文对应到 DM 都需要三倍长度,可以在初始化数据库的时候,达梦数据库选择字符串是否以字符为单位。(length_in_char=1试试)。
3、新建实例时注意修改兼容性参数COMPATIBLE_MODE=2。兼容性模式,0:不兼容,1:兼容 SQL92 标准,2:部分兼容 ORACLE,3:部分兼容 MS SQL SERVER,4:部分兼容 MYSQL, 5:兼容 DM6,6:部分兼容 TERADATA。该参数默认为 0,修改方式有两种:
在 dm.ini 文件中修改 COMPATIBLE_MODE 参数的值。 利用 SQL 语句修改 COMPATIBLE_MODE 参数的值。SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',2);或
ALTER SYSTEM SET 'COMPATIBLE_MODE'=2 SPFILE;该参数为静态参数,需要重启数据库后生效。
4、注意迁移的顺序。迁移时应先迁移序列、再迁移表、最后迁移视图、自定义类型、类、函数、存储过程、包等;对于数据量大的表单独迁移;对于大字段较多的表,需要修改批量迁移的行数,以免造成迁移工具内存溢出。
5、迁移完成后,一定要进行验证。
图1
选择Oracle迁移达梦,根据界面提示,完成数据库链接信息填写后即可选择迁移内容(图2):
图2
varchar2 (4000) 迁移后变成 (3900)
DM 数据库根据页大小,varchar 字段最大长度有限制。具体限制如下:
DTS 内部有字段类型映射,同时也会根据差异情况判断,在 8 kB 页大小情况下,将 Oracle 的 varchar2 (4000) 迁移成 varchar2 (3900)。
违反引用约束
这种问题主要是由外键约束造成的,父表的数据没有迁移,先迁移了子表的数据,【解决方法】:迁移的时候先不迁移外键等约束,在选择好要迁移的表时,按照以下步骤进行迁移:第一次只选择表定义,不选择约束等;第一次迁移完成后(确保没有错误),第二次只选择数据;第三步选择约束、索引等;按照上面三步迁移,基本上都可以顺利迁移成功。
违反唯一性约束
这种情况是因为表中设置了唯一性约束或者主键约束,但是数据中有重复记录。有可能是原始库的约束被禁用了,或者数据重复迁移造成的。【解决方法】:在确定源数据没有问题的情况下,迁移的时候选择删除后再拷贝。
迁移视图提示:无效的用户对象
这个问题一般是因为在迁移视图之前,没有将视图依赖的表迁移过去,【解决方法】:严格按照迁移的顺序,先迁移表,然后再迁移视图、存储过程、函数的顺序迁移即可。
报错:精度必须大于标度
【解决方法】:Oracle 中 number (m,n) 允许 n>m,但是在 DM 中是不允许的,DM 中 m>=n,m 表示精度,n 表示标度。精度是一个无符号整数,定义了总的数字数;标度定义了小数点右边的数字位数。碰到这种问题一方面要思考一下 Oracle 里面列定义是否弄错了,如果是特意这样设计的,要搞清楚这个列到底需要存放什么样的数据,单独迁移这张表,对 DM 数据类型进行修改。
迁移过程中出现的错误:违反协议
一般是 Oracle 的 jdbc 驱动问题导致,尝试更换驱动包。