使用达梦DTS迁移Oracle数据到达梦数据库过程步骤-记录总结
1.1示例需求
把oracle数据库中HR用户数据迁移到DM数据库HRU用户中。
1.2示例-原数据库信息
|-----------|------------------------------------------------------------|
| 前端应用相关信息 | 应用开发平台:业务系统 应用开发接口:JDBC接口 |
| 后台数据库相关信息 | 数据库架构:单机 数据库版本:oracle 11g 服务IP地址:192.168.118.171 服务端口:1522 |
1.2.1Oracle版本,服务,连接信息
ifconfig
lsnrctl status
用户名密码等信息
1.3示例-目标达梦数据库
1.3.1主要信息
|-----------|-------------------------------------------------------------------------------------------------------------|
| 前端应用相关信息 | 应用开发平台:业务系统 |
| 后台数据库相关信息 | 数据库架构:单机 数据库版本:03134284368-20260306-316451-20149 服务IP地址:172.168.118.238 端口:5237 用户密码:sysdba/TEST_qweasd9999 |
select id_code,* from v$version;
1.4达梦DTS版本
dm8_20251105_x86_win_64_ent_8.1.4.80_pack43_tool
1.5数据迁移
1.5.1源端停止应用系统
务必停止,防止产生新增数据。
1.5.2源端表数量和数据行数,对象数量,约束查询统计
1.5.2.1表数量和数据行数统计
create table test_table_count_oracle (owner varchar(100),table_name varchar(100),cnt int);
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 in('HR') order by 1, 2)
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 test_table_count_oracle values('''||v_owner||''','''||v_tabname||''','''||to_number(num_rows)||''')';
end loop;
end;
select * from test_table_count_oracle;

1.5.2.2对象数量查询
SELECT
A.USERNAME "用户名",
(SELECT COUNT(1) FROM DBA_TABLES B WHERE B.OWNER = A.USERNAME) "表数量",
( SELECT COUNT(1) FROM DBA_VIEWS G WHERE G.OWNER = A.USERNAME ) "视图数量",
(SELECT COUNT(1) FROM DBA_MVIEWS K WHERE K.OWNER = A.USERNAME) 物化视图数量,
( SELECT COUNT(1) FROM DBA_TRIGGERS H WHERE H.OWNER = A.USERNAME ) "触发器数量",
( SELECT COUNT(DISTINCT I.NAME) FROM DBA_SOURCE I WHERE I.OWNER = A.USERNAME AND I.TYPE = 'FUNCTION' ) "函数数量",
( SELECT COUNT(1) FROM DBA_SEQUENCES J WHERE J.SEQUENCE_OWNER = A.USERNAME ) "序列数量",
( SELECT COUNT(DISTINCT L.NAME) FROM DBA_SOURCE L WHERE L.OWNER = A.USERNAME AND L.TYPE = 'PROCEDURE' ) "存储过程数量",
( SELECT COUNT(1) FROM DBA_DB_LINKS M WHERE M.OWNER = A.USERNAME ) "DBLINK数量",
( SELECT COUNT(1) FROM DBA_INDEXES I WHERE UNIQUENESS = 'UNIQUE' AND OWNER =A.USERNAME OR INDEX_NAME NOT LIKE 'SYS_%' AND OWNER =A.USERNAME) "索引数量",
( SELECT COUNT(1) FROM DBA_OBJECTS WHERE OBJECT_TYPE='TYPE' AND OWNER =A.USERNAME ) "自定义类型",
( SELECT COUNT(1) FROM DBA_OBJECTS WHERE OBJECT_TYPE='PACKAGE' AND OWNER =A.USERNAME) "PKG数量"
FROM DBA_USERS A WHERE A.USERNAME IN ('HR');
1.5.2.3约束
select CONSTRAINT_TYPE,count(*) from DBA_CONSTRAINTS where owner IN ('HR') group by CONSTRAINT_TYPE ;

