注册
DTS工具数据迁移(ORACE->DM8)
专栏/培训园地/ 文章详情 /

DTS工具数据迁移(ORACE->DM8)

晗console 2024/11/07 1512 1 0
摘要

需要先在Windows安装好DM8,任意版本均可

试用版下载地址:https://eco.dameng.com/download/?_blank

注:迁移前,先确定下oracle的初始化参数,使DM的初始化参数尽量相同,不然可能出现字段类型精度问题、字符串截断、记录超长等报错,这些报错会在结尾处有说明。

一、迁移前准备

1、在DM创建对应的表空间和用户

根据Oracle的表空间、用户使用表空间的情况,在DM创建对应的表空间和用户

--数据表空间 create tablespace "YCXS1000_DAT" datafile 'YCXS1000_DAT01.DBF' size 64 autoextend on maxsize 102400, 'YCXS1000_DAT02.DBF' size 64 autoextend on maxsize 102400 CACHE = NORMAL; --索引表空间 create tablespace "YCXS1000_IDX" datafile 'YCXS1000_IDX01.DBF' size 64 autoextend on maxsize 102400, 'YCXS1000_IDX02.DBF' size 64 autoextend on maxsize 102400 CACHE = NORMAL; --创建用户 CREATE USER "YCXS1000" IDENTIFIED BY "密码" DEFAULT TABLESPACE "YCXS1000_DAT" DEFAULT INDEX TABLESPACE "YCXS1000_IDX"; grant "RESOURCE","PUBLIC","VTI","SOI" to "YCXS1000"; grant CREATE SESSION to "YCXS1000";

2、DTS工具创建工程

image.png
image.png
image.png
image.png

二、迁移序列

可能会有许多表或者其他对象使用到序列,先迁移
image.png

三、迁移自定义类型

有些表或者对象会使用到自定义类型,也优先迁移
image.png

四、迁移表

迁移表比较特殊,分3个步骤:表结构+主键+注释、数据、索引+约束,这么做的目的是防止索引约束干扰数据的插入。

1、迁移表结构+主键+注释

image.png
image.png
image.png
点击确定,然后出现迁移清单,确认清单内容无误后,点击“完成”开始迁移

2、迁移数据

回到这个步骤,然后按下图进行勾选
image.png
注意:如果所选的表有自增列,需要勾选“启用标志列插入”,以防自增列数据不一致。
点击确定后,出现迁移清单,确认无误后,点击“完成”开始迁移

3、迁移索引+约束

image.png
点击确定后,出现迁移清单,确认无误后,点击“完成”开始迁移

五、迁移视图+物化视图

到了这里其实就比较考验对源库的熟悉程度了,有时视图会引用函数或存储过程,那么得优先迁移被引用的对象,然后再迁移其他对象。这里先说下视图的迁移
image.png
image.png
点击确定后,出现迁移清单,确认无误后,点击“完成”开始迁移。物化视图的操作也是如此。

六、迁移存储过程+函数

image.png
image.png
点击确定后,出现迁移清单,确认无误后,点击“完成”开始迁移

七、同义词

image.png
image.png
点击确定后,出现迁移清单,确认无误后,点击“完成”开始迁移

八、迁移包

DTS迁移包时,会把包头和包体一起迁移,不分开的
image.png
image.png
点击确定后,出现迁移清单,确认无误后,点击“完成”开始迁移

九、迁移触发器

一般触发器都是放在最后迁移,因为有可能它会对数据迁移造成影响,当然也可根据对源库业务的了解程度,确定什么时机迁移最佳,这里放最后迁移只是建议。
image.png
image.png
点击确定后,出现迁移清单,确认无误后,点击“完成”开始迁移

十、一些常见报错

1、记录超长

这个是数据太长导致,数据库是以页为单位作为存储,初始化参数中的页大小决定一条数据的大小,当数据的大小超出时就会报错。
解决方案:
1、可以启用超长记录

alter table 表名 enable using long row ;

打开后,一条记录的页的存储空间就不会受限制。但是要注意,若插入数据的列有索引,则可能会报错,反之,插入后再给这个列创建索引时也可能会报错。
2、提高页大小,但初始化库后页大小不能修改,所以只能新初始化一个库,将页大小设置高一些再迁移数据,一般存储不紧张时,且数据较大时,建议用32k页大小,因此迁移前尽量保证页大小与源库相同。

2、非法的基类名XXXX

这个报错是迁移的对象中,引用了源库自带的系统函数或存储过程,在DM中没有同名时导致。或者是该系统函数或存储过程,在源库中属于模式A,但在DM中属于模式B,通过修改DDL把A成B也可以。
解决方案:
可以查询DM8的手册,找到对应功能的存储过程或函数,将迁移对象的DDL改写,或创建同名的公共同义词。

3、XXXX附近存在错误

这个报错是迁移对象的DDL中XXXX处的SQL写法,与DM8不一致导致,需要将对象的DDL进行改写。

第二种情况是SQL中有关键字,比如percent,这时需要将关键字用双引号括起并改为大写,或者将关键字添加到屏蔽参数里,如下:
(1)可以在dm_svc.conf中添加KEYWORDS参数,并使用服务名连接数据库。
(2)登录数据库执行sp_set_para_string_value(2,'EXCLUDE_RESERVED_WORDS','关键字大写'); 但需要重启数据库才能生效。

4、无效的过程/函数名

