注册
SQLARK-Oracle迁移到DM8
专栏/技术分享/ 文章详情 /

SQLARK-Oracle迁移到DM8

枯树的小黄花 2026/10/16 157 0 0
摘要

一 背景介绍

本次测试使用DM DTS工具进行Oracle11G到DM8的迁移。DTS 是一款免费的数据迁移工具,在数据库安装时自带有图形化的版本,同时也可以部署 DEM (达梦企业管理器),以 WEB 客户端方式提供。此工具主要适用于静态数据迁移场景。支持视图、存储过程/函数、包、类、同义词、触发器等对象迁移。支持数据类型的自动映射,编码转换等等。
源端环境:

调研项 调研结果
数据库后台操作系统 Red Hat Linux
数据库架构 单机
数据库版本 Oracle 11g
待迁移数据库名 zhft
待迁移的模式名 ZHFT
IP/端口信息 192.168.159.132/1521
用户名/密码 Zhft/xxxxxx
字符集编码 UTF8
需要移植的对象 表(数据量)、物化视图、触发器、存储过程、函数、序列

目标环境:
DM8–>ZHFT模式

数据库参数 参数值
DB_NAME(数据库名) ZHFT
INSTANCE_NAME(实例名) ZHFT
PORT_NUM(端口) 5236
管理员、审计员、安全员密码(安全版本特有) xxxxxxxxx
EXTENT_SIZE(簇大小) 32
PAGE_SIZE(页大小) 32
LOG_SIZE(日志大小) 2048M
CHARSET(字符集) UTF8
CASE_SENSITIVE(大小写敏感) 敏感(根据实际要求设置)
BLANK_PAD_MODE(尾部空格填充) 否
SYSDBA_PWD(SYSDBA 用户密码) xxxxxxxx
SYSAUDITOR_PWD(SYSAUDITOR 用户密码) xxxxxxxx

部分参数说明:
(1)EXTENT_SIZE:簇大小默认为 16 页,建议设置成 32 页。
(2)CASE_SENSITIVE:默认是大小写敏感,源端为 Oracle 情况下,建议保持默认大小写敏感即可。
(3)BLANK_PAD_MODE:空格填充参数,是否要兼容 Oracle 进行设置,即在 BLANK_PAD_MODE = 0 的情况下,’A’ 和 ’A ’ 被认为是相同的值,参数为 1 的情况下,认为是两个不同的值,根据现场具体应用的需求进行设置。此为初始化参数,只能在初始化时候指定,后续不可以修改,需要提前做好评估,但是源端为 Oracle 数据库的时候,建议设置为 1。
(4)CHARSET:字符集编码,可选 GB18030、UTF-8,默认为 GB18030,如果只存储中文和字母数字,使用 GB18030 更节省空间。
(5)PAGE_SIZE:页大小默认为 8K,建议设置成 32K,一条记录的长度,受到页大小的限制,不可以超过页大小的一半,所以建议一开始规划页大小为 32K。
从 Oracle 移植到 DM,需额外注意以下参数。
参数名 含义 建议值
COMPATIBLE_MODE 是否兼容其他数据库模式。0:不兼容,1:兼容 SQL92 标准 ,2:兼容 ORACLE, 3:兼容 MS SQL SERVER ,4:兼容 MYSQL, 5:兼容 DM6, 6:兼容 TERADATA,7:部分兼容 POSTGRES, 8:部分兼容 DB2。注:对 COMPATIBLE_MODE 的修改会影响数据存储和操作结果,修改须慎重;具体可咨询达梦技术服务人员。 推荐值:2,重启数据库生效。
COMPATIBLE_MODE:兼容参数,置为 2 为兼容 Oracle 参数,在 dm.ini 中可以进行配置,如果默认 0 的情况下,达梦视 null 不等同于空字符串,用户可能会插入空串,会导致 is null 查不出全部数据,所以视情况而定是否需要修改。
创建表空间以及ZHFT用户。

create tablespace ZHFT datafile '/data/dmdata/ZHFT/ZHFT.DBF' size 2048;

