ORACLE迁移DM8及遇到问题解决方法

统计oracle数据库的基础信息

——统计页大小

select name,value from v$parameter where name = ‘db_block_size’;

——查询编码格式

select * from v$nls_parameters a where a.PARAMETER = ‘NLS_CHARACTERSET’;

统计oracle数据中的对象以及表的数据量
——根据指定用户统计用户下的各对象类型和数目

select object_type,count(*) from all_objects where owner = ‘用户名’ group by object_type;

——创建移植辅助表,统计指定用户下所有的对象并插入到辅助表中

create table oracle_objects(obj_own varchar(100),obj_name varchar(100)obj_type varchar(50));
insert into oracle_objects select owner,object_name,object_type from all_objects where owner = ‘用户名’

——创建辅助移植表,统计每个表的数据量并插入到辅助移植表中

create table oracle_tables(tab_owner varchar(100),tab_name varchar(100),table_count int);

begin
  for rec in (select owner ,object_name from all_objects where owner = ‘用户名’ and object_type = ‘TABLE’)loop
  begin 
    execute immediate 'insert into oracle_tables select '''|| rec.owner ||''','''|| rec.object_name ||''',count(*) from '|| rec.owner || '.' || rec.object_name;
    exception when others then
        dbms_output.putline( rec.owner || '.' || rec.object_name || 'get count error');
    end;
    end loop;
end;

select * from oracle_tables;

——选择合适的初始化参数
主要是关于页大小,大小写敏感,以及字符集的选择等参数。
//关于页大小,到时候主要是统计表中char和varchar类型字段的长度。

——配置合适的INI参数
oracle中null与空值是相等的,但是dm中不相等。这种情况下需要修改

——创建用户和表空间

select username.default tablespace from user_user;


select t.tablespace name,round(SUM(bytes/(1024*1024)),0) ts_size//检查表空间的大小
from dba_tablespaces t,dba_data_files d
where t.tablespace_name = d.tablespace_name
GROUP BY t.tablespace_name;

select * from dba_users;

指定迁移计划

  1. 选择合理的迁移顺序,先迁移序列,再迁移表,最后迁移视图。
  2. 对于数据量大的表单独迁移。
  3. 对于分区表如果数据量没有超过一亿的建议迁移成普通表,在分区列上创建索引
  4. 对于大字段较多的表,需要修改批量的行数,以免造成迁移工具内存溢出

核对移植结果
根据指定用户统计用户下的各对象类型和数目

select object_type,count(*) from all_objects where owner=’OA8000_DM2015’ group by object_type;

统计指定用户下所有的对象,并更新记录到新的记录表中

create table dm_object(obj_owner varchar(100),obj_name varchar(100),obj_type varchar(50));
insert into dm_objects select
owner,object_name,object_type from all_objects
where owner = ‘OA8000_DM2015’;

统计每个表的数据量到表数据记录表

create table dm_tables(tab_owner varchar(100),tab_name varchar(100),table_count int);

begin
  for rec in (select owner ,object_name from all_objects where owner = ‘用户名’ and object_type = ‘TABLE’)loop
  begin 
    execute immediate 'insert into dm_tables select '''|| rec.owner ||''','''|| rec.object_name ||''',count(*) from '|| rec.owner || '.' || rec.object_name;
    exception when others then
        dbms_output.putline( rec.owner || '.' || rec.object_name || 'get count error');
    end;
    end loop;
end;

select * from dm_tables;

对应达梦数据库中对象和oracle库中对象及数据量差异
对比对象

select * from oracle_object where (obj_owner,obj_name) not in
(select obj_owner,obj_name from dm_object) and obj_type=’TABLE’;

对比表数据量

select a.tab_owner,a.tab_name,a.tab_count,b.tab_count 
from oracle_tables a,dm_tables b
where a.tab_owner=b.tab_owner and a.tab_name=b.tab_name
and a.tab_count,b.tab_count<>0;

迁移错误总结
——字符串截断。大部分是因为编码问题
==初始化时,字符集选择GB18030
==选择VACHAR类型以字符为单位

——记录超长。大部分是因为页设置时太小
==找到表中varchar中比较长的类似vachar(8000),修改成TEXT类型;
==初始化时页大小选择32K

——违法唯一性约束。表中有唯一性约束,但是被禁用了,导致表中有重复数据。还有可能是数据迁移时重复了。
==在确定源数据没有问题的情况下,点击转换,选择先删除后拷贝。

——违反引用约束。主要是因为外键约束造成的,父表的数据没有迁移就迁移了主表。
==迁移的时候先不选择迁移外键等约束,在选择好需要迁移的表时,在转换中不选择约束和索引,也不选择数据。等待第一次迁移没有错误后,第二次只选择迁移数据。第三次再选择迁移约束和索引。

——无效的表或视图名。迁移视图之前没有迁移视图依赖的表。
==先迁表

PLSQL移植错误总结
使用oracle系统包
== ORACLE系统包也可以在达梦中使用SP_CREATE_SYSTEM_PACKAGES语句,开启系统包的使用。
使用中文符号的问题
==达梦中不支持语法使用中文标点符号
保留字问题
==由于使用达梦的保留字冲突导致,需要将关键字用双引号引起来
数据类型问题
==修改数据类型,例如将long修改成varchar类型
oracle特有函数问题
==修改对应函数,例如TO_NCHAR()修改成TO_CHAR()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值