oracle 9i 如果600G 的资料库需要进行最短时间的跨平台(windows 到unix) 停机(12 小时)迁移,该如何进行数据迁移 ?
请教了 biti
作了一下测试
prebuilt mv 做大表,
小表直接 dblink insert ,数据库30分钟足够了
利用prebuilt mv实现跨平台,跨版本数据迁移
该方法的实现原理是对于要迁移的表对象,需要有一个主键,用于mv的刷新,对于符合该要求的表,在源表上创建mv日志,再在目标数据库上创建结构一样的表,然后在目标表上采用prebuilt方式创建mv,第一次采用完全刷新,之后采用增量刷新,等真正要切换的时候,只需要刷新完增量的日志,删除mv,保留目标表即可。需要刷新的表都加上主键
基本思路的例子:
--1.在源库上创建表和mview log
SQL> create table big_t1 as select * from
dba_objects;
Table created.
SQL> select count(1) from big_t1;
COUNT(1)
----------
6170
SQL> create materialized view log on big_t1;
Materialized view log created.
--2.在目标数据库上创建与该表一样的表,并在该表上创建prebuilt mv
SQL> create table big_t1 as
select * from where 1=2;
Table created.
SQL> select count(1) from big_t1;
COUNT(1)
----------
0
SQL> create materialized view big_t1 on prebuilt table refresh fast as
select * from
Materialized view created.
--3.做完全刷新和增量刷新
SQL> exec
dbms_mview.refresh('BIG_T1','complete');
PL/SQL procedure successfully completed.
SQL> select count(1) from big_t1;
COUNT(1)
----------
6170
SQL>
--/*此时模拟在做完全刷新过程中,源库的表又发生了变化
SQL> insert into big_t1(object_id,owner)
values(99991,'test');
1 row created.
SQL> commit;
Commit complete. */
--再做增量刷新
SQL> select count(1) from big_t1;
COUNT(1)
----------
6170
SQL> exec
dbms_mview.refresh('BIG_T1');
PL/SQL procedure successfully completed.
SQL> select count(1) from big_t1;
COUNT(1)
----------
6171
--4.停机切换,做最后一次刷新,然后删除源库的mview log和目标库的mview
SQL> exec dbms_mview.refresh('BIG_T1');
PL/SQL procedure successfully completed.
SQL> drop materialized view big_t1; -----目标库上
Materialized view dropped.
SQL> select count(1) from big_t1;
COUNT(1)
----------
6171
drop materialized view big_t1; -----目标库上
drop materialized view big_t1 log on big_t1; -----目标库上
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7765550/viewspace-545364/,如需转载,请注明出处,否则将追究法律责任。