create user "ZHFT" identified by "xxxxx" default tablespace "ZHFT"default index tablespace "ZHFT";
grant "PUBLIC","RESOURCE","SOI","SVI","VTI" to "ZHFT";

二 迁移过程

2.1 源端环境创建

创建Oracle测试库并且创建相应的表,视图,索引、触发器等等。
创建过程省略
表信息:
image.png
对象信息:
image.png

2.2 迁移评估

使用DTS工具,右键新建评估
image.png
选择Oracle到DM
image.png
输入源端的连接信息,选择指定目的库
image.png
输入DM的连接信息
image.png
image.png
选择ZHFT模式
image.png
选择全部的对象
image.png
image.png
image.png
查看评估失败的对象
image.png
image.png
查看不兼容的详细信息
image.png
image.png
进行校验
image.png

2.3 数据库迁移

DTS 工具为静态迁移工具,在正式开始移植前需要停止所有对源端数据库的操作,避免数据变化或新数据的产生导致源端与目的端数据不一致。
源端停止数据库监听,杀掉连接进来的会话,防止新的连接进来。

ps -ef|grep LOCAL=NO|grep -v grep|grep zhft|awk '{print $2}'|xargs kill -9

创建迁移工程
image.png

填写源端信息
image.png
填写目标端信息
image.png
image.png
选择ZHFT模式
image.png
image.png
image.png
image.png
查看报错详情
image.png
image.png
DM中修改表的字段长度
image.png
所有的报错都修改完成后重新执行

SQL> alter table zhft.T_PAYMENT modify PAYMENT_STATUS varchar(50);
操作已执行
已用时间: 31.826(毫秒). 执行号:5107.
SQL> ALTER TABLE ZHFT.T_CUSTOMER MODIFY GENDER VARCHAR(50);
操作已执行
已用时间: 48.296(毫秒). 执行号:5108.
SQL> ALTER TABLE ZHFT.T_EMPLOYEE MODIFY GENDER VARCHAR(50);
操作已执行
已用时间: 23.806(毫秒). 执行号:5109.
SQL> ALTER TABLE ZHFT.T_WAREHOUSE MODIFY MANAGER_NAME VARCHAR(50);
操作已执行
已用时间: 21.360(毫秒). 执行号:5110.
SQL> ALTER TABLE ZHFT.T_STOCK_LOG MODIFY CHANGE_TYPE VARCHAR(50);
操作已执行
已用时间: 18.858(毫秒). 执行号:5111.

image.png
image.png
image.png
重新执行之后没有出现报错信息。查看迁移报告:
image.png

2.4 数据检验

源端与目标端创建辅助表
create table table_count (owner varchar(100),table_name varchar(100),cnt int);
别在源端和目的端执行脚本,将模式下表的数据量插入到辅助表 table_count 中
declare
v_owner VARCHAR2(100);
v_tabname VARCHAR2(100);
stmt  VARCHAR2(200);
num_rows number;
begin
for rec in (select owner,table_name from dba_tables where owner='ZHFT' order by 1, 2)---owner根据实际情况调整
            loop
            select rec.owner,rec.table_name into v_owner,v_tabname from dual; 
            stmt := 'select count(*) from "' || v_owner || '"."' || v_tabname || '"';
            EXECUTE IMMEDIATE stmt INTO num_rows;  
EXECUTE IMMEDIATE 'insert into table_count values('''||v_owner||''','''||v_tabname||''','''||to_number(num_rows)||''')';
           end loop;
end;
/

源端统计对象数量
image.png
image.png
目标端查看对象数量
image.png
这是物化视图数据,在达梦数据库中物化视图是以表和视图的形式共同存在于数据库中,在查询时,将物化视图识别为表,也识别为视图。
image.png

数据核验没有问题之后当迁移后全库数据量较小时,可以使用全模式更新的方法:
DBMS_STATS.GATHER_SCHEMA_STATS( '模式名',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
收集表的统计信息。
对于需要单独收集统计信息的表,可以按照如下方式收集:
DBMS_STATS.GATHER_TABLE_STATS('模式名','表名',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服