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、本地库(创建物化视图需要的权限)

扫描二维码关注公众号,回复: 4274438 查看本文章
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

猜你喜欢

转载自www.cnblogs.com/shenjie0622/p/10031149.html