本次迁移的源端与目标端环境如下:
源数据库:Oracle 11g,部署于Win11操作系统
目标数据库:DM8,同样运行于Win环境
迁移工具:达梦自带的数据迁移工具DTS
# 查看数据文件位置
select file_name from dba_data_files;
# 创建测试表空间
create tablespace tp_test datafile ' \APP\30238\ORADATA\ORCL\TP_TEST. DBF' size 100M;
# 创建用户
create user tp_test identified by "123456" default tablespace tp_test temporary tablespace TEMP:
# 授予DBA权限(生产环境建议按需赋权)
grant dba to test;
# 连接新用户创建测试表
conn tp_test;
create table test01(id number(10), name varchar(10));
# 插入测试数据
insert into test01 values (1,'张三');
insert into test01 values (2,'李四');
insert into test01 values (3,'王五');
insert into test01 values (4,'赵六');
insert into test01 values (5,'刘琴');
insert into test01 values (6,'李帅');
commit;
在达梦数据库中创建对应的用户和表空间,注意用户与表空间的规划。
# 创建表空间(建议大小略大于源端)
CREATE TABLESPACE "TEST" DATAFILE '/home/dmdba/dmdbms/data/DAMENG/TEST.DBF' SIZE 150;
# 创建用户
CREATE USER "TEST" IDENTIFIED BY "SYSDBA_123a" DEFAULT TABLESPACE "TEST";
# 授予DBA权限
GRANT dba TO TEST;
如果目标端用户已提前创建,迁移时可不勾选“创建模式”,避免冲突.
为使DM8更好地兼容Oracle语法和数据类型,需调整以下两个关键参数:
# 设置兼容模式为Oracle(2代表Oracle兼容模式)
SP_SET_PARA_VALUE(2,'CALC_AS_DECIMAL',2);
# 设置计算精度处理方式
SP_SET_PARA_VALUE(2,'CALC AS_DECIMAL',1);
COMPATIBLE_MODE为静态参数,修改后必须重启数据库服务才能生效。重启后可通过以下语句验证:
SELECT PARA NAME, PARA VALUE FROM VSDM INI WHERE PARA NAME 'CALC AS DECIMAL' OR PARA NAME 'COMPATIBLE MODE';
达梦DTS工具提供图形化向导式迁移,操作直观且支持多种数据源。
3.1 创建工程与迁移任务
新建工程:点击“新建工程”,输入工程名如“oracle-dm”
新建迁移:在工程上右键选择“新建迁移”,填写迁移名称和描述
选择迁移方式:选择“Oracle到DM”
3.2 配置数据源连接
源端Oracle信息
目标端DM8信息:
勾选源端待迁移的模式(Schema),如“TEST”
选择具体需要迁移的表、视图、存储过程等对象
点击“分析源对象”可统计待迁移对象数量
点击“转换”可对每个表进行精细化配置:
迁移策略选项:
表定义:是否迁移表结构。
主键/约束/索引:可选择迁移方式,建议大数据量表启用“异步索引”(先迁数据后建索引)。
数据:主键冲突时可选择“覆盖”或“跳过”。
读写行数:大字段表可调整“源一次读取行数”和“目的一次提交行数”,避免内存溢出。
字符长度扩展:
若源端为GBK字符集、目标端为UTF-8,建议在迁移选项中设置字符长度系数(如1.5或2),防止中文字符截断。
1.审阅迁移任务摘要,确认配置无误
2.点击“完成”开始迁移
3.等待迁移进度完成
迁移完成后,务必进行严格验证:
# 对比对象数量
SELECT OBJECT_TYPE, COUNT(*)
FROM ALL_OBJECTS
WHERE OWNER='TEST'
GROUP BY OBJECT_TYPE;
# 验证关键表数据行数
SELECT COUNT(*) FROM TEST.TEST;
根据实践经验,迁移中可能遇到以下问题:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 字符串截断/数据溢出 | 源端(Oracle)与目标端(DM)的字符集不一致(如源为GBK,目标为UTF-8),或字段长度/精度不兼容。 | 1. 迁移前,在DTS工具的迁移选项中设置字符长度系数(建议设为1.5或2),为字符列预留空间。2. 检查表定义,若Oracle的NUMBER(m,n)中m < n,需调整DM侧定义为NUMBER(m,n)以确保精度兼容。 |
| 外键约束失败 | 迁移数据时,子表的数据先于父表被导入,导致外键校验失败。 | 采用分步迁移策略:1. 仅迁移表结构(不包含外键)。2. 迁移所有数据。3. 最后单独迁移或手动创建外键约束。 |
| 连接超时或迁移卡住 | 网络不稳定,或单次读取/提交的数据量过大导致内存溢出(OOM)。 | 1. 在DTS的“转换”->“映射关系”中,调小 “源一次读取行数” 和 “目的一次提交行数” (例如设为500或1000)。2. 检查DTS工具的启动脚本(如dts.ini),适当调大JVM内存参数`。 |
| 序列(Sequence)值超范围 | Oracle序列的最大值可能超过了DM序列允许的最大值。 | 新版DTS通常会自动进行转换。若遇到问题,可在迁移完成后,在DM侧手动调整序列的MAXVALUE,或将其设置为NOMAXVALUE。 |
| 视图或存储过程无效 | 迁移时,视图依赖的表或基础对象尚未被迁移。 | 严格控制迁移顺序:先迁移表结构,再迁移数据,然后迁移索引和约束,最后迁移视图、存储过程、函数等依赖对象。 |
文章
阅读量
获赞
