Oracle数据库中快照的使用

oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或
视图的查询的结果。正因为快照是一个主表的查询子集,使用快照可以加快数据的查询速度;
在保持不同数据库中的两个表的同步中,利用快照刷新,数据的更新性能也会有很大的改善

表快照的建立:

先建表的快照日志,根据表的日志,才能在快照中执行快刷新

create snapshot log on table_name;

二、在dmtcx用户下建立到sffw用户的数据库链link_sf;

---- 建立了到sffw用户的数据库链后才能从sffw用户下的表yh_qfcx中获取数据。 
  ---- Create database link link_sf 
  ---- Connect to sffw identified by xxxxxxx using 'rs6000'; 
  三、在dmtcx用户下建立快照s_yh_qfcx; 
  Create snapshot s_yh_qfcx as 
  Select yhh,qf6+qf5+qf4+qf3+qf2+qf1+qf qfje

  From yh_qfcx@link_sf   Where tjbz='K' and bz6+bz5+bz4+bz3+bz2+bz1+bz>0; 
  四、根据需要修改快照刷新的间隔时间;

---- dmtcx用户下的快照s_yh_qfcx为了与sffw用户下的主表yh_qfcx保持同步,需要不
断刷新快照。只有设定了快照的刷新间隔时间,oracle才会自动刷新该快照。 
  ---- 快照的刷新有两种方式:快速刷新和完全刷新。快速刷新需要快照的主表先有快照
日志存在;完全刷新时oracle执行快照查询,将结果放入快照。快速刷新比完全刷新快,因为
快速刷新将主数据库的数据经网络发送到快照的数据少,仅需传送主表中修改过的数据,而完
  Alter snapshot s_yh_qfcx refresh fast 
  Start with sysdate+1/1440 next sysdate+1/144;

  {此SQL语句的意思为:设定oracle自动在1分钟 
  (1/24*60)后进行第一次快速刷新,以后每隔10分钟 
  (10/24*60)快速刷新一次。} 
 Alter snapshot s_yh_qfcx refresh complete

  Start with sysdate+1/2880 next sysdate+1;
  {此SQL语句的意思为:设定oracle自动在30钞 
  (30/24*60*60)后进行第一次完全刷新, 
  以后每隔1天完全刷新一次。} 

---- 说明: 
  ---- 1、因为快照刷新是服务器自动完成的,所以要保证oracle数据库启动了快照刷新进
程。查看oracle数据库是否启动了快照刷新进程,可以以数据库sys身份查看视图
V_$SYSTEM_PARAMETER中的参数snapshot_refresh_processes的值是否为1,如果不为1,则快
  ---- 2、启动快照刷新进程的方法为:修改oracle数据库的初始化文件initorcl.ora,将
其中的snapshot_refresh_processes参数的值改由0改为1,然后重新启动oracle数据即可。 
  ---- 3、需要说明的是:建立快照日志时oracle数据库为我们建立了一个基于yh_qfcx的
触发器tlog$_yh_qfcx和快照日志表mlog$_yh_qfcx;建立快照时oracle数据库为我们建立了一
  一个表:snap$_s_yh_qfcx; 
  两个视图:mview$_s_yh_qfcx和s_yh_qfcx; 一个索引:I_snap$_s_yh_qfcx( 
   基于表snap$_s_yh_qfcx中的m_row$$字段。

oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。也就是说快照根本的原理就是将本地或远程数据库上的一个查询结果保存在一个表中。 

   以下是建立的Snapshot,目的是从业务数据库上将数据Copy到处理数据库上,是不同的两个服务器之间对数据copy。 

  第一步:在处理服务器上的Oracle终端,建立database link,业务数据库服务器SID为TEST 

   create database link TEST_DBLINK.US.ORACLE.COM 
   connect to AMICOS identified by AMICOS 
    using 'test'; 

   第二步:在业务数据库上对应的表建立快照日志 (如果创建的是快速刷新,则需要这步)

  Create snapshot log on A_Table; 

   第三步:建立Snapshot   快照名称为:Test_SnapShot 

   Create snapshot  Test_SnapShot 
   REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/24 
   as select * from A_Table@TEST_DBLINK 

   说明:REFRESH 是刷新方法 

  刷新方式有:COMPLETE 和FAST和force三种:
     fast        快速刷新,用snapshot log,只更新时间段变动部分  
     complete    完全刷新,运行SQL语句  
     force       自动判断刷新,介于fast和complete之间  

  而START WITH 是说明开始执行的时间。 

  Next是下次执行的时间 

   而AS以后是构成快照的查询方法。 

   相关的方法: 

  更改快照 
ALTER SNAPSHOT Test_SnapShot 
REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE+1/2; 

    手动刷新快照 在命令界面执行: 
EXEC DBMS_SNAPSHOT.REFRESH('Test_SnapShot ','C'); 
第一个参数是要刷新的快照名 
第二个参数是刷新的方式,F----FAST, C---COMPLETE 

    查看快照最后刷新的日期 
SELECT NAME,LAST_REFRESH 
  FROM ALL_SNAPSHOT_REFRESH_TIMES; 


   最后非常的方案: 

  1:为需要做Snapshot的表建立Snapshot日志 

  create snapshot log on t1 with rowid;    这里使用ROWID建立日记的参数 

  2:采用Fast的方式建立快照,使用rowid做为参考参数 

  create snapshot fb_test_b refresh fast with rowid start with sysdate next sysdate+1/1440  as  select * from fb_test_b@my_dblink;   

  最好能按照rowid来建立快照。要不然就必须要为表建立Primary Key。 


Oracle 快照及 dblink使用 (两台服务器数据同步) 
--名词说明:源——被同步的数据库 
--          目的——要同步到的数据库 

/*一、创建dblink:*/ 
--1、在目的数据库上,创建dblin 
drop database link dblink_anson; 
Create public 
database link dblink_anson 
Connect to lg identified by lg using 'SDLGDB'; 
--源数据库的用户名、密码、服务器名k 


/*二、创建快照:*/ 
--1、在源和目的数据库上同时执行一下语句,创建要被同步的表 
drop table tb_anson; 
create table tb_anson(c1 varchar2(12)); 
alter table tb_anson add constraint pk_anson primary key (C1); 

--2、在目的数据库上,测试dblink 
select * from tb_anson@dblink_anson; 
select * from tb_anson; 

--3、在源数据库上,创建要同步表的快照日志 
Create snapshot log on tb_anson; 

--4、创建快照,快照(被同步(源)数据库服务必须启动) 
Create snapshot sn_anson as select * from tb_anson@dblink_anson; 

--5、设置快照刷新时间 
Alter snapshot anson  refresh fast Start with sysdate+1/24*60 next sysdate+10/24*60; 
--oracle自动在1分钟后进行第一次快速刷新,以后每隔10分钟快速刷新一次 
Alter snapshot anson  refresh complete Start with sysdate+30/24*60*60 next sysdate+1; 
--oracle自动在30钞后进行第一次完全刷新,以后每隔1天完全刷新一次 

--6、手动刷新快照 
begin 
dbms_refresh.refresh('"CS"."SN_ANSON"'); 
end;

原文地址:https://www.cnblogs.com/yangyanhao/p/11370093.html