- 概述
- 迁移流程图
在表迁移的时候需要注意,表的迁移是有顺序的,按照表定义、数据、约束、索引、注释的顺序来进行迁移。
- 系统分析
1.1 源端信息收集
对于异构数据库迁移到达梦,在迁移之前,需要对源端数据库的一些信息进行收集,以便迁移方案的制定以及迁移评估,需要收集的信息如下表格:
调研项 | 调研情况 |
数据库版本/驱动版本 | select * from v$version; |
字符集编码 | select * from v$nls_parameters a where a.PARAMETER='NLS_CHARACTERSET'; |
大小写是否敏感 | SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_COMP'; |
是否以字节为单位 | Show parameter NLS_LENGTH_SEMANTICS; |
用户/模式 | |
用户权限 | |
表空间(数据、索引) | |
数据对象个数 | |
大字段表个数 |
2.1 目的端初始化
2.1.1 DM实例初始化
- 初始化数据库
源端为Oracle的情况下,对于目的端达梦库的初始化参数,需要做好规划,需要注意如下参数:
- PAGE_SIZE:页大小默认为8K,建议设置成32K,一条记录的长度,受到页大小的限制,不可以超过页大小的一半,所以建议一开始规划页大小为32K;
- EXTENT_SIZE:簇大小默认为16页,建议设置成32页;
- CASE_SENSITIVE:默认是大小写敏感,源端为Oracle情况下,建议保持默认大小写敏感即可;
- BLANK_PAD_MODE:空格填充参数,是否要兼容Oracle进行设置,即在BLANK_PAD_MODE=0的情况下,’A’和’A ’被认为是相同的值,参数为1的情况下,认为是两个不同的值,根据现场具体应用的需求进行设置,此为初始化参数,只能在初始化时候指定,后续不可以修改,需要提前做好评估,但是源端为Oracle数据库时候,建议设置为1;
- CHARSET:字符集编码,可选GB18030、UTF-8,默认为GB18030,如果只存储中文和字母数字,使用GB18030更节省空间;
- LENGTH_IN_CHAR:VARCHAR 类型对象的长度是否以字符为单位,默认是以字节为单位,此参数和字符集编码结合使用,所能存储的字符个数有所不同,详见如下表格:
- COMPATIBLE_MODE:兼容参数,置为2为兼容Oracle参数,在dm.ini中可以进行配置,如果默认0的情况下,达梦视null不等同于空字符串,用户可能会插入空串,会导致is null查不出全部数据,所以视情况而定是否需要修改;
2.1.2 表空间规划
目的端表空间大小要参照源端数据大小进行设置,且在目的端,存储需要创建独立的表空间。
单个数据文件(.dbf)不应过大,如果空间不够,应该采取开启多个数据文件的方案。
2.1.3 用户规划
1、创建用户授予权限,不建议授予DBA角色,一般的权限,授予resource、public、vti、soi、svi这几个角色即可满足使用要求。
2、设置用户的资源限制参数中,比较常用的几个参数如下图,图中显示参数缺省值均为在通用机情况下:
源端迁移用户准备
CREATE USER dzy IDENTIFIED BY dzy020131;
GRANT resource、public、vti、soi、svi TO dzy;
目的端用户准备
create user MYSQL_DTS identified by "dzy020131" default tablespace “library”;
--创建用户并指定默认表空间
grant create table,select table,update table,insert table to MYSQL_DTS;
--授权
2.1.4 表空间
提前了解数据库每个用户表空间信息,方便规划目的端数据库表空间信息,提前创建表空间数据文件提高整体的迁移速度。
CREATE TABLESPACE library DATAFILE 'E:\dmdbms\data\DAMENG\test.dbf'' SIZE 128;//新建表空间
alter tablespace library add datafile 'library2.dbf' size 128 autoextend on next 128 maxsize 30720;//增加表空间大小
目的端实例构建
1)初始化参数配置
参数COMPATIBLE_MODE这里不能直接设置为目标值2,所以在后面实例创建成功后,修改dm.ini配置文件加重启来使配置生效。
- 使用DTS迁移工具进行配置
3.1迁移对象统计
用户 | 类型 | Oracle数据库 | DM数据库 |
yfroot | 表 | 210 | 210 |
序列 | 168 | 168 | |
视图 | 4 | 4 | |
存储过程 | 13 | 13 | |
函数 | 3 | 3 |
3.2用户以及表空间创建
4.1 DTS工具连接
选择ORACLE=>DM迁移
对象迁移
4.1表结构迁移
4.2序列迁移
4.3本次迁移ORACLE库中没有同义词和自定义类型
4.4 迁移存储过程、触发器、包
4.5 表数据迁移
本次只迁移数据,注意勾选,并且指定应用当前选项到所有同类对象。
4.6视图迁移
4.7索引、约束迁移
五.问题总结
5.1 含有大KEY设置禁止主键
修改参数解锁即可,后从错误日志中拿出失败的SQL重新执行
sp_set_para_value(1,'PK_WITH_CLUSTER',0);
ALTER TABLE "BSIMS"."LE_BOTTLEERRORRECORD" ADD CONSTRAINT PRIMARY KEY("ERRORRECORDID") ;
ALTER TABLE "BSIMS"."SYNCH_DATAS" ADD CONSTRAINT PRIMARY KEY("I_ID") ;
ALTER TABLE "BSIMS"."TS_USERHOLDBOTTLE" ADD CONSTRAINT PRIMARY KEY("ID") ;
ALTER TABLE "BSIMS"."EX_CHENGGUANWEI_87_DDSLCJJSYXX" ADD CONSTRAINT PRIMARY KEY("S_GUID") ;
5.2数字溢出
是属于字段数据类型问题,这里采取手动创建表结构。问题字段设为VARCHAR(100)类型,先让数据正常导入,后根据数据值选择适合的数据类型。
5.3 违反唯一性约束
原因:由于迁移语句中使用NUMBER数据类型造成,采取的解决方案是手动从错误日志中拿SQL,再修改NUMBER数据类型为NUMBER(20,0),手动创建表结构。否则插入的数据会统一变为200000000,无法在主键字段下增加。
5.4 包创建失败
这里有两处问题
第一个使用将NEW改成NEW1取消关键字判定解决。
第二处采取的解决办法是删除该SQL语句。PRAGMA属于编译期的代码只在编译期起作用,不影响程序的正常使用。
- 统计信息
select object_type,count(*) from all_objects where
owner='BSIMS' group by object_type;
社区地址:https://eco.dameng.com