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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM