zt 跨平臺 跨版本 大規模資料遷移

asword發表於2009-02-04
ZT
===========================================================
[@more@]

昨天在 pub 上看到一個問題,

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/82387/viewspace-1016689/,如需轉載,請註明出處,否則將追究法律責任。

相關文章