SNAPSHOT의 기본 개념과 예제
Bulletin no : 10358
--------------------------------------------------------------------------------
SNAPSHOT의 기본 개념과 예제
==========================
먼저 Oracle7 에서의 snapshot 에 대해 논하고 implementation 하는 방법과
refresh 하는 방법에 대해 알아보자 .
1) 서론
Oracle7 에서는 분산 network 환경에서 서로 다른 노드의 갯수에 제한이 없이
master table 의 replication 을 위한 table snapshot 을 제공한다.
Snapshot 은 update 가 불가능하다. 이것은 read 만 가능한 table 과 같다고
할 수 있겠다. Update 는 master table 에서만 가능하다.
각 master table의 변경된 사항은 snapshot (replicat) 에 비동기적으로
반영되어진다. 이 refresh 는 SQL 명령어를 이용해 수동적으로 수행되어질 수도
있고, refresh 시간에 따라 자동적으로 수행되어질 수도 있다.
2) Simple 과 Complex
Simple snapshot 은 각 row 가 1개의 remote table 의 1개의 row 에 기초한
것이다. 즉 Group by, Order by, subqueries, joins, set operation이 없는
경우이다. 반대로 snapshot 에 정의된 query 가 이러한 구문을 포함하면
complex snapshot 이라 한다.
3) snapshots 의 장점
. remote table 에 대한 snapshot 을 local 에 가짐으로써 network 을 통한
query 를 하지 않아도 되어 시간을 절약할 수 있다.
. 여러가지 원인에 의해 master table 을 access 하지 못하더라도 master
site 사용자들은 여전히 snapshots을 사용할 수 있다.
4) 사용 방법
CREATE SNAPSHOT <schema>.snapshot_name
PCTFREE integer
PCTUSED integer
INITRANS integer
MAXTRANS integer
TABLESPACE tablespace
STORAGE storage_clause
CLUSTER cluster (column_list)
REFRESH <fast>
<complete>
<force>
START WITH date
NEXT date
5)Snapshot 에 관련한 오브젝트들
Master table
Snapshot base table
Snapshot log
6) Snapshot 에 관련한 Data dictionary Views:
DBA_SNAPSHOTS
DBA_SNAPSHOT_LOGS
USER_SNAPSHOTS
ALL_SNAPSHOTS
MVIEW$<snapshot name>
7) Snapshot 에 관련한 Data dictionary tables:
SNAP$<snapshot name>
MLOG$<snapshot name>
8) 연관된 Packages
*DBMS_SNAPSHOT
이것은 스크립트를 수행하면 생성된다.
catproc.sql
-- 이 Package 에서 수행되는 것들
--
-- purge_log - 필요없는 row 의 log 를 purge
-- refresh - 주어진 snapshot 의 refresh
-- refresh_all - 모든 snapshot 을 refresh
-- drop_snapshot - snapshot 을 drop
-- set_up - snapshot refresh 를 위해 master 쪽을 setup
-- wrap_up - master site 에서 refresh를 record
-- get_log_age - log 에서 가장 오래된 date 를 check
-- testing - snapshot을 test (currently null)
-- I_am_a_refresh - flag used to let triggers identify refreshes
이 package 는 snapshot 를 생성하기 전에 반드시 존재하여야 한다.
9) init.ora 에 적용되는 파라미터들
snapshot 의 refresh process 를 위한 파라미터는 다음과 같다.
o SNAPSHOT_REFRESH_PROCESSES (number)
o SNAPSHOT_REFRESH_INTERVAL (seconds)
o SNAPSHOT_REFRESH_KEEP_CONNECTIONS (true/false)
10) Snapshot Mechanism
Snapshot이 생성되면, Oracle은 이 snapshot에 관련한 여러 다른 오브젝트들도
함께 생성한다. 이들 오브젝트는 변화되어지지 않는다.
snapshot site에서는 snapshot 에서 정의한 query 에 의해 가져온 row 를 저장할
base table 을 생성한다. 또한 이 table 을 기반으로 view 를 생성한다.
이 view 는 read-only 이고 snapshot 을 이용하는 사용자가 이용 가능하다 .
또 다른 view 로는 snapshot 을 refresh 하기 위한 view 가 있다.
Snapshot refreshing:
주기적으로 snapshot 은 refresh 하여 최근의 변화된 사항들을 master
table 에 반영한다. Snapshot process는 snapshot 에서 정의된 query를
이용하여 변화된 사항들을 가져와 이전의 snapshot data 를 변환한다.
각 snapshot 은 각기 트렌젝션에서 refresh 된다.
Snapshot Log:
snapshot log 는 master table과 관련이 있고 master DB 쪽에 존재한다.
여기에는 mater table에서 update/delete/insert 되는 row 가 저장되며
Snapshot refresh 시 이용된다. 임의의 master table에 기초한 simple
snapshot이 refresh되면 snapshot log의 해당 row가 반영된다.
이것을 "fast refresh"라 일컫는다. 한 snapshot log는 같은 master table에
설정된 여러 개의 snapshot log 에 사용되어진다. Log 의 특정 row 는 모든
snapshot 에 의해 필요 없게 되면 삭제가 되어 그 크기가 작게 유지된다.
그러나, 필요로 하는 snapshot 이 하나라도 있으면 지워지지 않는다.
Snapshot이 simple snapshot이 아니고 snapshot log가 없으면 fast refresh
는 불가능하며 이 경우 "complete refresh" 에 의해 refresh 된다.
=========
사용 예 :
=========
**************************************************
[1] Simple snapshot 과 Snapshot log (on Master):
**************************************************
MASTER SITE (REMOTE)
--------------------
Create a snapshot log on the master table:
sqlplus scott/tiger
create snapshot log on emp
tablespace users
storage (initial 10K pctincrease 0)
pctfree 5;
NOTE: init.ora 파라미터는 필요하지 않다.
SNAPSHOT SITE (LOCAL)
---------------------
1. 다음처럼 initSID.ora 파라미터를 설정한다.
snapshot_refresh_interval = 20
snapshot_refresh_processes = 2
snapshot_refresh_keep_connections = true
open_cursors = 250
2. sqldba
connect internal
shutdown
startup (init.ora 파라미터 적용)
3. sqlplus scott/tiger
create database link chicago
connect to scott identified by tiger -- remote, master table의 owner/passwd 지정.
using 'chicago';
NOTE:SQL*Net V2 의 'chicago'는 tnsnames.ora에 정의되어 있어야 한다.
4. sqlplus scott/tiger
create snapshot emp_snap
pctfree 5
pctused 60
refresh fast
start with sysdate
next sysdate + (1/288) /* 5 분마다 refresh */
as select * from emp@chicago;
MASTER SITE (REMOTE)
--------------------
1. sqlplus scott/tiger
insert into emp (empno,ename,job,hiredate,deptno)
values (1234, 'SCOTT','DBA',sysdate,10);
commit;
SNAPSHOT SITE (LOCAL)
---------------------
1. sqlplus scott/tiger (or simply switch to client window)
select count(*) from emp_snap;
snapshot 이 자동으로 refresh 될 때까지 반복한다.(약 5 분)
이 방법은 fast refresh 가 작동됨을 보여준다.
(2) REFRESH COMPLETE OPTION 을 이용한 SNAPSHOT.
=====================
SNAPSHOT SITE (LOCAL)
=====================
Snapshot 생성
---------------
SQL) connect system/manager
Connected.
SQL) grant resource to saj;
Grant succeeded.
Database Link 생성
--------------------
SQL) create database link aixlink
2 connect to system identified by manager
3 using 't:tcaix:V716';
Database link created.
Database Link 생성을 점검
-------------------------------
SQL) desc dept@aixlink
Name Null? Type
------------------------------- --------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
Create the Snapshot
-------------------
SQL) connect saj/saj
Connected.
SQL) create snapshot deptsnap2
2 pctfree 5
3 pctused 60
4 refresh complete
5 start with sysdate
6 next sysdate + 1/(288*20)
/* REFRESH EVERY 15 SECONDS */
7 as select * from system.dept@aixlink;
Snapshot created.
Snapshot 생성 점검
--------------------------
SQL) select * from deptsnap2;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 a,b
====================
MASTER SITE (REMOTE)
====================
SQL) connect system/manager
Connected.
마스터 테이블 점검
----------------------
SQL) select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 a,b
SQL) delete from dept where deptno = 50;
1 row deleted.
SQL) commit;
Commit complete.
=====================
SNAPSHOT SITE (LOCAL)
=====================
SQL> select * from deptsnap2;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 a,b
After 15 seconds:
SQL> /
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
RESULT : 이 Snapshot 이 refreshed complete 로 생성되었기 때문에 자동으로
refresh 된다.
출처 : http://www.okjsp.pe.kr/bbs?act=VIEW&seq=13185&bbs=bbs2&keyfield=content&keyword=trigger&pg=0