Oracle 10g通過創(chuàng)建物化視圖實現(xiàn)不同數(shù)據(jù)庫間表級別的數(shù)據(jù)同步

Materialized View(物化視圖)是包括一個查詢結果的數(shù)據(jù)庫對像, 它是遠程數(shù)據(jù)的的本地副本,或者用來生成基于數(shù)據(jù)表求和的匯總表。物化視圖存儲基于遠程表的數(shù)據(jù)堕伪,也可以稱為快照。 這個基本上就說出了物化視圖的本質栗菜,它是一組查詢的結果欠雌。

一. Oracle 10g 物化視圖語法如下:

create materialized view [view_name]
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)
]
as
{創(chuàng)建物化視圖用的查詢語句}

以上是Oracle創(chuàng)建物化視圖(Materialized View,以下簡稱MV)時的常用語法,各參數(shù)的含義如下:

  1. refresh [fast|complete|force] 視圖刷新的方式:

     fast: 增量刷新.假設前一次刷新的時間為t1,那么使用fast模式刷新物化視圖時,只向視圖中添加t1到當前時間段內,主表變化過的數(shù)據(jù)。
           為了記錄這種變化疙筹,建立增量刷新物化視圖還需要一個物化視圖日志表富俄。
           create materialized view log on (主表名)。(多張表時腌歉,此語句也生效蛙酪,創(chuàng)建后,原來的表中會多出兩類視圖表:MLOG$_table_name和RUPD$_table_name)
    
     complete: 全部刷新翘盖。相當于重新執(zhí)行一次創(chuàng)建視圖的查詢語句。
    
     force: 這是默認的數(shù)據(jù)刷新方式凹蜂。當可以使用fast模式時馍驯,數(shù)據(jù)刷新將采用fast方式;否則使用complete方式玛痊。
    
  2. MV數(shù)據(jù)刷新的時間:

     on demand: 在用戶需要刷新的時候刷新汰瘫,這里就要求用戶自己動手去刷新數(shù)據(jù)(可以使用JOB定時刷新);
     on commit: 當主表中有數(shù)據(jù)提交的時候,立即刷新MV中的數(shù)據(jù)擂煞;
     start ……:從指定的時間開始混弥,每隔一段時間(由next指定)就刷新一次;
    
     全刷新mv_test物化視圖:
    
begin
     dbms_mview.refresh(TAB=>'MV_TEST',
                        METHOD=>'COMPLETE',
                        PARALLELISM=>8);
end;
/

增量刷新:

begin
     dbms_mview.refresh(TAB=>'MV_TEST',
                        METHOD=>'FAST',
                        PARALLELISM=>1);
end;
/

或者对省,也可以這樣執(zhí)行:

exec dbms_mview.refresh('MV_TEST','F');
dbms_mview.refresh('表名', 'F')   --快速刷新蝗拿,也就是增量刷新
dbms_mview.refresh('表名', 'C')   --完全刷新

二. 實例演示:

以下是我通過創(chuàng)建物化視圖,實現(xiàn)不同數(shù)據(jù)庫間表級別的數(shù)據(jù)同步的一個過程記錄蒿涎,(兩臺服務器A和B哀托,其中要把數(shù)據(jù)從A節(jié)點的表zh_major_item同步到B節(jié)點上)。目前實現(xiàn)同步的過程還只是一個單向的過程劳秋,也就是從A節(jié)點 ---> B節(jié)點:

主要步驟:

  1. 在A節(jié)點創(chuàng)建原表和物化視圖日志
  2. 在B節(jié)點創(chuàng)建連接A節(jié)點的遠程鏈接
  3. 在B節(jié)點處,創(chuàng)建目標表和與目標表名稱相同的物化視圖

1. 在A節(jié)點創(chuàng)建原表和物化視圖日志:

--在源A處 創(chuàng)建物化視圖日志
sqlplus tianzhi_smart/tianzhi_smart@localhost:1521/orcl

--原表zh_major_item之前已經存在仓手,這里就不贅述表創(chuàng)建的過程了
--創(chuàng)建物化視圖日志
create materialized view log on zh_major_item;

2. 在B節(jié)點創(chuàng)建連接A節(jié)點的遠程鏈接:

--在目標B處 創(chuàng)建遠程連接
--如果沒有創(chuàng)建遠程連接的權限,需要登錄sysdba,為用戶授權;

--之所以跟上面一樣,因為我的用戶名和密碼相同而已
sqlplus tianzhi_smart/tianzhi_smart@localhost:1521/orcl

--創(chuàng)建遠程連接 db_link
create public database link db_link_A 
    connect to tianzhi_smart 
    identified by "tianzhi_smart" 
    using '192.168.56.6:1521/ORCL';
    
--驗證是否創(chuàng)建成功
select * from zh_major_item@db_link_A ;

3. 在B節(jié)點處,創(chuàng)建目標表和與目標表名稱相同的物化視圖:

--B節(jié)點處創(chuàng)建目標表bc_major_item
create table bc_major_item 
as select * from zh_major_item@db_link_A where 1=2;

--通過遠程連接向A節(jié)點建立一個與目標表(bc_major_item)名稱相同的物化視圖    
--使用on prebuilt table注冊新的物化視圖胖齐,注意view名稱必須和表名稱一樣
--使用on prebuilt table創(chuàng)建的物化視圖被刪除后,原來的表不被刪除
--注意這里我創(chuàng)建是refresh fast on demand 類型的物化視圖
 create materialized view bc_major_item 
 on prebuilt table refresh fast on demand 
 as select * from zh_major_item@db_link_A ;

4.在B節(jié)點處嗽冒,刷新物化視圖

 --刷新物化視圖
 exec dbms_mview.refresh('bc_major_item ','C');

 --刷新后,查詢目標表,比對是否和原表數(shù)據(jù)相同
 select * from bc_major_item ;

5.升級采用存儲過程+定時任務JOB方式,定時刷新物化視圖


    --創(chuàng)建存儲過程呀伙,進行增量刷新
    create or replace procedure refresh_bc_major_item
    as
    begin
        dbms_mview.refresh('bc_major_item','F');
    end;
    /

    --創(chuàng)建任務JOB
    SQL> variable job1 number;
    SQL>begin
 dbms_job.submit(:job1,'refresh_bc_major_item;',sysdate,'sysdate+1/(86400)');  
    end;
    /
    
    --運行JOB
    SQL> begin
       dbms_job.run(:job1);
      end;
      /

6.進一步優(yōu)化:

可以再寫一個存儲過程+定時任務JOB,定時清空物化視圖日志添坊。

三. 文章更新記錄

v1.0 -- 表面是實現(xiàn)了同步剿另,其實查詢的只是視圖,并沒有完成如題目所指的問題
v2.0 -- 將目標表和物化視圖建立聯(lián)系帅腌,真正實現(xiàn)數(shù)據(jù)同步驰弄。2016.12.6

四. 參考文章:

  1. Oracle 11g 通過創(chuàng)建物化視圖實現(xiàn)不同數(shù)據(jù)庫間的表數(shù)據(jù)同步
  2. oracle中使用物化視圖實現(xiàn)表的同步
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市速客,隨后出現(xiàn)的幾起案子戚篙,更是在濱河造成了極大的恐慌,老刑警劉巖溺职,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岔擂,死亡現(xiàn)場離奇詭異,居然都是意外死亡浪耘,警方通過查閱死者的電腦和手機乱灵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來七冲,“玉大人痛倚,你說我怎么就攤上這事±教桑” “怎么了蝉稳?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掘鄙。 經常有香客問我耘戚,道長,這世上最難降的妖魔是什么操漠? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任收津,我火速辦了婚禮,結果婚禮上浊伙,老公的妹妹穿的比我還像新娘撞秋。我一直安慰自己,他們只是感情好吧黄,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布部服。 她就那樣靜靜地躺著,像睡著了一般拗慨。 火紅的嫁衣襯著肌膚如雪廓八。 梳的紋絲不亂的頭發(fā)上奉芦,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音剧蹂,去河邊找鬼声功。 笑死,一個胖子當著我的面吹牛宠叼,可吹牛的內容都是我干的先巴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼冒冬,長吁一口氣:“原來是場噩夢啊……” “哼伸蚯!你這毒婦竟也來了?” 一聲冷哼從身側響起简烤,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剂邮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后横侦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挥萌,經...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年枉侧,在試婚紗的時候發(fā)現(xiàn)自己被綠了引瀑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡榨馁,死狀恐怖憨栽,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情翼虫,我是刑警寧澤徒像,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蛙讥,受9級特大地震影響,放射性物質發(fā)生泄漏灭衷。R本人自食惡果不足惜次慢,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翔曲。 院中可真熱鬧迫像,春花似錦、人聲如沸瞳遍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掠械。三九已至由缆,卻和暖如春注祖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背均唉。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工是晨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舔箭。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓罩缴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親层扶。 傳聞我的和親對象是個殘疾皇子箫章,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容