DTS工具将Oracle迁移到达梦数据库步骤详解(DM8)

Java技术 潘老师 2年前 (2022-06-07) 1738 ℃ (0) 扫码查看

最近潘老师在将oracle的数据库(19C版本)数据迁移到达梦数据库(DM8版本),记录下迁移的过程,做一个详细描述,以备不时之需,因为毕竟官方文档还是不够全面细致。

环境说明

1)oracle数据库和达梦数据库都是装在Linux系统上的(无桌面)
2)保证两个库的编码一致,否则中文可能会出现乱码,我这里都是gbk的编码

工具准备

由于我这里都装在无桌面的Linux上,所以没法直接使用达梦安装目录下的dts指令(依赖桌面),只能通过windows系统版本的DTS工具(数据迁移工具),所以在windows上要装上相关工具,由于这个工具是集成在DM8的安装包中的,所以要下载DM8的windows版iso文件,进行安装,可以根据自己的需求进行自定义安装,只装自己需要的工具即可,windows版本下载地址:
1)官方百度网盘下载:https://pan.baidu.com/s/1_Bflj_PjUV-Zjcc3VhSgYw 提取码:wafh
2)备用百度网盘下载:链接: https://pan.baidu.com/s/1THY_LFEsYWSpjWKknuYN_g?pwd=dcf4 提取码: dcf4
具体安装教程参考:https://eco.dameng.com/docs/zh-cn/start/dm-install-windows.html
我们这里主要需要用到DM数据迁移工具和DM管理工具,潘老师为了方便,直接都安装了。

迁移准备

在开始迁移之前,需要在达梦数据库新建用户和表空间(表空间要和oracle的表空间名称一样),可以通过DM管理工具去创建,也可以直接通过sql去创建,这里给出sql创建的语句:

#创建表空间,这里size设置为128M因为,我们设置的单页大小是32k,具体看官网,注意这个数据库数据文件路径一定不能错,否则执行报错。
create tablespace  表空间名称 datafile '数据库数据文件路径/起个名称.dbf' size 128 autoextend on next 1024 maxsize 10240;
#创建用户
create user 用户名 identified by "密码" default tablespace 表空间名称;
#分配权限
grant "DBA","PUBLIC","RESOURCE" to "用户名" with admin option;

可视化操作可以参考:
创建表空间-官方文档
创建用户-官方文档

Oracle迁移到达梦数据库步骤

可以先看下官方文档:Oracle迁移到达梦-官方文档

第1步:打开DM数据迁移工具

打开DTS迁移工具

第2步:新建迁移工程

具体如图:
新建迁移工程

第3步:在迁移目录右键新建迁移工程

新建迁移工程

第4步:配置oracle数据源

这里有个坑,就是我们的oracle数据库的sid和service_name不一样,导致按照官网的方法配置连接一直连不上,始终报错找不到该service_name,如果你能连上,就可以忽略了,我这里的解决办法是指定驱动,我这里使用的oracle自带的ojdbc8,配置后,点击自动获取驱动类,然后好需要改一下url,默认是不能修改的,必须点击问号,再勾选指定使用自定义url才能勾选,然后我把url替换为自己的驱动方式(如下面的第1种格式,官方默认第2种),然后还要把<数据库名变量>换成自己的service_name,相当于直接写死url。

一般oracle驱动连接url方式有如下几种:
#格式一
 jdbc:oracle:thin:@//<host>:<port>/<service_name>
#格式二
jdbc:oracle:thin:@<host>:<port>:<SID>
#格式三
jdbc:oracle:thin:@<TNSName>

具体类似如下图:
oracle连接配置

第5步:配置达梦数据源

这个没什么好说的,填上用户名密码就行
配置达梦数据源

第6步:指定复制对象

找到你要复制的那个用户下的数据,然后勾选下一步
指定复制对象

第7步:选择迁移对象

根据自己的需求,选择迁移的对象,可以根据所有对象进行筛选表、视图等
选择迁移对象

