目的:实现远程数据库访问及其相应表的定时同步
一、远程数据库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