利用prebuild MV快速迁移跨平台数据库实施及其总结

做数据库管理维护过程中,难免会碰到一些数据库的迁移需求,不同的环境也需要根据实际情况采取不同的手段,比如对一个有宕机时间要求的数据库来说,采用逻辑导入导出的方式显而易见并不合适。而对于一个跨平台的迁移系统来说,DG也失去了用武之地。对一个跨平台的数据库系统,采用stream,高级复制都可以在相对较短时间完成迁移需求,尽可能减少停机时间。
本文利于prebuild mv的方式来完成跨平台迁移,在实施过程中,如何尽量减少停机时间,以及如何保证数据的物理逻辑,都是我们需要审慎的方面。

迁移之前,有几点问题大家不妨一起考虑:
1. 由于prebuild mv并非采取的schema模式,如果系统表上有大量的约束(譬如外键),所以刷新过程中,由于刷新object的次序问题,很容易导致一些约束冲突。因此,适当的时候建立/启用约束,如何在时间与确保成功上权衡,是我们应该考虑的问题。(当然,根据表之间的逻辑关系,手动制定table的刷新顺序可行,但是工作量无疑太大,而且需要很熟悉的业务逻辑,对大多数迁移来说,并不太适合)
2. 如果库中存在基于该表的物化视图,将不能在其上面创建prebuild table,否则会抛出ORA-32334异常。对于这部分物化视图,需要另行单独处理,如何快速在目标机迁移建立?希望有经验的朋友指点。
3. index 的建立时机,这是个需要权衡的时间与成本问题。
3. 其它job.view,,procedure,package function,trigger, sequenceq等迁移,尤其需要考虑trigger.sequence等过早迁移对系统逻辑数据的影响。

下面来看一下这次的迁移过程。
环境说明:
源 机/库:Window XP SP2 /Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
目标机/库:Solaris 10/Oracle Database 10g Enterprise Edition Release 10.2.0.2.0

迁移步骤:
1. 目标数据库环境的创建,包括db link的建立,用户的权限等等..
2. 迁移源数据库表结构(空结构)并获得创建索引脚本,由于本次采用exp/imp的方式,所以一起将view,procedure,package,function,trigger, sequence等等迁移过去。在目标机,考虑到刷新速度,咱不建立生成index。考虑到数据的逻辑性,禁用外键约束,禁用触发器和删除sequence,删除物化视图。
3. 建立源数据库待刷新表的日志,建立目标数据库的prebuild mv。这部分统一由脚本生成并执行。
4. complete方式刷新object,然后生成index。
5.源库停止业务,采用增量方式刷新object完毕。
6.获得此时主库sequence创建脚本,部署到目标机器,在目标机启用trigger和外键约束。
7.部署job等等其他.

详细实施过程
1. 目标数据库环境的创建,包括db link的建立,用户的权限等等..

SQL> create user fsk identified by fsk123;
User created
SQL> create tablespace fsk_index datafile '/opt/oracle/product/10g/oradata/my/fsk_index_01.dbf' size 2G,'/opt/oracle/product/10g/oradata/my/fsk_index_02.dbf' size 2G;
Tablespace created
SQL> create tablespace fsk_data datafile '/opt/oracle/product/10g/oradata/my/fsk_data_01.dbf' size 2G,'/opt/oracle/product/10g/oradata/my/fsk_data_02.dbf' size 2G;
Tablespace created
SQL> alter user fsk default tablespace fsk_data;
User altered
SQL> @c:\grant_role.sql;
Grant succeeded.
Grant succeeded.
………………….
SQL> create database link demo connect to fsk identified by fsk123  using 'demo';
Database link created
SQL> select * from global_name@demo;
GLOBAL_NAME
------------------------------------------------------------------------------
--
DEMO.COM

2. 迁移源数据库表结构(空结构),由于本次采用exp/imp的方式,所以一起将view,procedure,package,function,trigger, sequence等等迁移过去。在目标机,考虑到刷新速度,暂时不建立生成index。考虑到数据的逻辑性,禁用外键约束,禁用触发器和删除sequence。
(1) exp导出schema

C:\>EXP fsk/fsk123@demo file=c:\trans.dmp log=trans.log
Export: Release 10.2.0.3.0 - Production on 星期四 828 12:00:29 2008
Copyright (c) 1982, 2005, OracleAll rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出
ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
. 正在导出
pre-schema 过程对象和操作
. 正在导出用户
FSK 的外部函数库名
. 导出
PUBLIC 类型同义词
. 正在导出专用类型同义词
. 正在导出用户
FSK 的对象类型定义
即将导出
FSK 的对象...
. 正在导出数据库链接
. 正在导出序号
. 正在导出簇定义
. 即将导出
FSK 的表通过常规路径...
. . 正在导出表                         
COMPANY导出了       4176650
. . 正在导出表                           
DEPT导出了           6900
. . 正在导出表                         
DEPT_MV导出了          12000
. . 正在导出表                             
EMP导出了          120021
. . 正在导出表                         
JOB_SUB导出了        95840
………………………………………………………………………………………
.
. 正在导出
post-schema 过程对象和操作
. 正在导出统计信息
成功终止导出, 没有出现警告。

(2)导入到目标机(索引不导入)

C:\>imp fsk/fsk123@my file=c:\trans.dmp constraints=y rows=n indexes=n log=trans.log
Import: Release 10.2.0.3.0 - Production on 星期四 828 13:11:13 2008
Copyright (c) 1982, 2005, OracleAll rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
 
经由常规路径由
EXPORT:V10.02.01 创建的导出文件
已经完成
ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将
FSK 的对象导入到 FSK
IMP-00017: 由于 ORACLE 错误 2082, 以下语句失败:
 
"CREATE DATABASE LINK "MY.COM" CONNECT TO "FSK" IDENTIFIED BY VALUES '053685"
 
"B4A81E8DFF4EBF5EE4431648D15B' USING 'my'"
IMP-00003: 遇到 ORACLE 错误 2082
ORA-02082: 回送数据库链接必须具有连接限定词
即将启用约束条件...
成功终止导入, 但出现警告。

(3)登录目标机,禁用外键约束和trigger,删除序列,物化视图以及日志。

SQL> @c:\deal_with_trigger_fk_seq.sql
脚本如下:
spool c:\deal_with_trigger_fk_seq_command.sql
set head off
set feedback off
select 'alter trigger '||TRIGGER_NAME||' disable;' from user_triggers;
select 'drop sequence '||sequence_name||';' from user_sequences;
select 'alter table '||TABLE_NAME||' disable constraints '||CONSTRAINT_NAME||';' from user_constraints where CONSTRAINT_TYPE='R';
select 'drop MATERIALIZED VIEW '||MVIEW_NAME||';' from user_mviews;
spool off
spool c:\deal_with_trigger_fk_seq_log.sql
set head on
set feedback on
@
c:\deal_with_trigger_fk_seq_command.sql
spool off

4. 建立源数据库待刷新表的物化视图日志,建立目标数据库的prebuild mv。这部分由脚本统一生成并执行。

(1).在源数据库建立materialized view log
SQL> @c:\create_mv_log.sql
脚本如下:
spool c:\create_mv_log_command.sql
set head off
set feedback off
select 'create materialized view log on '||table_name||' with primary key;' from
(select table_name from user_tables where TABLESPACE_NAME is not null minus select log_table from user_mview_logs minus select mview_name from user_mviews);
spool off
spool c:\create_mv_log_log.sql
set head on
set feedback on
@
c:\create_mv_log_command.sql
spool off

(2).在目标数据库建立materialized view

