物化视图基础概念、mview跨库迁移表

概念:
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。

物化视图类型:
包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。
 
创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
 
创建方式(Build Methods):
包括BUILD IMMEDIATE和BUILD DEFERRED两种。BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。

查询重写(Query Rewrite):
包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
 
刷新(Refresh):
指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。

刷新的模式有两种:
ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。 ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。

刷新的方法有四种:
FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。

物化视图日志:
如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

物化视图维护操作:
1. 创建语句:create materialized view mv_name as select * from table_name    默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。
2. 创建ON COMMIT物化视图:create materialized view mv_name refresh force on commit as select * from table_name    备注:实际创建过程中,基表需要有主键约束,否则会报错(ORA-12014)
3.  创建定时刷新的物化视图:create materialized view mv_name refresh force on demand start with sysdate next sysdate+1 (指定物化视图每天刷新一次)
4.  指定刷新时间(比如每天晚上10:00定时刷新一次):create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,‘dd-mm-yyyy‘),‘ 22:00:00‘),‘dd-mm-yyyy hh24:mi:ss‘)
5. 对于已经创建好的物化视图,可以修改其刷新方式,比如把物化视图mv_name的刷新方式修改为每天晚上10点刷新一次:alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,‘dd-mm-yyyy‘),‘ 22:00:00‘),‘dd-mm-yyyy hh24:mi:ss‘)  
6.  物化视图的删除:drop materialized view mv_name

实验操作流程:(同库或者异库迁移同步表)

流程介绍:该方法的实现原理是对于要迁移的表对象,需要有一个主键,用于mv的刷新,对于符合该要求的表,在源表上创建mv日志,再在目标数据库上创建结构一样的表,然后在目标表上采用prebuilt方式创建mv,第一次采用完全刷新,之后采用增量刷新,等真正要切换的时候,只需要刷新完增量的日志,删除mv,保留目标表即可。

说明:这里我用同库的两个用户代替异库操作, scott用户代表源库 , andy用户代表目标库。

1.在源库上创建表和mview log

SQL> create table andy_01 as select * from dba_objects ;
Table created.
SQL> select count(*) from andy_01;

COUNT(*)
----------
    88770
--为基表建立主键,防止ORA-12014 does not contain a primary key constraint
SQL> delete from andy_01 where object_id is null;
SQL> alter table andy_01 add constraint pk_andy_01 primary key(object_id);
SQL> create materialized view log on andy_01;
Materialized view log created.
--源库查询 生成 materialized view log 对象名
SQL> select object_name from user_objects where object_name like ‘%MLOG$%‘;
OBJECT_NAME
-----------------------------------------------------------------------------
I_MLOG$_ANDY_01
MLOG$_ANDY_01    -> materialized view log 对象名

2. 授权

-- 授权目标库用户有查询 源库 materialized view log 的权限
SQL> grant select on scott.MLOG$_ANDY_01 to andy;
Grant succeeded.
SQL> grant select on scott.andy_01 to andy;

Grant succeeded.

3.在目标数据库上创建与该表一样的表,并在该表上创建prebuilt mv

SQL> create table andy_01 as select * from scott.andy_01 where 1=2;       异库加上@dblink_name
Table created.
SQL> select count(*) from andy_01;
  COUNT(*)
----------
         0
-- sys用户为目标用户授权
SQL> GRANT CREATE MATERIALIZED VIEW TO andy;

Grant succeeded.
-- 目标库创建 materialized view 
SQL> create materialized view andy_01 on prebuilt table refresh fast as select * from scott.andy_01;
Materialized view created.
 
4.做完全刷新和增量刷新

SQL> exec dbms_mview.refresh(‘andy_01‘,‘Complete‘);
PL/SQL procedure successfully completed.
SQL>  select count(*) from andy_01;

COUNT(*)
----------
     88765
 
--此时模拟在做完全刷新过程中,源库的表又发生了变化
SQL> insert into andy_01(object_id,owner) values(666666,‘test‘);

1 row created.
SQL>  commit;

Commit complete.
--再做增量刷新
SQL> select count(*) from andy_01;

COUNT(*)
----------
     88765     
SQL> exec dbms_mview.refresh(‘andy_01‘);
PL/SQL procedure successfully completed.
 
SQL> select count(1) from andy_01;

COUNT(1)
----------
     88766

5.停机切换,做最后一次刷新,然后删除源库的mview log和目标库的mview

SQL> exec dbms_mview.refresh(‘andy_01‘);
PL/SQL procedure successfully completed.

6. 迁移完毕,清除 materialized view 与 materialized view log

-- 清除 目标库 materialized view
SQL> drop materialized view andy_01;
Materialized view dropped. 
SQL> select count(*) from andy_01;
  COUNT(*)
----------
     88766
这里删除的mview(andy_01)是prebuilt mv,所以删除该mview,并不删除相应的表。
-- 清除源库 materialized view log
SQL>  drop materialized view log on  ANDY_01;

Materialized view log dropped.
 
SQL> select object_name from user_objects where object_name like ‘%MLOG$%‘;

no rows selected

时间: 2024-10-05 16:16:34

物化视图基础概念、mview跨库迁移表的相关文章

跨库数据表的运算

文章出自http://c.raqsoft.com.cn/article/1536666621882?r=niu 1.    简单合并(FROM) 所谓跨库数据表,是指逻辑上同一张数据表被分别存储在不同数据库中.其原因有可能是因为数据量太大,放在一个数据库难以处理,也可能在业务上就需要将生产库和历史库分开.而不同的数据库,可能只是部署在不同的机器上的同种数据库,也可能是连类型都不同的数据库系统. 在面对跨库数据表,特别是数据库类型都不相同的情况时,数据库自带的工具往往就力所不及了,一般都需要寻找能

mysql跨库数据表的运算

跨库数据表的运算,一直都是一个说难不算太难,说简单却又不是很简单的.总之是一个麻烦的事.大量的.散布在不同数据库中的数据表们,明明感觉要把它们合并起来,再来个小小的计算,似乎也就那么回事……但真要做起来,需要这又忘了那的,却又不像仅仅就那么回事?        想要给这些小麻烦们,来一个快刀斩乱麻式的.嘁嚓咔嚓地一劳永逸的解决方案么?首先,你需要一把叫做集算器的宝刀(重点):然后,你可以再看看这篇算是买一赠一的秘传刀法(免费):最后,面向敌人们手起刀落……你就可以轻松愉快地去睡一个好觉了:跨库数

C++面试基础概念之动态库篇

编写DLL所学所思(1)——导出函数 编写DLL所学所思(2)——导出类 C++ DLL导出类 知识大全 C++类库开发详解 原文地址:https://www.cnblogs.com/japelly/p/10294897.html

Oracle跨库复制表结构

1.首先建立远程连接 create public database link LINK_SJPSconnect to system identified by manager using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.20)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = GZZL)))'; 2.复制表结构 Create global

mysql跨库联表查询

业务场景:关联不同数据库中的表的查询 比如说,要关联的表是:机器A上的数据库A中的表A && 机器B上的数据库B中的表B. 这种情况下,想执行“select A.id,B.id from A left join B on ~~~;“那是不可能的,但业务需求不可变,数据库设计不可变,这就蛋疼了.. 解决方案:在机器A上的数据库A中建一个表B... 这当然不是跟你开玩笑啦,我们采用的是基于MySQL的federated引擎的建表方式. 建表语句示例:CREATE TABLE `table_na

跨库导表数据(sql)

程序员用 列子: insert into "000".tbFreeReportselect ReportCode ,ReportName ,GroupNamefrom opendatasource('sqloledb','server=192.168.1.201;uid=sa;pwd=11;database=sg0000').sg0000."0000".tbFreeReport

一次业务跨库迁移过程

公司没有专职dba,公司运维当中我对mysql日常操作有一定了解,因此主动请缨配合业务部门进行数据库迁移. 一,业务背景 1. 将现有业务数据库B迁移到新服采购服务器上: 2. 将该业务线的A数据库中(100+表90G)表迁移到新数据库实例B库中: 3. 部分业务表涉及到多个业务共同写入(前期没有提供接口)需要进行实时同步,方便后期改造. 二,迁移方案 协同开发同学商量后,决定采用前期导入数据,并通过otter实时同步,然后切换业务的方式进行.具体如下: 1. 现有数据库迁移到新服务器 A,新服

ORACLE物化视图详解

一.物化的一般用法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,oracle都实际上转换为视图SQL语句的查询.这样对整体查询性能的提高,并没有实质上的好处. 1.物化视图的类型ON DEMAND.ON COMMIT.二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图"需要"被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一

详解物化视图(汇总比较有用的资料)

物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照.对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的.如果你想修改本地副本,必须用高级复制的功能.当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取. 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图.物化视图可以查询表,视图和其它的物化视图. 一.            关于物化视图日志: 查询物化视