snapshot



http://blog.itpub.net/9931/viewspace-784075/ 


快照属于高级复制范畴内的相对多主复制简单的应用;也叫做物化视图;就是将主数据集合(远程或者本地数据库)的部分或者全部或者经过计算的数据集合(where group by etc )存储在本地访问;快照有可更新和不可以更新之分; 快照通过定期刷新保证数据一致,及时,有2种刷新方式:完全刷新和快速刷新;;可更新快照不在本文示例范围;

快照的好处(设计的目的,需求)

  • Ease Network Loads

  • Mass Deployment

  • Data Subsetting

  • Disconnected Computing

    本文示例快照的基本原理和建立,维护知识。 详细清阅读otn replication user guide

    [@more@]

    快照建立基本语法

    CREATE SNAPSHOT emp_snap AS SELECT * FROM scott.emp@db1.world;
    建立快照emp_snap   对应 db1.world 远程数据库上用户scott 的emp表

    快照类型

    快照分为Primary Key和ROWID  2种

    Primary Key快照是指刷新快照以纪录的primary key数值为标准进行快速刷新;但这要求主表master table必须有主键。默认采用这种方式

    CREATE SNAPSHOT sales.orders REFRESH FAST AS
    SELECT * FROM sales.orders@dbs1.acme.com o
    WHERE EXISTS
       (SELECT 1 FROM sales.customer@dbs1.acme.com c
        WHERE o.c_id = c.c_id AND zip = 19555);

    ROWID  快照是指刷新快照以纪录的rowid为标准进行快速刷新; 由于记录的rowid在该纪录的生命周期是可以改变的(如 partition split;recoery etc) 因此应该尽量避免使用rowid快照;语法如

    CREATE SNAPSHOT sales.customer REFRESH WITH ROWID AS
    SELECT * FROM sales.customer@dbs1.acme.com;

    刷新方式

    快速刷新:

    在master table节点上记录master table改动的dml情况,这些dml信息包村在snapshot log对象中;一个master table和一个snapshot log一一对应。刷新时候,检查master table的snapshot log,将对应dml应用到快照节点上,并且对不再需要的snapshot log记录进行删除。一个master table可以有多个snapshot,这些snapshot都使用同一个snapshot log. 因此在master table上执行dm的时候还要维护snapshot log,这带来一些消耗。l

    可以快速刷新快照的条件

    如上语法 REFRESH FAST  表示采用 快速刷新 机制;但是快速刷新有一些限制,对一些复杂的快照定义sql语句不适用:

    如下示例 包括UNION ALL 因此不能被快速刷新

    CREATE SNAPSHOT scott.snap_employees AS
    SELECT emp.empno, emp.ename FROM scott.emp@dbs1.acme.com
      UNION ALL
    SELECT new_emp.empno, new_emp.ename FROM scott.new_emp@dbs1.acme.com;

     完全刷新

     先truncate snapshot,再重新将数据从master table transfer load到snapshot. 整个完全刷新的过程如下

    truncate table snapshotA;

    insert /*+ append */ into snapshotA select *from masterA@mastDB;

    因此 有时候完全刷新产生较少的redo log,相对于快速刷新反而快。 注意如果snapshot上存在过多索引,仍然会产生大量redo log.

    Force Refreshes

    相当于choose 模式;oracle先尝试快速刷新;如果不能进行快速刷新 泽进行完全刷新。

    刷新方式的选择

    如果经常刷新snapshot,并且对刷新的性能有较高要求,建议使用快速刷新。 如果很少刷新 可以使用完全刷新。

    well ,it all depends.具体问题 具体分析   同时要注意snapshot log大小。

    在master节点上登记snapshot信息

    当创建和删除,刷新snapshot的时候,会将一些信息记录在master table所在节点数据库的数据字典中。
    SQL> desc dba_registered_snapshots          snapshot在主节点上的登记信息
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------

     OWNER                                     NOT NULL VARCHAR2(30)         snapshot owner      
     NAME                                      NOT NULL VARCHAR2(30)          snapshot name
     SNAPSHOT_SITE                             NOT NULL VARCHAR2(128)      snapshot site
     CAN_USE_LOG                                        VARCHAR2(3)            wether could use snapshot log
     UPDATABLE                                          VARCHAR2(3)             wehter updateable
     REFRESH_METHOD                                     VARCHAR2(11)          fast or complete or choose
     SNAPSHOT_ID                                        NUMBER(38)              internal snapshot ID
     VERSION                                            VARCHAR2(17)          
     QUERY_TXT                                          LONG                  snapshot defination sql 竟然是long数据类型

    SQL> desc DBA_SNAPSHOT_REFRESH_TIMES       纪录快照刷新时间
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------

     OWNER                                     NOT NULL VARCHAR2(30)
     NAME                                      NOT NULL VARCHAR2(30)
     MASTER_OWNER                                       VARCHAR2(30)
     MASTER                                             VARCHAR2(30)
     LAST_REFRESH                                       DATE               上次刷新的时间

     

    Master Site组件

    包括master table和internal trigger(负责将dml的改动插入到snapshot log中,oracle自动维护 用户透明),snapshot log纪录供fast refresh的dml,名称格式MLOG$_master_table_name  可以从 dba_snapshot_logs 数据字典获得信息

    Snapshot Site组件

    base table就是snapshot ;index 维护primary key snapshot的主关键字约束的索引 以及以后供查询提高性能的索引;Updateable Snapshot Log 和 Internal Trigger 是为可能新快照准备的。

    注意 刷新的时候相当于执行dml在snapshot上,过多的索引产生较多的redo log,影响性能。 

    snapshot group 提供管理snapshot的一致性,而且如果要建立可更新快照,该updateable snpashot必须属于某个snpashot gorup;readonly snapshot可以不属于任何一个快照组 ; snapshot group有group owner,可以将快照对象添加 删除 从snapshot group中。

    refresh group 刷新组;为了保证多个快照表之间的纪录一致性;可以将这些快照放置到同一个刷新组中。refresh group可以制定刷新快照组的周期。这样就没必要为该组内每个快照都制定刷新周期。oracle使用后台job来做;因此要配置好show parameters job的参数SNP (or job queue) background processes 相关的。    有时候 你需要马上刷新快照组,而快照组自己刷新的时间还没到;如master table 上load了很多数据要马上同步;这时候可以手工刷新快照组(或者手工刷新快照,不过将导致快照组内各个快照不一致) manually refresh 。有提供的api可以调用

    如上概念介绍完毕,创建snapshot的过程如下

    配置master site---创建snapshot log ,database linek,etc

    配置snapshot site--创建snapshot,datbse linek, job parameters , refresh group并且将snapshot添加到refresh group,定期刷新refresh group.

    相关snapshot监控  master:  dba_registered_snapshots     DBA_SNAPSHOT_REFRESH_TIMES     

                             snapshot site: dba_jobs  dba_running_jobs  dba_snapshots

    DBA_REGISTERED_SNAPSHOTS                      Remote snapshots of local tables

    DBA_REGISTERED_SNAPSHOT_GROUPS           Snapshot repgroup registration information
    DBA_SNAPSHOTS                                          All snapshots in the database

    DBA_SNAPSHOT_LOGS                                 All snapshot logs in the database

    DBA_SNAPSHOT_LOG_FILTER_COLS                All filter columns (excluding PK cols) being logged in the snapshot logs
    DBA_SNAPSHOT_REFRESH_TIMES                All fast refreshable snapshots and their last refresh times for each master table

    设置初始化参数global_names   TRUE;and job_processes  ;open_links etc...

     

    on master site:

           create snapshot log on master table

    on snapshot site:

           create database link,

           create snapshot,

           create refresh group;

           add snapshot into refresh group;

           select views

    done!以上就完成了最简单的只读快照的建立

     

     

    Connected to:

    Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production

    With the Partitioning option

    JServer Release 8.1.7.0.0 - Production

     

    SQL>

    SQL> connect zhangbin/zhangbin@MASTER

    Connected.

    SQL> create table t_master as select * from dba_objects;

    SQL> create snapshot log on t_master;

    create snapshot log on t_master

    *

    ERROR at line 1:

    ORA-12014: table 'T_MASTER' does not contain a primary key constraint

     

    SQL> alter table t_master add primary key(object_id);

    SQL> create snapshot log on t_master;

    SQL> connect zhangbin/zhangbin@snap

    Connected.

    SQL> create snapshot t_snap REFRESH FAST AS select * from t_master@master;

    创建刷新组

    SQL> execute dbms_refresh.make(name=>'test_snap',list=>'',next_date=>sysdate,int

    erval=>'sysdate+1/144',implicit_destroy=>false);

    将快照添加到刷新组中

    SQL> execute dbms_refresh.add('test_snap','t_snap');

    SQL> execute dbms_refresh.refresh('test_snap');

    察看是否作业已经正常运行

    SQL> select name,next,query from dba_snapshots;



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值