博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用物化视图来同步数据on prebuilt table
阅读量:6829 次
发布时间:2019-06-26

本文共 2641 字,大约阅读时间需要 8 分钟。

一、怎么样刷新
mv可以用来同步数据,一般采用主键同步或者是ROWID同步,我们这里只讨论主键同步(Rowid同步其实是为Rowid在目标表上创建了一个隐含索引,原理跟主键同步一样)。mv的主要原理就是记录更改的日志,并同步到远程。
一个简单的例子:
SQL>create materialized view log on table_name;SQL>create materialized view table_name [on prebuilt table] refresh fast as   select * from table_name@lnk_db_master;SQL>exec dbms_mview.refresh('table_name',method => 'Complete');SQL>exec dbms_mview.refresh('table_name');SQL> declare jobid number; begin sys.dbms_job.submit(job => jobid, what => 'dbms_mview.refresh(''table_name'');', next_date => sysdate, interval => 'sysdate+5/1440'); commit; end;  /
其中
第1步是在需要复制的主表(master table)上创建mv log。
第2步是在远程站点(想复制到的那个站点)上创建mv,注意,如果选择了选项on prebuild table的话,表示在已经存在的表上创建mv,需要已经存在的表的字段与select的字段必须要对应,这个已经存在的表中可以没有数据。
第3步是全同步,如果没有选择on prebuild table,这一步可以省略,因为默认创建mv的时候,就会全刷新
第4步是增量刷新,在完成全刷新以后的情况下,一般都只需要做增量刷新即可。
第5步是创建一个自动刷新的作业来进行刷新,如每5分钟刷新一次,这个操作也可以同crontab来代替。
二、相关视图与基表信息
dba_mviews记录了远程站点上mv的数目与属性,需要在创建MV的站点上查询。
sys.mlog$则记录了主站点上的mv的log数目,如果一个master对应到多个站点,也只有一条记录,对应到dba_mview_logs视图,需要在主站点查询。
sys.slog$记录了主站点上已经注册成功的主表信息,如果一个主表被复制到多个站点,则对应多条记录,在主站点查询。
dba_snapshot_logs存放了mv的log日志,如果对应到多个站点,则每个站点都对应一条记录,因为远程站点的snapshot_id是不一样的。其实sys.mlog$与sys.slog$的关联就是组成dba_snapshot_logs的一个部分,通过查询dba_views可以看到其脚本。
dba_registered_snapshots记录了远程站点的注册信息,只记录注册成功的远程站点,通过snapshot_id可以与dba_snapshot_logs关联。如
SQL>select t.log_owner,t.master,t.log_table,t.current_snapshots,   r.owner,r.name,r.snapshot_site   from dba_snapshot_logs t,dba_registered_snapshots r   where t.snapshot_id= r.snapshot_id(+);
删除mv的时候,需要先删除mv,再删除mv日志
远程MV站点:
SQL>drop materialized view table_name;
主站点:
SQL>drop materialized view log on table_name;
注意,删除mv的时候,如果主站点需要分发到多个远程站点,只有当所有远程站点的MV删除完成后,才可以删除MV日志。
删除远程站点的MV的时候,要保证与主站点的通信顺畅,如果网络不通,则主站点无法正常Unregister MV,而主站点的mv log又因为不知道这个站点已经没有MV,而不删除mv日志,将可能引起主站点mlog表的膨胀。这个时候,可以手工强行解除注册。
SQL>exec DBMS_SNAPSHOT.PURGE_SNAPSHOT_FROM_LOG (snapshot_id);
三、故障处理与维护
如果mlog因为日志曾经很多而变得很大的时候,对mlog的操作如日志删除将变得很慢,因为mlog上没有任何索引,走的都是全表扫描,这个时候,我们可以move该日志表或者是等日志表没有记录的时候truncate该表。
SQL>alter table mlog$_table_name move;
如果要对有mv复制的表增加字段,最好在停机情况下进行,因为这样不会产生mv log,而且最好采用prebuild模式,因为这种模式下,删除mv的定义将保留表(也就是不删除表与相关数据)。相关步骤:
停机模式,并且在使用prebuild的情况下:
1、远程站点:
SQL>drop materialized view mv_table; --这里删除mv,保留原表

2、主站点:

SQL>alter table master_table add new_field number;
3、远程站点:
SQL>alter table mv_table add new_field number;
4、远程站点:
SQL>create materialized view mv_table on prebuilt table   refresh fast as   select * from master_table@lnk_db;
5、建立快速刷新的作业,这个时候不需要全刷新了,因为数据都在

为什么要停机操作,是因为创建快速刷新的mv的时候,将删除主站点上创建mv时间点之前的相关log,所以在删除mv与重新创建mv之前,不能对主表有任何dml产生新的日志,否则将可能引发数据的不一致。

转载于:https://www.cnblogs.com/fyq891014/archive/2012/05/01/3294823.html

你可能感兴趣的文章
实用图片滑块,传送带,幻灯片效果【附源码】
查看>>
Bluez SPP实现代码分析(转)
查看>>
android中给TextView或者Button的文字添加阴影效果
查看>>
读《被投资人“送”入看守所》一文有感(转)
查看>>
生产环境线上測试的慘淡人生
查看>>
代码阅读分析工具Understand 2.0试用
查看>>
Linux Load average负载详细解释
查看>>
Android多媒体框架图
查看>>
jps命令使用
查看>>
ADC In An FPGA
查看>>
#import </usr/include/objc/objc-class.h> not such file or directory问题的解决方法
查看>>
集装箱项目
查看>>
C#中的Action<>和Func<>
查看>>
关于opencv中人脸识别主函数的部分注释详解。
查看>>
SQLServer内核架构剖析 (转载)
查看>>
Android 风格化的 Toggle Buttons
查看>>
Eclipse中SVN的安装步骤(两种)和用法
查看>>
安全运维之:网络实时流量监测工具iftop
查看>>
在 Windows上配置NativeScript CLI
查看>>
ubuntu14.04 qt4 C++开发环境搭建
查看>>