--查询默认列
create table test_com_oracle20260529 as
SELECT OWNER as "模式名",TABLE_NAME as "表名",COLUMN_NAME as "列名",DATA_TYPE as "列类型",DATA_DEFAULT as "默认值" FROM DBA_TAB_COLUMNS WHERE DATA_DEFAULT IS NOT NULL and OWNER IN ('HR');

1.5.3达梦数据库中准备工作
create tablespace HRU datafile 'HRU01.DBF' size 1024 autoextend on next 128,
'HRU2.DBF' size 1024 autoextend on next 128 CACHE = NORMAL;
create user "HRU" identified by "TEST_qweasd9999" default tablespace "HRU"
default index tablespace "HRU";
grant "PUBLIC","SOI" ,"RESOURCE","SVI","VTI" to "HRU";'
1.5.4数据迁移
使用达梦DTS进行数据迁移。
1.5.4.1过程记录
图形化向导方式,具体过程省略,重点部分截图



1.5.4.2DTS方式数据行数结果校验
图形化向导方式,具体过程省略,重点部分截图



1.5.5手工方式辅助数据结果校验
1.5.5.1表数量和数据行数统计
---达梦端统计表数量和行数
drop table test_table_count_dm;
create table test_table_count_dm(schema_name varchar(255),table_name varchar(255),v_count int);
DECLARE
v_count INT;
CURSOR c_tables IS
SELECT OWNER,TABLE_NAME FROM DBA_TABLES WHERE OWNER in ('HR') order by OWNER,TABLE_NAME;
BEGIN
FOR i IN c_tables LOOP
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||i.OWNER||'.' || i.TABLE_NAME INTO v_count;
insert into test_table_count_dm values(i.OWNER,i.TABLE_NAME,v_count);
PRINT '模式名: ' || i.OWNER ||'表名: ' || i.TABLE_NAME || ', 行数: ' || v_count;
END LOOP;
END;
select * from test_table_count_dm;

可以把test_table_count_oracle迁移到DM数据库HRU模式下,然后进行关联查询对比。

1.5.5.2对象数量统计--汇总查询
SELECT
A.USERNAME "用户名",
(SELECT COUNT(1) FROM DBA_TABLES B WHERE B.OWNER = A.USERNAME) "表数量",
( SELECT COUNT(1) FROM DBA_VIEWS G WHERE G.OWNER = A.USERNAME ) "视图数量",
( SELECT COUNT(1) FROM DBA_TRIGGERS H WHERE H.OWNER = A.USERNAME ) "触发器数量",
( SELECT COUNT(1) FROM DBA_OBJECTS I WHERE I.OWNER = A.USERNAME AND I.OBJECT_TYPE = 'FUNCTION' ) "函数数量",
( SELECT COUNT(1) FROM DBA_SEQUENCES J WHERE J.SEQUENCE_OWNER = A.USERNAME ) "序列数量",
( SELECT COUNT(1) FROM DBA_OBJECTS L WHERE L.OWNER = A.USERNAME AND L.OBJECT_TYPE = 'PROCEDURE' ) "存储过程数量",
( SELECT COUNT(1) FROM DBA_DB_LINKS M WHERE M.OWNER = A.USERNAME ) "DBLINK数量",
( SELECT COUNT(1) FROM DBA_OBJECTS WHERE OBJECT_TYPE='TYPE' AND OWNER =A.USERNAME OR OBJECT_TYPE='CLASS' AND OWNER =A.USERNAME ) "自定义类型",
( SELECT COUNT(1) FROM DBA_OBJECTS WHERE OBJECT_TYPE='PACKAGE' AND OWNER =A.USERNAME) "PKG数量"
FROM DBA_USERS A WHERE A.USERNAME IN ('HRU');

