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语句不适用:
- 包括 CONNECT BY
-
UNION, INTERSECT, or MINUS 的数据集和操作
-
distinct 和一些聚集函数不能使用快速刷新
- 更多参考http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a76959/mview.htm#28382
如下示例 包括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 databaseDBA_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;