在上线迁移Oracle数据库到达梦数据库后,比对源库(Oracle11g)和目标库(DM8)的数据库对象和数据量是必不可少的步骤。为了提高比对效率,可以在Oracle和达梦数据库上分别编写存储过程,将统计结果动态插入临时表中,具体步骤如下:
一、统计源库(Oracle)的数据对象数量和数据库表的数据量:
1、创建临时表,用于存放统计结果:
–创建数据库对象清单表
create table object_list (owner varchar2(100),object_name varchar2(100),object_type varchar2(100));
–创建数据库对象统计结果表:
create table object_count (owner varchar2(100),object_type varchar2(100),cnt int);
–创建数据库表的数据量统计表:
create table table_count (owner varchar2(100),table_name varchar2(100),cnt int);
2、遍历数据库对象,存入数据库对象清单表(object_list):
declare
v_owner VARCHAR2(100);
v_objname VARCHAR2(100);
v_objtype VARCHAR2(100);
CURSOR obj_cursor IS select owner,object_name,object_type from dba_objects where owner=‘HR’ order by 1, 2;
begin
FOR obj_record IN obj_cursor LOOP
–DBMS_OUTPUT.PUT_LINE(‘用户名:’||obj_record.owner||’,对象名:’||obj_record.object_name||’,对象类型:’||obj_record.object_type);
insert into object_list values(obj_record.owner,obj_record.object_name,obj_record.object_type);
END LOOP;
commit;
end;
3、将数据库对象统计结果插入数据库对象统计结果表(object_count):
insert into object_count select owner,object_type,count() from object_list group by owner,object_type order by count() desc;
commit;
4、查询数据库对象清单和数据库对象统计结果:
select owner,object_type,object_name from object_list order by 1,2,3;
select owner,object_type,cnt from object_count order by cnt desc;
5、查询数据库表的数据量,插入数据量统计表(table_count):
declare
v_owner VARCHAR2(100);
v_tabname VARCHAR2(100);
stmt VARCHAR2(200);
num_rows number;
CURSOR tab_cursor IS
select owner,table_name from dba_tables where owner=‘HR’ order by 1, 2;
begin
FOR tab_record IN tab_cursor LOOP
–DBMS_OUTPUT.PUT_LINE(‘用户名:’||tab_record.owner||’,表名:’||tab_record.table_name);
stmt:=‘select count(1) from ‘||tab_record.owner||’.’||tab_record.table_name;
–DBMS_OUTPUT.put_line(stmt);
execute immediate stmt into num_rows;
insert into table_count values(tab_record.owner,tab_record.table_name,num_rows);
END LOOP;
commit;
end;
6、将object_count和table_count表按照cnt倒序排序并导出为excel表格;
二、使用DMETL、DMDTS或DMDBLINK等方式进行数据迁移;
三、迁移结束后,统计目标库(DM)的数据对象数量和数据库表的数据量:
1、创建临时表,用于存放统计结果:
–创建数据库对象清单表
create table object_list (owner varchar2(100),object_name varchar2(100),object_type varchar2(100));
–创建数据库对象统计结果表:
create table object_count (owner varchar2(100),object_type varchar2(100),cnt int);
–创建数据库表的数据量统计表:
create table table_count (owner varchar2(100),table_name varchar2(100),cnt int);
2、遍历数据库对象,存入数据库对象清单表(object_list):
declare
v_owner VARCHAR2(100);
v_objname VARCHAR2(100);
v_objtype VARCHAR2(100);
begin
for rec in (select owner,object_name,object_type from dba_objects where owner=‘DMHR’ order by 1, 2)
loop
select rec.owner,rec.object_name,rec.object_type into v_owner,v_objname,v_objtype from dual;
EXECUTE IMMEDIATE ‘insert into object_list values(’’’||v_owner||’’’,’’’||v_objname||’’’,’’’||v_objtype||’’’);’;
end loop;
end;
3、将数据库对象统计结果插入数据库对象统计结果表(object_count):
–truncate table object_count;
insert into object_count select owner,object_type,count() from object_list group by owner,object_type order by count() desc;
commit;
4、查询数据库对象清单和数据库对象统计结果:
select owner,object_type,object_name from object_list order by 1,2,3;
select owner,object_type,cnt from object_count order by cnt desc;
5、查询表的数据量,插入数据量统计表(table_count):
declare
v_owner VARCHAR2(100);
v_tabname VARCHAR2(100);
stmt VARCHAR2(200);
num_rows number;
begin
for rec in (select owner,table_name from dba_tables where owner=‘DMHR’ order by 1, 2)
loop
select rec.owner,rec.table_name into v_owner,v_tabname from dual;
stmt := ‘select count(*) from "’ || v_owner || ‘"."’ || v_tabname || ‘"’;
EXECUTE IMMEDIATE stmt INTO num_rows;
EXECUTE IMMEDIATE ‘insert into table_count values(’’’||v_owner||’’’,’’’||v_tabname||’’’,’’’||to_number(num_rows)||’’’);’;
end loop;
end;
6、将object_count和table_count表按照cnt倒序排序并导出为excel表格;
三、将源库和目标库中导出的excel表格合并进行手工比对或导入同一个数据库下面用语句进行关联比对,检查数据库对象是否有漏迁和重复迁移的情况;
四、提示:在具体实施过程中要将源库(Oracle)中的模式名(HR)、目标库中的模式名(DMHR)替换为真实场景中的模式名。
文章
阅读量
获赞