通常我們使用EXP/IMP,EXPDP/IMPDP 進行資料庫的遷移,但是若對資料的一緻性要求比較嚴格,要求生産庫的停機時間最短,盡量的減少對應用業務的影響,因為使用邏輯遷移過程中應用會對資料庫持續寫入,在導出,再導入過程中源資料庫和目标資料庫會出現資料不一緻的現象,可以通過物化視圖也可以實作這一功能。
環境:windows 11g + linux 5 11g
oracl 為windows 環境的執行個體,rac1 為linux 的執行個體!
建立測試表。
yang@oracl>create table yangtab (id number primary key ,name varchar2(15));
在測試表上建立物化日志。
yang@oracl>create materialized view log on yangtab;
實體化視圖日志已建立。
yang@oracl>insert into yangtab
2 select rownum id,
3 dbms_random.string('l',15) name
4 from dual
5 connect by level <= 1e6;
已建立1000000行。
yang@oracl>commit;
送出完成。
yang@oracl>host date
目前日期: 2011/03/19 周六
輸入新日期: (年月日)
yang@rac1>host time
目前時間: 12:49:45.67
輸入新時間:
yang@oracl>select count(1) from yangtab;
COUNT(1)
----------
1000000
在目标庫上建立基于源庫yangtab 的物化視圖,并設定每隔1分鐘進行重新整理一次。
yang@rac1>create materialized view yangtab_mv
2 refresh fast start for update with sysdate next sysdate +1/1440
3 with primary key as select * from yangtab@linkyang;
Materialized view created.
yang@rac1>select job,log_user,last_date,last_sec,next_date,next_sec,interval,what from user_jobs;
JOB LOG_USER LAST_DATE LAST_SEC NEXT_DATE NEXT_SEC INTERVAL WHAT
---- -------- --------------------- ---------- ------------------------- ---------------- -------------
146 YANG Mar 19 2011 11:27:01 11:27:01 Mar 19 2011 11:28:01 11:28:01 sysdate +1/1440 dbms_refresh.refresh('"YANG"."YANGTAB_MV"');
yang@rac1>select * from tab;
TNAME TABTYPE CLUSTERID
---------------------- ------- ----------
V TABLE
YANGALL TABLE
YANGTAB_MV TABLE
在源庫插入資料後,從目标庫上查詢基表的資料
yang@rac1>select count(1) from yangtab@linkyang;
此時查詢物化視圖還沒資料,重新整理物化視圖需要時間。
yang@rac1>select count(1) from yangtab_mv;
等待一段時間後,可以查詢到物化視圖中有資料了。
在生産環境中可能還有應用對yangtab 進行操作,在對基表進行最後一次重新整理前,将應用遷移到目标庫上對 建立的物化視圖進行通路(物化視圖必須是可更新的,否則在目标庫不可對mv 進行dml操作)。
在目标庫中手工執行重新整理物化視圖。
yang@rac1>EXEC DBMS_MVIEW.REFRESH('MV_YANGTAB');
PL/SQL 過程已成功完成。
此操作保證目标和源資料庫中的資料一緻。至此 從windows 環境下将資料遷移到linux環境的操作完成。