1.5.5.3视图
SELECT OWNER, VIEW_NAME FROM DBA_VIEWS where OWNER in ('HRU');
1.5.5.4物化视图
select a.owner,b.MVIEW_NAME from dba_objects a,DBA_mviews b where a.object_type ='SCH' and a.object_id=b.SCHID ;
1.5.5.5函数
SELECT * FROM DBA_OBJECTS WHERE OBJECT_TYPE = 'FUNCTION' and OWNER in ('HRU');
1.5.5.6存储过程
SELECT * FROM DBA_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE' and OWNER in ('HRU');
1.5.5.7触发器
SELECT * FROM DBA_TRIGGERS WHERE OWNER in ('HRU');
1.5.5.8序列
SELECT * FROM DBA_SEQUENCES where SEQUENCE_OWNER='HRU';
1.5.5.9DBLINK数量
SELECT * FROM DBA_DB_LINKS where OWNER='HRU';
1.5.5.10包
SELECT * FROM DBA_OBJECTS WHERE OBJECT_TYPE='PACKAGE' AND OWNER='HRU';
1.5.5.11约束数量统计
select CONSTRAINT_TYPE,count(*) from DBA_CONSTRAINTS where owner IN ('HRU') group by CONSTRAINT_TYPE ;

1.5.5.12约束具体表对应
CONSTRAINT_TYPE='P' --主键约束
CONSTRAINT_TYPE='U' --唯一约束
CONSTRAINT_TYPE='R' --外键约束
CONSTRAINT_TYPE='C' --check约束
--粒度到约束名称
create table HRU.test_table_yuesu_dm as
select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME from DBA_CONSTRAINTS where owner IN ('HRU');
create table HR.test_table_yuesu_oracle as
select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME from DBA_CONSTRAINTS where owner IN ('HR') ;
--粒度到约束列名
create table HRU.test_table_yuesu2_dm as
SELECT a.OWNER as "模式名",a.TABLE_NAME as "表名",b.COLUMN_NAME as "列名", a.CONSTRAINT_NAME as "约束名"
from DBA_CONSTRAINTS a, (select OWNER,CONSTRAINT_NAME,TABLE_NAME,LISTAGG(COLUMN_NAME, ', ')
WITHIN GROUP (ORDER BY COLUMN_NAME) COLUMN_NAME
from ALL_CONS_COLUMNS group by OWNER,CONSTRAINT_NAME,TABLE_NAME) b where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME
and a.OWNER=b.OWNER and a.TABLE_NAME=b.TABLE_NAME and a.CONSTRAINT_TYPE='P' and a.OWNER='HRU';
--查询默认列
create table HRU.test_table_yuesu3_dm as
SELECT OWNER as "模式名",TABLE_NAME as "表名",COLUMN_NAME as "列名",DATA_TYPE as "列类型",DATA_DEFAULT as "默认值" FROM DBA_TAB_COLUMNS WHERE DATA_DEFAULT IS NOT NULL and OWNER='HRU';
--查询非空列
SELECT OWNER as "模式名",TABLE_NAME as "表名",COLUMN_NAME as "列名",DATA_TYPE as "列类型" FROM DBA_TAB_COLUMNS WHERE NULLABLE ='Y' and OWNER='HR' and TABLE_NAME not like 'BIN%'
1.6更新数据库统计信息
call DBMS_STATS.gather_schema_stats('HRU',100);
1.7达梦数据库端全备份
及时对数据库进行全备。
1.8应用移植
(1)将应用系统中的数据库JDBC驱动连接串修改为达梦数据库的连接串:dm.jdbc.driver.DmDriver
(2)将应用系统中数据库的URL修改为达梦数据库的URL
jdbc:dm://IP:5237
1.9应用 系统测试
数据库数据迁移达梦数据库完成后,应用系统连接达梦数据库进行功能测试。
1.10后续其它工作,如果有。
更多达梦数据库运维指南、在线文档、相关资料、社区在线提问以及技术分享
访问 达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台