提示:
1)这里转换我都是默认的,没做修改
2)所有对象可以先一起迁移看看,如果报错,可以按照这个顺序迁移:先迁移序列,自定义类型,再表定义,再数据,最后索引和约束,再视图,函数,存储过程,包。

第8步:查看迁移计划

然后会生成迁移计划,我们审阅没问题,就可以点击完成,就开始进行迁移了。
审阅迁移计划
整体而言,迁移速度还是挺快的,300万的数据,基本在20分钟左右就迁移完成了,然后自己去核对数据记录是否正确。

后续操作

这里还有一些后续操作,是达梦官方人员让进行的操作,这里也记录下,我觉得他的操作主要可能是为了优化数据库内存配置,你根据自己需要看是否有必须要进行下面的操作吧:

1)收集全库统计信息

执行如下sql,收集全库统计信息

DBMS_STATS.GATHER_SCHEMA_STATS('用户名',100,TRUE,'FOR ALL COLUMNS SIZE AUTO'); 

至于干什么用的,作为非专业DBA,也不清楚,反正后面就可以在dba_tables中查询相关记录总数

select table_name, num_rows from dba_tables

2)优化配置

执行达梦官方给的一个自动调整内存配置的sql,可能不同的配置下,sql也不知道是否需要其他修改,这里给出官方的原sql,具体如下:

declare
exec_mode int:= 0;   --0表示直接执行脚本修改参数,1表示不直接修改参数,打印设置参数的语句,设置为1后,必须调整v_mem_mb和v_cpus
mem_per int:= 100;   --默认所有的内存归达梦数据库使用,如实际不能100%可用,可以调整此参数
v_mem_mb int:= 16000; --根据机器实际内存调整此参数
v_cpus int:= 8;       --根据机器CPU核数调整此参数
tname varchar(100);
MEMORY_POOL int;
MEMORY_N_POOLS int;
MEMORY_TARGET int;
BUFFER INT;
MAX_BUFFER INT;
RECYCLE int;
CACHE_POOL_SIZE int;
BUFFER_POOLS int;
RECYCLE_POOLS int;
SORT_BUF_SIZE int;
SORT_BUF_GLOBAL_SIZE INT;
DICT_BUF_SIZE  INT;
HJ_BUF_SIZE INT;
HAGR_BUF_SIZE INT;
HJ_BUF_GLOBAL_SIZE INT;
HAGR_BUF_GLOBAL_SIZE INT;
--SORT_FLAG INT;
SORT_BLK_SIZE INT;
RLOG_POOL_SIZE INT;
TASK_THREADS INT;
IO_THR_GROUPS INT;
FAST_POOL_PAGES INT :=3000;
FAST_ROLL_PAGES INT :=1000;
CNT INT;
begin
CNT :=0;
if exec_mode=0 then 
SELECT TOP 1 N_CPU,TOTAL_PHY_SIZE/1024/1024 INTO v_cpus,v_mem_mb FROM V$SYSTEMINFO;
end if;
v_mem_mb := v_mem_mb * (mem_per/100.0);
v_mem_mb=round(v_mem_mb,-3);
IF v_mem_mb <= 2000  THEN
goto return_2000;
END IF;
IF v_mem_mb > 512000 THEN  
v_mem_mb :=v_mem_mb*0.8;
END IF;
MEMORY_TARGET=round(cast(v_mem_mb * 0.12 as int),-3);
TASK_THREADS :=4;
IO_THR_GROUPS :=4;
IF v_cpus < 8  THEN   
TASK_THREADS :=4;
IO_THR_GROUPS :=2;
END IF;
IF v_cpus >= 64 THEN 
v_cpus := 64; 
TASK_THREADS :=16;
IO_THR_GROUPS :=8;
END IF;
BUFFER := round(cast(v_mem_mb * 0.4 as int),-3);
MAX_BUFFER := BUFFER;
RECYCLE :=cast(v_mem_mb * 0.04 as int);
IF v_mem_mb < 70000 THEN
with t as
(
select rownum rn from dual connect by level <= 100
) ,
t1 as
(
select * from t where rn > 1 minus
select
ta.rn * tb.rn
from
t ta,
t tb
where
ta.rn <= tb.rn
and ta.rn  > 1
and tb.rn  > 1
)
select top 1 rn into BUFFER_POOLS from t1 where rn > v_mem_mb/800 order by 1;
--设置根据内存情况RECYCLE_POOLS参数
with t as
(
select rownum rn from dual connect by level <= 100
) ,
t1 as
(
select * from t where rn > 1 minus
select
ta.rn * tb.rn
from
t ta,
t tb
where
ta.rn <= tb.rn
and ta.rn  > 1
and tb.rn  > 1
)
select top 1 rn into RECYCLE_POOLS from t1 where rn > v_mem_mb/800/3 order by 1;
ELSE
BUFFER_POOLS := 101;
RECYCLE_POOLS := 41;
END IF;
--修改内存池
IF v_mem_mb >= 16000  THEN 
IF v_mem_mb= 16000 THEN
MEMORY_POOL := 1500;
SORT_BUF_GLOBAL_SIZE := 1000;
MEMORY_N_POOLS := 3;
CACHE_POOL_SIZE := 512;
ELSE
MEMORY_POOL := 2000;
SORT_BUF_GLOBAL_SIZE := 2000;
MEMORY_N_POOLS := 11;
CACHE_POOL_SIZE := 1024;
END IF;
FAST_POOL_PAGES :=9999;
--   SORT_FLAG = 0;
SORT_BLK_SIZE=1;
SORT_BUF_SIZE := 10;
RLOG_POOL_SIZE := 1024;
HJ_BUF_GLOBAL_SIZE := LEAST(cast(v_mem_mb * 0.0625 as int),10000);
HAGR_BUF_GLOBAL_SIZE := LEAST(cast(v_mem_mb * 0.0625 as int),10000);
HJ_BUF_SIZE  :=250;
HAGR_BUF_SIZE :=250;
RECYCLE :=round(RECYCLE,-3);
IF v_mem_mb >= 64000 THEN
FAST_POOL_PAGES :=99999;
FAST_ROLL_PAGES :=9999;
BUFFER :=BUFFER-3000;
MAX_BUFFER :=BUFFER;
CACHE_POOL_SIZE := 2048;
RLOG_POOL_SIZE := 2048;
--     SORT_FLAG = 1;
SORT_BLK_SIZE=1;
SORT_BUF_SIZE=50; 
SORT_BUF_GLOBAL_SIZE= cast(v_mem_mb * 0.02 as int); 
HJ_BUF_GLOBAL_SIZE := cast(v_mem_mb * 0.15625 as int);
HAGR_BUF_GLOBAL_SIZE := cast(v_mem_mb * 0.04 as int);
HJ_BUF_SIZE  :=512;
HAGR_BUF_SIZE :=512;
MEMORY_N_POOLS := 59;
END IF;
DICT_BUF_SIZE := 50;
HJ_BUF_GLOBAL_SIZE :=round(HJ_BUF_GLOBAL_SIZE,-3);
HAGR_BUF_GLOBAL_SIZE :=round(HAGR_BUF_GLOBAL_SIZE,-3);
SORT_BUF_GLOBAL_SIZE :=round(SORT_BUF_GLOBAL_SIZE,-3);
RECYCLE :=round(RECYCLE,-3);
ELSE
MEMORY_POOL :=GREAT(cast(v_mem_mb * 0.0625 as int),100);
MEMORY_POOL :=round(MEMORY_POOL,-2);
MEMORY_N_POOLS := 1;
CACHE_POOL_SIZE := 200;
RLOG_POOL_SIZE  := 256;
SORT_BUF_SIZE := 10;
SORT_BUF_GLOBAL_SIZE := 500;
DICT_BUF_SIZE := 50;
--   SORT_FLAG = 0;
SORT_BLK_SIZE=1;
HJ_BUF_GLOBAL_SIZE := GREAT(cast(v_mem_mb * 0.0625 as int),500);
HAGR_BUF_GLOBAL_SIZE := GREAT(cast(v_mem_mb * 0.0625 as int),500);
HJ_BUF_SIZE := GREAT(cast(v_mem_mb * 0.00625 as int),50);
HAGR_BUF_SIZE :=GREAT(cast(v_mem_mb * 0.00625 as int),50);
END IF;    
IF exec_mode=0 THEN
--修改cpu相关参数
SP_SET_PARA_VALUE(2,'WORKER_THREADS',v_cpus);
SP_SET_PARA_VALUE(2,'TASK_THREADS',TASK_THREADS);
SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',IO_THR_GROUPS);
--修改内存池相关参数
SP_SET_PARA_VALUE(2,'MAX_OS_MEMORY',       mem_per);
SP_SET_PARA_VALUE(2,'MEMORY_POOL',         MEMORY_POOL);
SP_SET_PARA_VALUE(2,'MEMORY_N_POOLS',      MEMORY_N_POOLS);
SP_SET_PARA_VALUE(2,'MEMORY_TARGET',       MEMORY_TARGET);
--修改内存检测参数为1        
SP_SET_PARA_VALUE(2,'MEMORY_MAGIC_CHECK',       1);
--非DSC环境将ENABLE_FREQROOTS设置为1,注意DM7 v$instance视图没有dsc_role字段,DM7这部分可以删掉
if exists(select 1 from v$instance where dsc_role = 'NULL') then
SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS',        1); 
end if;
--修改缓冲区相关参数
SP_SET_PARA_VALUE(2,'BUFFER',              BUFFER);
SP_SET_PARA_VALUE(2,'MAX_BUFFER',          MAX_BUFFER);
SP_SET_PARA_VALUE(2,'BUFFER_POOLS',        BUFFER_POOLS);
SP_SET_PARA_VALUE(2,'RECYCLE',               RECYCLE);    
SP_SET_PARA_VALUE(2,'RECYCLE_POOLS',       RECYCLE_POOLS);
--修改fast_pool相关参数
SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES',     FAST_POOL_PAGES);    
SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES',     FAST_ROLL_PAGES);
--修改HASH相关参数
SP_SET_PARA_VALUE(1,'HJ_BUF_GLOBAL_SIZE',  HJ_BUF_GLOBAL_SIZE);
SP_SET_PARA_VALUE(1,'HJ_BUF_SIZE',         HJ_BUF_SIZE );
SP_SET_PARA_VALUE(1,'HAGR_BUF_GLOBAL_SIZE',HAGR_BUF_GLOBAL_SIZE);
SP_SET_PARA_VALUE(1,'HAGR_BUF_SIZE',       HAGR_BUF_SIZE  );
--修改排序相关参数
--    SP_SET_PARA_VALUE(2,'SORT_FLAG',SORT_FLAG);
SP_SET_PARA_VALUE(2,'SORT_BLK_SIZE',SORT_BLK_SIZE);
SP_SET_PARA_VALUE(2,'SORT_BUF_SIZE',       SORT_BUF_SIZE);
SP_SET_PARA_VALUE(2,'SORT_BUF_GLOBAL_SIZE',       SORT_BUF_GLOBAL_SIZE);
--修改其他内存参数
SP_SET_PARA_VALUE(2,'RLOG_POOL_SIZE',      RLOG_POOL_SIZE);
SP_SET_PARA_VALUE(2,'CACHE_POOL_SIZE',     CACHE_POOL_SIZE);    
SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE',       DICT_BUF_SIZE); 
SP_SET_PARA_VALUE(2,'VM_POOL_TARGET',       16384); 
SP_SET_PARA_VALUE(2,'SESS_POOL_TARGET',       16384); 
--修改实例相关参数
SP_SET_PARA_VALUE(2,'USE_PLN_POOL',        1); 
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR',      1); 
SP_SET_PARA_VALUE(2,'SVR_LOG',             0); 
SP_SET_PARA_VALUE(2,'TEMP_SIZE',           1024);
SP_SET_PARA_VALUE(2,'TEMP_SPACE_LIMIT',    102400); 
SP_SET_PARA_VALUE(2,'MAX_SESSIONS',        3000); 
SP_SET_PARA_VALUE(2,'MAX_SESSION_STATEMENT', 20000); 
SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',        0); 
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0); 
--修改优化器相关参数
SP_SET_PARA_VALUE(2,'OLAP_FLAG',2); 
SP_SET_PARA_VALUE(2,'VIEW_PULLUP_FLAG',1);  
SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1); 
SP_SET_PARA_VALUE(2,'ADAPTIVE_NPLN_FLAG',0); 
--开启并行PURGE
SP_SET_PARA_VALUE(2,'PARALLEL_PURGE_FLAG',1);
--开启手动并行
SP_SET_PARA_VALUE(2,'PARALLEL_POLICY',2);
--UNDO_RETENTION如果放大,可以适当调大UNDO_EXTENT_NUM。负载高的时候,减少文件系统的申请/释放操作。
SP_SET_PARA_VALUE(2,'UNDO_EXTENT_NUM',16);
--开启SQL 注入HINT功能
SP_SET_PARA_VALUE(2,'ENABLE_INJECT_HINT',1);
ELSE
--修改cpu相关参数
PRINT 'SP_SET_PARA_VALUE(2,''WORKER_THREADS'','||v_cpus||');';
PRINT 'SP_SET_PARA_VALUE(2,''TASK_THREADS'','||TASK_THREADS||');';
PRINT 'SP_SET_PARA_VALUE(2,''IO_THR_GROUPS'','||IO_THR_GROUPS||');';
--修改内存池相关参数
PRINT 'SP_SET_PARA_VALUE(2,''MAX_OS_MEMORY'',       '||mem_per||');';
PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_POOL'',         '||MEMORY_POOL||');';
PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_N_POOLS'',      '||MEMORY_N_POOLS||');';
PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_TARGET'',       '||MEMORY_TARGET||');';    
--修改缓冲区相关参数
PRINT 'SP_SET_PARA_VALUE(2,''BUFFER'',              '||BUFFER||');';
PRINT 'SP_SET_PARA_VALUE(2,''MAX_BUFFER'',          '||MAX_BUFFER||');';
PRINT 'SP_SET_PARA_VALUE(2,''BUFFER_POOLS'',        '||BUFFER_POOLS||');';
PRINT 'SP_SET_PARA_VALUE(2,''RECYCLE'',               '||RECYCLE||');';
PRINT 'SP_SET_PARA_VALUE(2,''RECYCLE_POOLS'',       '||RECYCLE_POOLS||');';
--修改fast_pool相关参数
PRINT 'SP_SET_PARA_VALUE(2,''FAST_POOL_PAGES'',     '||FAST_POOL_PAGES||');';    
PRINT 'SP_SET_PARA_VALUE(2,''FAST_ROLL_PAGES'',     '||FAST_ROLL_PAGES||');';
--修改内存检测参数为1        
PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_MAGIC_CHECK'',       1);';
--非DSC环境将ENABLE_FREQROOTS设置为1,注意DM7 v$instance视图没有dsc_role字段,DM7这部分可以删掉
if exists(select 1 from v$instance where dsc_role = 'NULL') then
PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_FREQROOTS'',        1);'; 
end if;
--修改HASH相关参数
PRINT 'SP_SET_PARA_VALUE(1,''HJ_BUF_GLOBAL_SIZE'',  '||HJ_BUF_GLOBAL_SIZE||');';
PRINT 'SP_SET_PARA_VALUE(1,''HJ_BUF_SIZE'',        '||HJ_BUF_SIZE||');';
PRINT 'SP_SET_PARA_VALUE(1,''HAGR_BUF_GLOBAL_SIZE'','||HAGR_BUF_GLOBAL_SIZE||');';
PRINT 'SP_SET_PARA_VALUE(1,''HAGR_BUF_SIZE'',     '||HAGR_BUF_SIZE||');';
--修改排序相关参数
--    PRINT 'SP_SET_PARA_VALUE(2,''SORT_FLAG'','||SORT_FLAG||');';
PRINT 'SP_SET_PARA_VALUE(2,''SORT_BLK_SIZE'','||SORT_BLK_SIZE||');';
PRINT 'SP_SET_PARA_VALUE(2,''SORT_BUF_SIZE'',       '||SORT_BUF_SIZE||');';
PRINT 'SP_SET_PARA_VALUE(2,''SORT_BUF_GLOBAL_SIZE'',       '||SORT_BUF_GLOBAL_SIZE||');';
--修改其他内存参数
PRINT 'SP_SET_PARA_VALUE(2,''RLOG_POOL_SIZE'',      '||RLOG_POOL_SIZE||');';
PRINT 'SP_SET_PARA_VALUE(2,''CACHE_POOL_SIZE'',     '||CACHE_POOL_SIZE||');';    
PRINT 'SP_SET_PARA_VALUE(2,''DICT_BUF_SIZE'',       '||DICT_BUF_SIZE||');'; 
PRINT 'SP_SET_PARA_VALUE(2,''VM_POOL_TARGET'',       16384);';
PRINT 'SP_SET_PARA_VALUE(2,''SESS_POOL_TARGET'',       16384);';
--修改实例相关参数
PRINT 'SP_SET_PARA_VALUE(2,''USE_PLN_POOL'',        1);';
PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_MONITOR'',      1);'; 
PRINT 'SP_SET_PARA_VALUE(2,''SVR_LOG'',             0);'; 
PRINT 'SP_SET_PARA_VALUE(2,''TEMP_SIZE'',           1024);';
PRINT 'SP_SET_PARA_VALUE(2,''TEMP_SPACE_LIMIT'',    102400);';
PRINT 'SP_SET_PARA_VALUE(2,''MAX_SESSIONS'',        1500);';
PRINT 'SP_SET_PARA_VALUE(2,''MAX_SESSION_STATEMENT'', 20000);';
PRINT 'SP_SET_PARA_VALUE(2,''PK_WITH_CLUSTER'',        0);';
PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_ENCRYPT'',0);';
--修改优化器相关参数
PRINT 'SP_SET_PARA_VALUE(2,''OLAP_FLAG'',2);';
PRINT 'SP_SET_PARA_VALUE(2,''VIEW_PULLUP_FLAG'',1);';
PRINT 'SP_SET_PARA_VALUE(2,''OPTIMIZER_MODE'',1);';
PRINT 'SP_SET_PARA_VALUE(2,''ADAPTIVE_NPLN_FLAG'',0);';
--开启并行PURGE
PRINT 'SP_SET_PARA_VALUE(2,''PARALLEL_PURGE_FLAG'',1);';
--开启手动并行
PRINT 'SP_SET_PARA_VALUE(2,''PARALLEL_POLICY'',2);';
--UNDO_RETENTION如果放大,可以适当调大UNDO_EXTENT_NUM。负载高的时候,减少文件系统的申请/释放操作。
PRINT 'SP_SET_PARA_VALUE(2,''UNDO_EXTENT_NUM'',16);';
--开启SQL 注入HINT功能
PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_INJECT_HINT'',1);';
END IF;
select MEMORY_TARGET+BUFFER+RECYCLE+HJ_BUF_GLOBAL_SIZE+HAGR_BUF_GLOBAL_SIZE+CACHE_POOL_SIZE
+DICT_BUF_SIZE+SORT_BUF_GLOBAL_SIZE+RLOG_POOL_SIZE;
exception
when others then
raise_application_error (-20001,substr( ' 执行失败, '||SQLCODE||' '||SQLERRM||' '||dbms_utility.format_error_backtrace  , 1, 400));
<<return_2000>> null;
end;
/

3)重启达梦数据库

进入到达梦安装的bin目录,执行类似:

./DmServiceXXXX restart

这里的XXXX好像你的实例名称。

总结

以上就是DTS工具将Oracle迁移到达梦数据库步骤详解(DM8)的全部内容,希望对你有帮助。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/5119.html
喜欢 (2)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】