OS: Windows 2000 Advanced Server DBMS: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production 작성자: 강명규(kang@dbakorea.pe.kr)
A라는 서버에서 실행중인 DB(source)의 tablespace를 다른 B라는 서버의 DB(target)에 옮길 수 있다. 이는 8i에서부터 추가된 transportable tablespace라는 것으로 수행될 수 있다. 전체 DB를 복제하는 것과는 달리, 필요한 테이블스페이스만을 복사할 수 있고, 속도또한 export/import, load,unload보다 빠르므로 여러면에서 유용할 수 있다.
이후 Transportable tablespace용어는 TTS라고 칭하겠다.
사용예 예를 들어, D/W나 data mart에 데이터를 로드하는 과정에서 사용될 수 있다.
# OLTP DB -> staging DB -> D/W -> data mart
OLTP 시스템 -> D/W staging 시스템으로 데이터 이동 staging 시스템 -> D/W, 데이터마트로 update D/W -> 데이터마트로 data로드 OLTP,D/W 시스템의 아카이빙 내부/외부 고객에게 Data Publishing
TTS의 source(전송할 테이블스페이스의 원본이 존재하는 곳)와 target(테이블스페이스를 전송받을 곳)은 서로 다른 시스템에서 하면 좋겠으나, 여기선 테스트만 할 것이므로 동일한 시스템에서 서로 다른 DB간에 전송할 것이다. 사실 테스트할 컴퓨터가 현재 1대 밖에 없어서 어쩔 수 없다.
[source] ORACLE_SID: win817db tablespace디렉토리: C:oracleoradatawin817db
[target] ORACLE_SID: win817d2 tablespace디렉토리: C:oracleoradatawin817d2
== TTS 수행과정 ==
[source] : 8i Enterprise Edition이상되어야 함.
SQL> select value from v$option where parameter='Export transportable tablespaces';
VALUE ---------------------------------------------------------------- TRUE
1. transport할 테이블스페이스들(tablespace set)을 read only모드로 변경 2. tablespace set에 속한 datafile들을 taget DB로 복사 3. 패러미터 transport_tablespace=y를 사용하여 export (metadata export file) 4. transport할 테이블스페이스들(tablespace set)을 read write모드로 복귀
[target] : Any Edition of 8i 5. datafile을 복사한 상태에서, 패러미터 transport_tablespace=y를 사용하여 target DB에서 imp수행 6. 필요시 전송된 테이블스페이스를 read write모드로 변경
transportable tablespace set: tablespace set에 속한 datafile + metadata export file export수행의 결과로 생성된 metadata export file에는 실제 데이터가 존재하는 것이 아니고 data dictionary의 structural information이 존재한다.
제약사항 source/target DB가 동일한 block size, 캐릭터셋을 가져야 하며, 동일한 하드웨어 벤더의 호환 플랫폼에서 실행되어야 한다. 즉, source가 Windows이고 target이 Sun Solaris일 경우에는 TTS를 수행할 수 없다. 또한, TTS를 사용하기 위해선 초기화 패러미터파일(init.ora)에 compatible패러미터를 8.1이상으로 설정해야 한다. source의 TTS내에 존재하는 객체의 이름이 target DB에 존재한다면 수행될 수 없다.
not support: 스냅샵/복제, 함수기반인덱스, scoped REFs, 도메인 인덱스, 8.0호환 Advanced queues with multiple recipients
* export된 metadata에는 trigger, grants, constraints는 포함될 수도 있고, 상실될 수도 있다. 하지만, primary key는 항상 export된다. TTS를 수행할 tablespace set은 self-contained 이어야 한다. 즉, 테이블의 인덱스가 저장된 tablespace가 transportable tablespace set에 속해 있지 않다면, 이는 self-contained 가 아니다. 즉, 외부참조가 존재하기 때문에 TTS를 수행할 수 없다. self-contained 여부는 dbms_tts.transport_set_check로 체크할 수 있다. 이를 위해선 execute_catalog_role 이 필요하다.
#################################################### 실습예(몇몇 메시지는 글의 간략함을 위해 생략되었다.) ####################################################
----------------------------------------------- [SOURCE 측] ORACLE_SID : win817db ----------------------------------------------- 우선 TTS는 ts_kang, ts_kang_idx라는 테이블스페이스로 한다. 이를 위해 tts_test라는 테이블을 생성하여 데이터는 ts_kang에, 인덱스는 ts_kang_idx에 들어가게 한다.
SQL> conn kang/xxxxxx 연결되었습니다. SQL> create table tts_test 2 ( 3 id varchar(10), 4 name varchar(10), 5 constraint tts_test_pk primary key(id) using index tablespace TS_KANG_IDX 6 ) tablespace TS_KANG;
몇개의 간단한 데이터를 넣어보자. SQL> insert into tts_test values('maddog', '강명규'); SQL> insert into tts_test values('superman', '슈퍼맨'); SQL> insert into tts_test values('dbakorea', '강명규'); SQL> commit;
SQL> conn sys/xxxxxx 연결되었습니다.
transport_set_check에 ts_kang만을 인자로 주고, 에러상황을 테스트해보자. SQL> exec dbms_tts.transport_set_check('ts_kang',true);
PL/SQL 처리가 정상적으로 완료되었습니다.
transport_set_violations뷰를 보면 ts_kang이 self-contained하지 않음을 알 수 있다. SQL> select * from transport_set_violations;
VIOLATIONS -------------------------------------------------------------------------------- Index KANG.TTS_TEST_PK in tablespace TS_KANG_IDX enforces primary constriants o f table KANG.TTS_TEST in tablespace TS_KANG
그럼 이제 제대로 self-contained를 체크해보자. SQL> exec dbms_tts.transport_set_check('ts_kang,ts_kang_idx',true);
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> select * from transport_set_violations;
선택된 레코드가 없습니다.
ts_kang, ts_kang_idx가 self-contained tablespace set이므로 TTS를 수행할 수 있다. 이제 transport할 TS를 read only상태로 변경한다.
SQL> alter tablespace ts_kang read only; SQL> alter tablespace ts_kang_idx read only;
ts_kang, ts_kang_idx의 데이터파일과 export file을 target(C:oracleoradatawin817d2)에 복사한다.
SQL> select file_name from dba_data_files where tablespace_name in ('TS_KANG', 'TS_KANG_IDX');
FILE_NAME -------------------------------------------------------------------------------- C:ORACLEORADATAWIN817DBTS_KANG01.DBF C:ORACLEORADATAWIN817DBTS_KANG_IDX01.DBF
SQL> host copy C:ORACLEORADATAWIN817DBTS_KANG01.DBF d: 1개 파일이 복사되었습니다.
SQL> host copy C:ORACLEORADATAWIN817DBTS_KANG_IDX01.DBF d: 1개 파일이 복사되었습니다.
SQL> host exp 'sys/xxxxxx as sysdba' transport_tablespace=y tablespaces=(ts_kang,ts_kang_idx) triggers=n grants=n file=d: ts_test.dmp
Export: Release 8.1.7.0.0 - Production on 일 Jan 19 14:13:59 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
접속 대상: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production KO16KSC5601 문자 설정과 KO16KSC5601 NCHAR 문자 설정에서 엑스포트가 종료되었습니다 경고: 테이블 데이터(행)가 엑스포트 되지 않습니다 주: 테이블/뷰/순차/롤에 대한 권한이 엑스포트 되지 않습니다
이동가능한 테이블스페이스 메타데이터를 엑스포트하려고 합니다... TS_KANG 테이블스페이스에 관하여 ... . 클러스터 정의 엑스포트 중 . 테이블 정의를 엑스포트합니다 . . 테이블 TTS_TEST(를)을 엑스포트 중 TS_KANG_IDX 테이블스페이스에 관하여 ... . 클러스터 정의 엑스포트 중 . 테이블 정의를 엑스포트합니다 . 참조 무결성 제약조건 엑스포트 중 . 이동가능한 테이블스페이그 메타데이터 엑스포트를 종료합니다 엑스포트가 경고 없이 정상적으로 종료되었습니다.
SQL> alter tablespace ts_kang read write; SQL> alter tablespace ts_kang_idx read write;
----------------------------------------------- [TARGET 측] ORACLE_SID : win817d2 ----------------------------------------------- [source] [target] C:oracleoradatawin817db s_kang01.dbf => C:oracleoradatawin817d2 s_kang01.dbf C:oracleoradatawin817db s_kang_idx01.dbf => C:oracleoradatawin817d2 s_kang_idx01.dbf
source측에서 kang이라는 유저가 사용하는 테이블스페이스이므로 target에 사용자 kang이 존재하지 않으면 생성해 준다.
D:>set ORACLE_SID=win817d2
D:>sqlplus system/manager
SQL> create user kang identified by xxxxxx 2 default tablespace users 3 temporary tablespace temp;
사용자가 생성되었습니다.
SQL> grant connect, resource to kang;
권한이 부여되었습니다.
이제, export된 파일을 import해준다. D:>copy ts_kang01.dbf C:oracleoradatawin817d2 1개 파일이 복사되었습니다.
D:>copy ts_kang_idx01.dbf C:oracleoradatawin817d2 1개 파일이 복사되었습니다.
D:>imp 'sys/xxxxxx as sysdba' transport_tablespace=y tablespaces=(ts_kang,ts_kang_idx) datafiles=('C:oracleoradatawin817d2 s_kang01.dbf','C:oracleoradatawin817d2 s_kang_idx01.dbf') file=tts_test.dmp
Import: Release 8.1.7.0.0 - Production on 일 Jan 19 14:21:48 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
접속 대상: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production
엑스포트 파일은 규정 경로를 거쳐 EXPORT:V08.01.07 에 의해 생성되었습니다 이동 가능한 테이블스페이스(들) 메타데이터을 임포트하려고 합니다... KO16KSC5601 문자집합과 KO16KSC5601 NCHAR 문자 집합에 임포트가 완성되었습니다 . SYS 객체를 SYS(으)로 임포트하는 중입니다 . KANG 객체를 KANG(으)로 임포트하는 중입니다 . . 테이블 "TTS_TEST"(를)을 임포트 중 사용 가능한 제약 조건에 관해서... 임포트가 경고 없이 정상적으로 종료되었습니다.
D:>sqlplus kang/xxxxxx
SQL*Plus: Release 8.1.7.0.0 - Production on 일 Jan 19 14:22:29 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Connected to: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production
SQL> select * from tts_test;
ID NAME ---------- ---------- maddog 강명규 superman 슈퍼맨 dbakorea 강명규
SQL> conn system/manager 연결되었습니다. SQL> select tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS ------------------------------ --------- SYSTEM ONLINE RBS ONLINE USERS ONLINE TEMP ONLINE TOOLS ONLINE INDX ONLINE TS_KANG READ ONLY TS_KANG_IDX READ ONLY
8 개의 행이 선택되었습니다.
SQL> alter tablespace ts_kang read write;
테이블 영역이 변경되었습니다.
SQL> alter tablespace ts_kang_idx read write;
테이블 영역이 변경되었습니다.
SQL>
| This article comes from dbakorea.pe.kr (Leave this line as is)
|