상세 컨텐츠

본문 제목

snapshot의 기본개념과 예제

프로그래밍/DB

by 라제폰 2008. 12. 23. 13:06

본문

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

 


관련글 더보기