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
Oracle远程数据建物化视图(materialized)创建简单记录,以及DBLINK的创建的更多相关文章
- [terry笔记]物化视图 materialized view基础学习
一.物化视图定义摘录: 物化视图是包括一个查询结果的数据库对像(由系统实现定期刷新数据),物化视图不是在使用时才读取,而是预先计算并保存表连接或聚集等耗时较多的操作结果,这样在查询时大大提高了 ...
- DB2物化视图(Materialized Query Tables, MQT)
DB2的物化视图MQT是基于查询结果定义的一个表,MQT中包括的数据来自MQT定义所基于的一个或多个表, 使用MQT能够显著提高查询的操作性能. 数据库的视图和MQT都是基于一个查询来定义的.每当视图 ...
- 物化视图(materialized view) 实现数据迁移、数据定时同步
近日公司有一个9i 的Oracle数据库,运行效率低下.想要将其升级到11G. 但是升级之前 要将数据进行同步,好在表不是很多.只有三张表.业务压力也不大,就想到了使用物 化视图的方式将数据同步过来. ...
- SSIS教程:创建简单的ETL包 -- 1. 创建项目和基本包
在本课中,将创建一个简单 ETL 包,该包可以从单个平面文件(Flat File)源中提取数据,使用两个查找转换组件转换该数据,然后将该数据写入AdventureWorksDW2012 的 FactC ...
- Oracle物化视图的创建及使用
oracle物化视图 一.oracle物化视图基本概念 物化视图首先需要创建物化视图日志, oracle依据用户创建的物化视图日志来创建物化视图日志表, 物化视图日志表的名称为mlog$_后面跟 ...
- Oracle物化视图的创建及使用(一
Oracle物化视图的创建及使用 http://blog.csdn.net/tegwy/article/details/8935058 先看简单创建语句: create materialized ...
- oracle 物化视图及创建索引
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体 ...
- 详解Oracle数据货场中三种优化:分区、维度和物化视图
转 xiewmang 新浪博客 本文主要介绍了Oracle数据货场中的三种优化:对分区的优化.维度优化和物化视图的优化,并给出了详细的优化代码,希望对您有所帮助. 我们在做数据库的项目时,对数据货场的 ...
- ORACLE物化视图(物理视图)
百度文库 http://wenku.baidu.com/view/f78f55c68bd63186bcebbc4b.html ORACLE物化视图 一.------------------------ ...
随机推荐
- CircRNA 环化RNA
2016国自然新秀CircRNA的研究策略和分析
- [GO]结构体成员的使用:指针变量
package main import "fmt" func main() { type student struct { id int name string sex byte ...
- js流程图:aworkflow.js
auto-workflow 用于快速构建各种关系图的库 github地址:https://github.com/auto-workflow/AWorkflow 快速开始 npm install awo ...
- [Lua快速了解一下]Lua的OOP
__index(a, b) 对应表达式 a.b 上面我们看到有__index这个重载,这个东西主要是重载了find key的操作.这波操作可以让Lua变得有点面向对象的感觉,让其有点像Javascri ...
- 深入理解java虚拟机(九)类加载器以及双亲委派模型
虚拟机把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器”. 类与类加载器 任 ...
- centos 7 Hadoop2.7.4完全分布式搭建(一)
(一)系统准备与安装 1.准备下载centos7 (百度自行下载)可以到开源镜像站下载,速度比较快,比如清华的或者阿里的 在vmware上安装 这里我用的是vmware12 打开Vmware 选择文件 ...
- How to design a product table for many kinds of product where each product has many parameters
https://stackoverflow.com/questions/695752/how-to-design-a-product-table-for-many-kinds-of-product-w ...
- SQL Server分页查询存储过程
--分页存储过程create PROCEDURE [dbo].[commonPagination]@columns varchar(500), --要显示的列名,用逗号隔开 @tableName va ...
- 关于C# 向TIM或者QQ自动发送中文消息【微信也是可用的】 附测试GIF中微信可用的 全新修订
在上一篇文章的代码 对于微信已失效 重新更新一边 效果图: 源代码 using System; using System.Runtime.InteropServices; using System.T ...
- python 图像识别
这是一个最简单的图像识别,将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt ...