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;