Oracle遠程數據建物化視圖(materialized)創建簡單記錄,以及DBLINK的創建


目的:實現遠程數據庫訪問及其相應表的定時同步

一、遠程數據庫dblink的創建

select * from dba_db_links;
select * from user_sys_privs;--查詢用戶權限

1、查看scott用戶是否具備創建database link 權限

select * from user_sys_privs where privilege like upper('%DATABASE LINK%') AND USERNAME='SCOTT';

2、授權dblink

grant create public database link to scott;

3、創建dblink

create public database link DBLINK名 connect to 遠程用戶名 identified by "密碼" USING '遠程數據庫IP地址/庫名';--如果在create之后不加public,則創建的dblink就不是公共的,就只有創建者可以使用

4、刪除dblink

drop public database link link_movebi;

二、物化視圖(materialized)簡介

首先創建一個測試用表,如下圖:

物化視圖也是種視圖。Oracle的物化視圖是包括一個查詢結果的數據庫對像,它是遠程數據的的本地副本,或者用來生成基於數據表求和的匯總表。
物化視圖存儲基於遠程表的數據,也可以稱為快照。物化視圖可以查詢表,視圖和其它的物化視圖。

1、本地庫(創建物化視圖需要的權限)

grant create materialized view to scott;-----切換sys用戶授權

2、源系統庫(如果需要進行快速刷新,則需要建立物化視圖日志。-->在源表庫建立物化視圖日志)

物化視圖日志在建立時有多種選項:可以指定為 rowid、primary key 和 object id 幾種類型,同時還可以指定 sequence 或明確指定列名。
不過上面這些情況產生的物化視圖日志的結構都不相同。

--第一種主鍵類型
create materialized view log on dept_tmp_test  
tablespace movebi_data -- 日志空間  
with primary key;      -- 指定為主鍵類型
--第二種rowid類型
--new values 從句來決定oracle是否在物化視圖日志中保持新的和舊的值。including 保存新的和舊的值,如果表上有一個單表物化聚合視圖,你想物化視圖適合快速刷新,你就要指定including
create materialized view log on dept_tmp_test  
tablespace movebi_data -- 日志空間  
with rowid, sequence (dept_dmid, new_virtual_type_name6) including new values;-- 指定為rowid類型

查看物化視圖日志:

select * from mlog$_dept_tmp_test;
SQL> desc mlog$_dept_tmp_test;
Name                   Type          Nullable Default Comments 
---------------------- ------------- -------- ------- -------- 
DEPT_DMID              NUMBER(22)    Y  --記錄每次DML操作對應的DEPT_DMID值                  
NEW_VIRTUAL_TYPE_NAME6 VARCHAR2(200) Y  --記錄每次DML操作對應的NEW_VIRTUAL_TYPE_NAME6值                   
M_ROW$$                VARCHAR2(255) Y  --保存基表的ROWID信息,根據M_ROW$$中的信息可以定位到發生DML操作的記錄。                   
SEQUENCE$$             NUMBER        Y  --根據DML操作發生的順序記錄序列的編號,當刷新時,根據SEQUENCE中的順序就可以和基表中的執行順序保持一致。                  
SNAPTIME$$             DATE          Y  --記錄了刷新操作的時間。                       
DMLTYPE$$              VARCHAR2(1)   Y  --記錄值I、U和D,表示操作是INSERT、UPDATE還是DELETE。                       
OLD_NEW$$              VARCHAR2(1)   Y  --用於表示這個值是新值還是舊值。N(EW)表示新值,O(LD)表示舊值,U表示UPDATE操作。                       
CHANGE_VECTOR$$        RAW(255)      Y  --DML操作發生在那個或那幾個字段上                       
XID$$                  NUMBER        Y  --xid$$(事務id)唯一標識對行進行更改的事務。

刪除日志:

drop materialized view log on dept_tmp_test;

3、本地庫創建物化視圖

(1)創建方式(BuildMethods):包括 build immediate 和 build deferred 兩種。
build immediate 是在創建物化視圖的時候就生成數據。
build deferred 則在創建時不生成數據,以后根據需要在生成數據。默認為 build immediate。
(2)查詢重寫(QueryRewrite):包括 enable query rewrite 和 disable query rewrite 兩種。
分別指出創建的物化視圖是否支持查詢重寫。查詢重寫是指當對物化視圖的基表進行查詢時,Oracle會自動判斷能否通過查詢物化視圖來得到結果,
如果可以,則避免了聚集或連接操作,而直接從已經計算好的物化視圖中讀取數據。默認為 disable query rewrite。
(3)物化視圖有二種刷新模式
on demand 顧名思義,僅在該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;
on commit 提交觸發,一旦基表有了commit,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致。一般用這種方法在操作基表時速度會比較慢。
(4)三種刷新方法
完全刷新(COMPLETE): 會刪除表中所有的記錄(如果是單表刷新,可能會采用TRUNCATE的方式),然后根據物化視圖中查詢語句的定義重新生成物化視圖。
快速刷新(FAST): 采用增量刷新的機制,只將自上次刷新以后對基表進行的所有操作刷新到物化視圖中去。FAST必須創建基於主表的視圖日志。對於增量刷新選項,如果在子查詢中存在分析函數,則物化視圖不起作用。
FORCE 方式:這是默認的數據刷新方式。Oracle會自動判斷是否滿足快速刷新的條件,如果滿足則進行快速刷新,否則進行完全刷新。