这个报错是迁移的对象引用了源库的系统函数或存储过程,且DM8正好有同名同功能的函数或存储过程,但是参数位置、数量可能不相同,导致的报错,需要将对象的DDL进行改写。

5、无效的对象XXXX

这个报错是迁移的对象中,引用了其他对象,但是引用的对象没有迁移或编译不过导致,需要将引用的对象迁移,或者编译通过,然后再迁移该报错对象。

6、无法解析的成员访问表达式XXXX

这个报错是迁移对象的DDL中XXXX处的SQL写法,与DM8不一致导致,与第3点有点像,也是需要将对象的DDL进行改写,比如,将USERENV('LANG')改为SYS_CONTEXT('USERENV','LANG')。

7、无效的表或视图XXXX

这个报错是迁移对象的DDL中调用了源库的系统表或系统视图,在DM中没有同名时导致,需要将对象的DDL进行改写。

8、错误的日期时间类型格式XXXX

这个报错是时间类型数据格式不一致引起,比如:2021-09-22 18:35:14.788+08,要去掉“+08”时区,因为DM需要+号前有空格,去掉后也不影响,插入时DM会为数据自动生成+08时区。

9、数据类型不匹配

这个报错非常好理解,就是插入的数据与DM中的字段类型不匹配,比如bit类型,在某些库中是false和true,在DM是0和1,根据业务情况修改即可。

10、数据大小已超过可支持范围

这个报错是数据已经超过了字段类型的最大精度,那只能修改成大字段,比如TEXT。

11、长度超出定义

这个是字段类型的精度不足,增加精度即可解决。

12、字符串截断

一般是表的列,字段类型精度不够,扩展1~2倍即可解决,比如现在的varchar(10),可将其扩展至20或30,其他列也是相同操作,2000及以上的精度可暂时不做扩展,除非其他列都扩展后还是有报错,再考虑扩展该长度的列。

十一、数据对比

执行以下SQL,会打印出对比的SQL,将其全部复制出来后,再执行,即可得到源库与新库的数据情况,粘贴到EXCEL里进行对比即可。
Oracle的:

--Oracle --表数据 select 'select count(*) from '||owner||'.'||table_name||' union all' from all_tables where owner='模式名大写' order by table_name asc; --主键 select owner,constraint_name,status from all_constraints where owner='模式名大写' and constraint_type = 'P' order by 1,2,3 asc;--注意将复制出来的sql里,最后一条sql末尾的union all删掉,改为分号即可 --外键 select owner,constraint_name,status from all_constraints where owner='模式名大写' and constraint_type = 'R' order by 1,2,3 asc; --索引 create table ORACLE_INDEX_COUNT AS select owner,index_name,index_type,status from all_indexes where owner='模式名大写' and index_name not like 'SYS_%' AND index_name not like '%_PK' order by 1,2,3,4 asc; --注释 select owner,table_name,column_name,comments from all_col_comments where schname = '模式名大写' order by 1,2,3 asc; --同义词: select owner,synonym_name from dba_synonyms where owner='模式名大写' order by 1,2 asc; --序列 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='SEQUENCE' order by 1,2,3 asc; --视图 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='VIEW' order by 1,2,3 asc; --函数 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='FUNCTION' order by 1,2,3 asc; --存储过程 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='PROCEDURE' order by 1,2,3 asc; --触发器 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='TRIGGER' order by 1,2,3 asc; --自定义类型 select owner,object_name,status from all_objects where owner='模式名大写' and object_type in ('TYPE','TYPE BODY','CLASS') order by 1,2,3 asc; --包 select owner,object_name,status from all_objects where owner='模式名大写' and object_type in ('PACKAGE','PACKAGE BODY') order by 1,2,3 asc;

DM8的:

--表数据 select 'select count(*) from '||owner||'.'||table_name||' union all' from all_tables where owner='模式名大写' order by table_name asc;--注意将复制出来的sql里,最后一条sql末尾的union all删掉,改为分号即可 --主键 select owner,constraint_name,status from all_constraints where owner='模式名大写' and constraint_type = 'P' order by 1,2,3 asc; --外键 select owner,constraint_name,status from all_constraints where owner='模式名大写' and constraint_type = 'R' order by 1,2,3 asc; --索引 select owner,index_name,index_type,status from all_indexes where owner='模式名大写' and index_name not like 'INDEX%' order by 1,2,3,4 asc; --注释 select schname,tvname,colname,comment$ from syscolumncomments where schname = '模式名大写' order by 1,2,3 asc; --同义词: select owner,synonym_name from dba_synonyms where owner='模式名大写' order by 1,2 asc; --序列 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='SEQUENCE' order by 1,2,3 asc; --视图 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='VIEW' order by 1,2,3 asc; --函数 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='FUNCTION' order by 1,2,3 asc; --存储过程 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='PROCEDURE' order by 1,2,3 asc; --触发器 select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='TRIGGER' order by 1,2,3 asc; --自定义类型 select owner,object_name,status from all_objects where owner='模式名大写' and object_type in ('TYPE','TYPE BODY','CLASS') order by 1,2,3 asc; --包 select owner,object_name,status from all_objects where owner='模式名大写' and object_type in ('PACKAGE','PACKAGE BODY') order by 1,2,3 asc;

当发现数据不一致时,或者数据有重复时,可以使用以下SQL排查:

--查看数据重复 select1,count(*) from "表名大写" group by1 having count(*) > 1;

至此,DTS学习使用心得如上,有疑问或错误可留言,谢谢!

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服