spool c:\create_mv_command.sql
set head off
set feedback off
select 'CREATE MATERIALIZED VIEW '||table_name||' on prebuilt table REFRESH FAST WITH PRIMARY KEY AS SELECT * FROM '||table_name||'@demo;' from
(select table_name from user_tables where TABLESPACE_NAME is not null minus select log_table from user_mview_logs minus select mview_name from user_mviews);
spool off
spool c:\create_mv_log2.sql
set head on
set feedback on
@
c:\create_mv_command.sql
spool off

5. complete方式刷新object,然后生成index。

@c:\create_mv_command.sql
     脚本如下:
spool c:\refresh_c_command.sql
set head off
set feedback off
select 'exec dbms_mview.refresh('''||MVIEW_NAME||''',''C'');' from user_mviews;
spool off
spool c:\refresh_c_log.sql
set head on
set feedback on
@
c:\refresh_c_command.sql
spool off

生成index

C:\>imp fsk/fsk123@my file=c:\trans.dmp indexfile=c:\index.sql
SQLPLUS>@ c:\index.sql

5.源库停止业务,采用增量方式刷新object完毕,删除prebuild mv,由脚本统一执行。――–停机过程发生在这步操作。

spool c:\refresh_f_command.sql
set head off
set feedback off
select 'exec dbms_mview.refresh('''||MVIEW_NAME||''',''F'');' from user_mviews;
select 'drop MATERIALIZED VIEW '||MVIEW_NAME||';' from user_mviews;
spool off
spool c:\refresh_f_log.sql
set head on
set feedback on
@
c:\refresh_f_command.sql
spool off

6.获得此时源数据库sequence创建脚本,部署到目标库,在目标库启用trigger和外键约束,并在目标数据库创建源数据库遗留的物化视图。
部署序列

select 'CREATE SEQUENCE ' || SEQUENCE_NAME || ' MINVALUE ' || MIN_VALUE || case
        
when Max_VALUE is not null then
          
' MAXVALUE ' || MAX_VALUE
        
else
          
' '
      
end || ' INCREMENT BY ' || INCREMENT_BY ||
      
decode(cycle_flag, 'Y', 'cycle ', ' ') ||
      
decode(order_flag, 'Y', 'order ', ' ') || 'cache ' || cache_size ||
      
' start with ' || to_number(last_number + 100) || ';'
 
from user_sequences;

启用trigger和外键约束(启用外键约束加novalidate选项,加快时间)

SQL> @c:\enable_trigger_fk_seq.sql
脚本如下:
spool c:\ enable_trigger_fk_seq_command.sql
set head off
set feedback off
select 'alter trigger '||TRIGGER_NAME||' enable;' from user_triggers;
select 'alter table '||TABLE_NAME||' enable novalidate constraints '||CONSTRAINT_NAME||';' from user_constraints where CONSTRAINT_TYPE='R';
select 'drop MATERIALIZED VIEW '||MVIEW_NAME||';' from user_mviews;
spool off
spool c:\ enable_trigger_fk_seq_log.sql
set head on
set feedback on
@
c:\ enable_trigger_fk_seq_command.sql
spool off

部署迁移源库遗留的物化视图到目标库。(不知这种带有日志的物化视图如何快速迁移到目标机,有经验心得的不妨指点一下)
使用 select dbms_metadata.get_ddl(’MATERIALIZED_VIEW’,MVIEW_NAME) from user_mviews; 获得创建语句,创建在目标机并完全刷新。
6.部署job等等其他.
使用Prebuild table方式迁移数据库,对于一个基表上没有物化视图日志的系统来说,停机时间会压缩的很小,而且,也不太容易发生问题。但是如果系统中采用了大量的物化视图技术,这些物化视图的迁移会耗费比较长的停机时间,而且,加大了迁移的繁琐程度。

bookmark

相关文章 随机文章

1 Comment

Lilly09月 15th, 2008 at 23:26

不错,mec

Leave a comment

Your comment