oracle11g迁移达梦dm8
概述
随着国家对自主可控的日益重视,目前在党政机关、军队、大型央企、国企等行业和区域中面临越来越多的国产化,去ioe的需求,其中最难的是去oracle,所以公司基于安可项目对oracle迁移国产数据库达梦进行测试.
- 迁移过程
- 迁移工具、环境
迁移工具 | 迁移用户 | 源端数据库版本 | 目标端数控版本 |
dm数据迁移工具(dm自带) | lyjoa | oracle11.2.0.4 (ip:90.90.90.17) | dm8(ip:90.90.90.18) |
- 迁移对象
lyjoa用户下:所有表(数据量)、分区表、视图、物化视图、序列、自定义类型 触发器 同义词 存储过程、函数、包
- 迁移前对源端oracle数据库系统分析
分析目的:(迁移完成做数据校验)
统计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='lyjoa' group by object_type;
--创建移植辅助表,统计指定用户下所有的对象并插入到辅助表中
create table oracle_objects(obj_owner 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='lyjoa';
select * from oracle_objects;
--创建移植辅助表,统计每个表的数据量并插入到移植辅助表中
create table oracle_tables(tab_owner varchar(100),tab_name varchar(100),tab_count int);
begin
for rec in (select owner,object_name from all_objects where owner='lyjoa' 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;
- 目标端dm数据库初始化参数设置
(1)关于页大小 page_size。建议设置页大小为8kb,注:安装达梦库时必须设置好
(2)关于字符集charset。建议采用默认值gb18030
(3)ini 参数文件:compatible_mode设置为2
- 创建用户和表空间
从oracle移植到dm8,要求必须创建新的用户和表空间,不要把数据迁移到系统管
理员sysdba用户下和main表空间下。
首先需要分析本次移植 oracle 源库需要移植的是哪一个或者哪几个用户的数据,然
后分别创建这些需要移植的用户和对应的表空间;
创建表空间语句:
create tablespace "mdoa" datafile '/dm/dmdbms/data/dameng/mdoa.dbf' size 200 autoextend on maxsize 16777215
创建用户语句:
create user "lyjoa" identified by "******" default tablespace "mdoa"
default index tablespace "mdoa";
授权:
grant "resource","public" to "lyjoa";
- 迁移步骤
(1)建立源端oracle数据库数据源:
(2)建立目的达梦数据库数据源
(3)选择迁移对象
- 核对数据库移植结果
统计达梦数据基础信息
--统计页大小 select page;
--通过编码格式 select unicode;
--统计大小写敏感参数 select case_sensitive;
统计达梦数据中的对象以及表数据量
a. 根据指定用户统计用户下的各对象类型和数目
select object_type,count(*) from all_objects where owner='lyjoa' group by object_type;
b. 统计指定用户下所有的对象,并记录到新的记录表中
create table dm_objects(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='lyjoa';
c. 统计每个表的数据量到表数据记录表
1. create table dm_tables(tab_owner varchar(100),tab_name varchar(100),tab_count int);
2. begin for rec in (select owner,object_name from all_objects where owner='lyjoa' 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 print rec.owner || '.' || rec.object_name || 'get count error'; end; end loop; end;
3. select * from dm_tables;
对比达梦数据库中对象和oracle库中对象以及数据量差异
a. 比对对象,找出没有迁移的对象
select * from oracle_objects where (obj_owner,obj_name) not in ( select obj_owner,obj_name from dm_objects ) --and obj_type='table' ;
b. 比对表数据量,找出数据量不相等的表
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
- 数据库移植完毕后的收尾工作
更新统计信息 数据核对完成无问题后,应进行一次全库的统计信息更新工作。统计信息更新脚本示例如下:
dbms_stats.gather_schema_stats( 'lyjoa', --lyjoa为模式名 100, false, 'for all columns size auto');
更新统计信息的目的在于大批量迁移数据后,可能会导致数据库优化器根据错误的统计信息 得到错误的查询计划,严重影响查询性能。 数据备份 再对数据更新完统计信息后,在数据量不大,磁盘空间足够
- 迁移兼容总结
序列的最少值不一样:oracle是0,dameng是1
create sequence "lyjoa"."seq_zwgl_work_contact_id"
increment by 1
start with 22
maxvalue 9223372036854775807
minvalue 0 改为 minvalue 1
cache 20;