본문 바로가기

나 어제 배웠다/Database

Oracle SnapShot 에 대하여(오라클 스냅샷)

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 .snapshot_name
       PCTFREE               integer
       PCTUSED               integer
       INITRANS              integer
       MAXTRANS              integer
       TABLESPACE            tablespace
       STORAGE               storage_clause
       CLUSTER               cluster (column_list)
       REFRESH              
                            
                                           
       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$

7) Snapshot 에 관련한 Data dictionary tables:

SNAP$
MLOG$

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 된다.

'나 어제 배웠다 > Database' 카테고리의 다른 글

오라클 트리거에 대하여...  (0) 2008.05.07
오라클 SQL*PLUS 명령어 모음  (0) 2008.04.28
SQL*PLUS 명령어 모음  (0) 2008.04.23
오라클 1원 팁  (0) 2008.04.22
토드(Toad) 관리 기능  (0) 2008.04.18