關於快速刷新:Oracle物化視圖的快速刷新機制是通過物化視圖日志完成的。Oracle通過一個物化視圖日志還可以支持多個物化視圖的快速刷新。
物化視圖日志根據不同物化視圖的快速刷新的需要,可以建立為ROWID或PRIMARY KEY類型的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

create materialized view mv_dept_tmp_test
refresh fast with rowid
on demand
start with sysdate next sysdate+5/24/60
disable query rewrite
as
select * from dept_tmp_test@link_movebi; 

--refresh fast with rowid  快速刷新
--on demand  在用戶需要時由用戶刷新
--start with sysdate next sysdate+5/24/60  這個物化視圖每5min進行刷新
--disable query rewrite  不可重寫(默認)

這里要注意,當發生DML 操作時,內部的觸發器會把變化記錄到物化視圖日志里,也就是說物化視圖不支持DDL的同步,
所以在物化視圖的編寫過程中盡量不要使用 select * from 的形式,因為這樣當基表發生變化時,物化視圖就會失效。

物化視圖日志的名稱為MLOG$_后面跟基表的名稱,如果表名的長度超過20位,則只取前20位,當截短后出現名稱重復時,
Oracle會自動在物化視圖日志名稱后面加上數字作為序號。

4、目標物化視圖創建索引

create index pk_id on mv_dept_tmp_test(dept_dmid);

5、物化視圖刷新

使用dbms_mview.refresh 手工刷新

--完全刷新  
EXEC DBMS_MVIEW.REFRESH(LIST => 'mv_table_name',METHOD => 'c');  
EXEC DBMS_MVIEW.REFRESH('mv_table_name','C');  
--快速刷新  
EXEC DBMS_MVIEW.REFRESH(LIST => 'table_name',METHOD => 'f');  
EXEC DBMS_MVIEW.REFRESH('mv_table_name','F'); 
--過程調用 
begin
 DBMS_MVIEW.REFRESH(LIST => 'mv_dept_tmp_test',METHOD => 'f');
end;

查看物化視圖刷新狀態信息

select mview_name, last_refresh_date, staleness from user_mviews;  
select name, last_refresh from user_mview_refresh_times;

物化視圖具體操作匯總(方便自己快速查找)

--1、給本地庫授權
grant create materialized view to scott;
--2、源系統庫目標表建日志
create materialized view log on dept_tmp_test  
tablespace movebi_data -- 日志空間  
with primary key;     -- 指定為主鍵類型無主鍵可指定rowid,但注意要和后面創建物化視圖時保持一致
--查看日志
select * from mlog$_dept_tmp_test;
--3、本地庫創建物化視圖
create materialized view mv_dept_tmp_test
refresh force
on demand
start with sysdate next sysdate+5/24/60
as
select * from dept_tmp_test@link_movebi;
--force(默認)自動判斷是否滿足快速刷新的條件,如果滿足則進行快速刷新,否則進行完全刷新。
--4、修改刷新時間
alter materialized view mv_dept_tmp_test refresh force on demand start with sysdate next sysdate+10/24/60
--5、手動快速刷新
begin
 DBMS_MVIEW.REFRESH(LIST => 'v_union_target_bak',METHOD => 'f');
end;
--6、目標庫刪除物化視圖日志
drop materialized view log on dept_tmp_test;
--7、本地庫刪除物化視圖
drop materialized view mv_dept_tmp_test;

查看物化視圖狀態備注

select * from user_mviews;


staleness:
1、fresh 最新狀態:當前物化視圖的內容出於最新的狀態
2、stale 陳舊狀態:物化視圖引用的主表已經更新,但是物化視圖沒有刷新,所以內容相對主表來說是舊的
3、needs_compile 需要編譯:物化視圖引用的主表比如視圖,進行了重建后相應的物化視圖就需要編譯,當處於這種狀態的時候dba_objects
   視圖顯示的STATUS為INVALID需要運行語句:alter materialized view mv_name compile;
4、unusable 物化視圖引用的主表狀態不確定
5、unknown  未知:通過prebuilt創建的表
6、undefined 物化視圖引用的表來自其他的數據庫,一般通過dblink鏈接過來的

 

 (注:此為學習記錄筆記,僅供參考若有問題請指正,后續補充......)

參考:https://www.cnblogs.com/xiaohuilong/p/5995596.html

參考:https://blog.csdn.net/qq_26941173/article/details/78529041

參考:https://www.cnblogs.com/linjiqin/archive/2012/05/22/2513551.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM