데이터베이스 분류
스냅샵의 사용
작성자 정보
- 웹관리자 작성
- 작성일
컨텐츠 정보
- 8,094 조회
- 0 추천
- 목록
본문
스냅샵의 사용
스냅샵은 보통 원격지DB의 내용을 자신의 로컬 DB에 저장하려는 목적으로 사용된다. 한마디로 DB의 복사본이라고 생각하면 된다. 이 스냅샵은 생성시 옵션으로 주기적으로 refresh할 수 있다. 보통 원격지의 DB는 master 라고 한다. 스냅샵은 long컬럼을 가질 수 없다. 스냅샵은 2가지 형태가 있다. simple, complex simple snapshot single remote table에 기반한다. 혹은 제한된 서브쿼리의 형태를 사용하여 많은 테이블에 정의된다. simple 스냅샵이 포함할 수 없는 것. group by connect by distinct or aggregate functions joins set operations complex snapshot 많은 master databases에 있는 많은 master tables에 기반할 수 있다. Refresh Mode지정 마스터 DB에 변경상황이 발생했을 경우 이를 스냅샵에 갱신해줘야 한다. 이는 3가지 모드가 있다. fast complete refresh FAST 오라클은 snapshot log에 기록된 마스터 테이블의 변화가 생기면 snapshot을 갱신한다. 다음의 모든 상황이 만족할때만 fast refresh를 수행할 수 있다. 1. simple snapshot 2. 스냅샵의 마스터 테이블이 snapshot log를 가지고 있다. 3. snapshot의 마지막 갱신/생성 이전에 snapshot log가 생성되었을때 COMPLETE 요놈은 어떻게 보면 상당히 비효율적이다. 스냅샵을 생성하기 위한 질의를 다시 실행한다. fast refresh는 complete refresh보다 빠르다. 왜냐하면, 말 그대로 fast가 complete보다 더 적은 양의 데이터를 전송하기 때문이다. fast refresh는 last refresh이후, 마스터테이블 데이터의 변경부분만 전송한다. 반면, complete refresh는 스냅샵 쿼리의 완전한 결과를 전송한다. FORCE 오라클이 어떻게 스냅샵을 갱신할지를 지정한다. 만일 fast refresh가 가능하면 오라클은 fast refresh를 수행한다. fast refresh가 가능하지 않다면 오라클은 complete refresh를 수행한다.
# 스냅샵 로그 FAST REFRESH를 사용하기 위해선 remote DB에 snapshot log를 생성해야 한다. 스냅샵로그는 스냅샵의 마스터 테이블과 연관된 테이블이다. 마스터 테이블 데이터에 변경상황이 발생하면 오라클은 이 변경상황들을 설명하는 row들을 스냅샵로그에 기록한다. 나중에 오라클은 마스터테이블에 기반한 스냅샵을 갱신하기위해 이 row들을 사용할 수 있다. 이를 fast refresh라고 한다. 스냅샵로그가 없다면, 오라클은 스냅샵을 갱신하기위해 스냅샵쿼리를 다시 실행해야만 한다. 이를 complete refresh라고 한다. tip> 스냅샵로그는 AFTER row trigger를 이용한다. 스냅샵로그는 마스터 데이터베이스에 존재한다. 마스터 테이블에 대해 단지 하나의 스냅샵로그만이 필요하다. 예제 1) EMP테이블에 생성된 simple primary-key 스냅샵에 fast refresh를 수행하기 위해 이 스냅샵로그를 사용할 수 있다. create snapshot log on emp pctfree 5 tablespace users storage (inital 10k next 10k pctincrease 50); 오라클이 primary-key 스냅샵을 수행하기 위해, 마스터 테이블에 있는 update된 row들의 프라이머리키는 스냅샵로그에 기록되어야 한다. 비슷하게, rowid스냅샵에서, rowid는 스냅샵로그에 기록되어야 한다. primary-key 스냅샵, rowid스냅샵은 같이 저장될 수도 있다. 다음의 예는 갱신된 row들의 primary-key만을 저장하는 스냅샵로그를 생성한다. create snapshot log on emp; create snapshot log on emp with primary key; 다음은 primary-key와 rowid 둘다 저장한다. create snapshot log on sales with rowid, primary key; 다음은 primary-key와 필터컬럼ZIP을 기록하는 스냅샵로그를 생성한다. create snapshot log on address with (zip) Automatic Refresh를 하기 위해 다음을 지정한다. (2는 정확한 내용을 모르겠다) 1. start with와 next패러미터를 create snapshot문장의 refresh절에 지정한다. 2. 1이상의 queue processes를 패러미터파일에서 enable한다. snapshot_refresh_interval = 60 snapshot_refresh_processes = 1 snapshot_refresh_keep_connections = true |
원격지 DB [kang@dev kang]$ sqlplus kang/xxxxxx SQL*Plus: Release 8.1.6.0.0 - Production on Mon Nov 6 21:13:35 2000 (c) Copyright 1999 Oracle Corporation. All rights reserved. Connected to: Oracle8i Enterprise Edition Release 8.1.6.1.0 - Production With the Partitioning option JServer Release 8.1.6.0.0 - Production SQL> select * from test; NAME AGE BIRTH ---------- ---------- -------- 강명규 27 19740509 SQL> create snapshot log on test; create snapshot log on test * ERROR at line 1: ORA-12014: table 'TEST' does not contain a primary key constraint SQL> desc test; Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) AGE NUMBER(2) BIRTH VARCHAR2(8) SQL> alter table test 2 add constraints test_pk primary key (name); Table altered. SQL> create snapshot log on test; Materialized view log created. SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- MLOG$_TEST TABLE RUPD$_TEST TABLE TEST TABLE SQL> select * from mlog$_test; no rows selected SQL> select * from rupd$_test; no rows selected 로컬 DB SQL> connect sys/xxxxxx 연결되었습니다. SQL> grant create snapshot to kang; 권한이 부여되었습니다. SQL> connect kang/xxxxxx 연결되었습니다. SQL> create database link dev.kang.com 2 connect to kang identified by xxxxxx 3 using 'dev' SQL> create snapshot test_sf 2 pctfree 5 pctused 60 3 tablespace users 4 storage (initial 50k next 50k) 5 refresh fast next sysdate+7 6 as 7 select name from kang.test@dev.kang.com; 구체화된 뷰가 작성되었습니다. SQL> drop snapshot test_sf; 구체화된 뷰가 삭제되었습니다. SQL> create snapshot test_sf 2 pctfree 5 pctused 60 3 tablespace users 4 storage (initial 50k next 50k) 5 refresh fast next sysdate+(1/288) 6 as 7 select name from kang.test@dev.kang.com; 구체화된 뷰가 작성되었습니다. SQL> select * from test_sf; NAME ---------- 강명규 원격지 DB SQL> insert into test values('강병욱', 29, '19730103'); 1 row created. SQL> commit; Commit complete. SQL> desc mlog$_test; Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) SNAPTIME$$ DATE DMLTYPE$$ VARCHAR2(1) OLD_NEW$$ VARCHAR2(1) CHANGE_VECTOR$$ RAW(255) SQL> select * from mlog$_test; NAME SNAPTIME$ D O ---------- --------- - - CHANGE_VECTOR$$ -------------------------------------------------------------------------------- 강병욱 01-JAN-00 I N FE SQL> select * from rupd$_test; no rows selected SQL> select * from mlog$_test; no rows selected 5분후 로컬 DB에서 확인 SQL> select * from test_sf; NAME ---------- 강명규 SQL> set time on 21:37:53 SQL> / NAME ---------- 강명규 21:37:55 SQL> select * from test_sf; NAME ---------- 강명규 21:38:01 SQL> / NAME ---------- 강명규 강병욱 원격지 DB SQL> drop snapshot log on test; Materialized view log dropped. SQL> create snapshot log on test with (age, birth); Materialized view log created. 로컬 DB 21:51:56 SQL> set time off SQL> create snapshot test_sf 2 pctfree 5 pctused 60 3 tablespace users 4 storage (initial 50k next 50k) 5 refresh fast next sysdate+(1/288) 6 as 7 select * from kang.test@dev.kang.com; 구체화된 뷰가 작성되었습니다. SQL> select * from test_sf; NAME AGE BIRTH ---------- ---------- -------- 강명규 27 19740509 강병욱 29 19730103 SQL> drop snapshot test_sf; 구체화된 뷰가 삭제되었습니다. 원격지 DB SQL> drop snapshot log on test; Materialized view log dropped. [complex snapshot] 아래의 예에서는 3대의 DB서버가 필요하다. dev와 dev2 서버에서 가져온 각각의 데이터를 통합하여 로컬DB의 테이블에 저장하는 예이다. SQL> connect kang/xxxxxx@dev 연결되었습니다. SQL> create table emp ( 2 name varchar2(10), 3 age number); 테이블이 생성되었습니다. SQL> insert into emp values('강명규', 27); 1 개의 행이 만들어졌습니다. SQL> connect kang/xxxxxx@dev2 연결되었습니다. SQL> create table emp( 2 name varchar2(10), 3 age number); 테이블이 생성되었습니다. SQL> insert into emp values('홍길동', 28); 1 개의 행이 만들어졌습니다. SQL> connect kang/xxxxxx 연결되었습니다. SQL> create database link dev2.kang.com 2 connect to kang identified by xxxxxx 3 using 'dev2'; 데이타베이스 링크가 생성되었습니다. SQL> create snapshot all_emps 2 pctfree 5 pctused 60 3 tablespace users 4 storage (initial 50k next 50k) 5 using index storage (initial 25k next 25k) 6 refresh start with round(sysdate+1)+11/24 7 next sysdate+7 8 as 9 select * from kang.emp@dev2.kang.com 10 union 11 select * from kang.emp@dev.kang.com; 구체화된 뷰가 작성되었습니다. SQL> select * from all_emps; NAME AGE ---------- ---------- 강명규 27 홍길동 28 롤백세그먼트 지정(다음에 하자-skip) 마스터와 로컬 사이트에 refresh동안 사용되는 롤백세그먼트를 지정할 수 있다. complex 스냅샵이라면 마스터 롤백세그먼트는 무시된다. dev.kang.com SQL> create tablespace MYRBS 2 datafile '/ora8i/oradata/dev/rbs02.dbf' size 50m; 테이블 영역이 생성되었습니다. SQL> create rollback segment myrbs01 2 tablespace MYRBS 3 storage( initial 10k next 10k maxextents unlimited); 롤백 세그멘트가 생성되었습니다. 로컬DB SQL> create tablespace MYRBS 2 datafile 'C:ORACLEORADATAMADDOG bs02.dbf' size 10m; 테이블 영역이 생성되었습니다. SQL> create rollback segment myrbs01 2 tablespace MYRBS 3 storage (initial 10k next 10k maxextents unlimited); 롤백 세그멘트가 생성되었습니다. SQL> create snapshot temp_test 2 refresh fast start with sysdate next sysdate+7 3 using master rollback segment myrbs01 4 local rollback segment myrbs01 5 as 6 select * from test@dev.kang.com; select * from test@dev.kang.com * 6행에 오류: ORA-23413: "KANG"."TEST" 테이블이 스냅샷 로그를 가지고 있지 않습니다 SQL> connect kang/xxxxxx@dev 연결되었습니다. SQL> select * from test; NAME AGE BIRTH ---------- ---------- -------- 강명규 27 19740509 강병욱 29 19730103 SQL> create snapshot log on test; 구체화된 뷰 로그가 작성되었습니다. 음.. 너무 길어진다. 롤백에서는 자꾸 에러가 나서 더 질려버렸다. 다음에 기회가 되면 다시 하겠다. 1 create snapshot temp_test 2 refresh fast start with sysdate next sysdate+7 3 using master rollback segment myrbs01 4 local rollback segment myrbs01 5 as 6* select name from kang.test@dev.kang.com SQL> / select name from kang.test@dev.kang.com * 6행에 오류: ORA-06512: 줄 1에서 Primary-key와 rowid스냅샵 Primary-key스냅샵 create snapshot human_genome refresh fast start with sysdate next sysdate + 1/4096 with primary key as select * from genome_catalog; rowid스냅샵 cretate snapshot emp_data with rowid as select * from emp_table73;
"무단배포금지: 클라우드포털(www.linux.co.kr)의 모든 강좌는 저작권에 의해 보호되는 콘텐츠입니다. 무단으로 복제하여 배포하는 행위는 금지되어 있습니다."
관련자료
-
이전
-
다음
댓글 0
등록된 댓글이 없습니다.