tbExport 유틸리티는 특정 오브젝트들을 추출(export)하여 운영체제의 파일 형식으로 저장하는 기능을 제공하며, 저장된 파일은 다른(혹은 동일한) 티베로 데이터베이스에서 언제든지 다시 불러들여(import) 사용할 수 있다
따라서 사용자는 해당 유틸리티를 통해 주요 오브젝트들을 손쉽게 이동할 수 있으며 별도의 저장매체에 복사하여 안전하게 백업할 수도 있다. 다만 tbExport 수행 자체가 많은 운영체제/데이터베이스 자원을 사용하므로 데이터베이스 부하가 적은 시간에 작업하는것이 바람직하다.
또한 손쉽게 많은 데이터를 추출할 수 있는 만큼 해당 유틸리티를 사용할 수 있는 사용자를 철저히 통제하여 보안사고가 발생하지 않도록 주의를 기울여야 한다(tbExport는 DBA 권한 혹은 SELECT ANY DICTIONARY 권한이 필요하므로 해당 권한은 꼭 필요한 사용자에게만 부여하도록 한다).
1. tbExport를 통해 추출한 데이터는 동일 시점이 아닌 순차적인 Export 작업 시점의 데이터이다. 따라서 추출하는 오브젝트의 DML이 없는 시간대에 수행하도록 한다.
2. 추출 대상 테이블의 크기가 클 경우(10G 이상) 다음을 고려한다.
2-1) 작업 시간이 지나치게 길어질 경우 중간에 예기치 않은 사고에 대한 실패위험에 장시간 노출되므로 약 10G 단위로 나누어 수행한다(예를 들어, 특정 데이터베이스 유저가 10G 테이블 한개, 8G 테이블 한개, 1G 미만 테이블 10개를 보유하고 있다면 세 번에 나누어 작업한다).
2-2) 작업 시간을 최소화하기 위해 index, 통계 정보 등 무거운 부가 정보는 제외하고 데이터 이동 후 별도의 SCRIPT를 통해 생성한다(tbExport는 특정 테이블 선택 시 연관된 객체(인덱스, 제약조건, 권한, 통계 정보 등)가 모두 함께 추출된다).
2-3) 차후 import시 리두로그 발생을 최소화하기 위해 추출 오브젝트들을 모두 nologging 처리하고 추출한다.
3. 추출한 운영체제 파일을 FTP 등을 통해 이관 대상 서버로 이동하는 시간을 줄이기 위해서는 스토리지 등을 통해 서버간 공유할 수 있는 공간을 설정하여 해당 경로에 추출하는 것이 좋다.
4. 추출하는 오브젝트들의 현황 정보(오브젝트 타이별 개수, 크기, 권한, VAILD정보 등)를 저장하여 향후 이관의 정상여부 판단 시 사용한다.
tbExport 모드는 추출 오브젝트의 단위를 의미하며 총 세 가지(전체 데이터베이스 모드, 사용자 모드, 테이블 모드)가 존재한다.
각 모드는 tbExport 수행 시 매개변수 값을 지정하는 것으로 선택이 가능하며 매개변수는 tbExport 모드 외에도 다음과 같은 종류들이 존재하고 이는 tbexport 명령어로도 조회가 가능하다.
tibero:/tibero # tbexport tbexport tbexport 6.0 (FS04) 120037 TmaxData Corporation Copyright (c) 2008-. All rights reserved. Patch files (FS04_CS_1601_b FS04_98340l FS04_103133a FS04_107483h FS04_110122a FS04_110306a FS04_111154b FS04_111345a FS04_111475a FS04_111665b FS04_111692a FS04_111922a FS04_111938c FS04_111941b FS04_111942a FS04_111944a FS04_112043c FS04_112166a FS04_112371a FS04_112481a FS04_112511a FS04_112530e FS04_112689e FS04_113174j FS04_113191b FS04_113587a FS04_113651a FS04_113708a FS04_113737a FS04_114105a FS04_114246a) Usage: tbexport [PARAMETER1=VALUE] [PARAMETER2=VALUE] ... Parameters: CFGFILE Config file name CONSTRAINT Export Constraint: Y/N, default: Y CONSISTENT Consistent Mode: Y/N, default: N EXCLUDE Limit the export to specific objects FILE Export dump file name, default: default.dat --- (이하 생략)
매개변수 | 기본값 | 설명 |
---|---|---|
CFGFILE | Export 환경 파일 이름 | |
USERNAME | Export를 수행하는 사용자 계정 | |
PASSWORD | Export를 수행하는 사용자 암호 | |
IP | localhost | Export 대상 티베로 서버 IP |
PORT | 8629 | Export 대상 티베로 서버 Port |
SID | Export 대상 티베로 서버 SID | |
FILE | default.dat | Export 수행 시 생성되는 파일 이름 |
OVERWRITE | N | Export 수행 시 생성되는 파일 이름이 존재할 경우 덮어쓸지 여부 |
LOG | tbExpImp_[년]_[월]_[일]_[시분초].log | Export 수행 시 생성되는 파일 이름 |
FULL | N | Export 모드, 전체 데이터베이스 대상 |
USER | Export 모드, 특정 사용자에 대상(복수지정 가능) | |
TABLE | Export 모드, 특정 테이블에 대상 (복수지정 가능) | |
EXCLUDE | Export할 때 제외할 특정 유저, 테이블 설정(사용법 아래 사례 참조) | |
INDEX | Y | 인덱스 Export 여부 |
GRANT | Y | 권한 Export 여부 |
CONSTRAINT | Y | 제약 조건 Export 여부 |
ROWS | Y | 통계 정보 Export 여부 |
SCRIPTS | N | Export시 DDL 스크립트를 보여줄지 여부 |
THREAD_CNT | 4 | Export하기 위해 사용하는 스레드 개수 |
QUERY | Export될 데이터에 필터 조건을 지정(사용법은 아래의 사례 참조) 모드에 상관없이 동작하지만, 원하지 않는 테이블에도 적용될 수 있으므로 주의한다. |
|
REMAP_TABLESPACE | Export시 본래의 테이블 스페이스를 다른 테이블 스페이스로 변경 (예시1) 테이블 스페이스 USR1에서 USR3으로 변경 REMAP_TABLESPACE=usr1:usr3 (예시2) 여러 개의 테이블 스페이스 변경 설정 REMAP_TABLESPACE=usr1:usr3,usr2:usr4 |
|
TEMP_DIR | Export를 수행할 때 임시 덤프 파일들이 생성될 디렉터리 지정 | |
SAVE_CREDENTIAL | 암호화한 USERNAME과 PASSWORD를 사용할 때 설정 | |
NO_PACK_DIR | 압축을 해제한 덤프 파일이 저장되는 디렉터리 이 옵션이 지정되면 파일 매개변수에 설정된 값은 무시됨 | |
INLINE_CONSTRAINT | N | Export를 수행할 때 스크립트를 InlineConstraint로 출력할지 여부를 설정 Y:inlineConstraint로 출력(NotNull에만 지원) N:Out-of-lineConstraint로 출력 |
GEOM_ASBYTES | geometry컬럼에 대해 WKB 또는 bytes로 얻어올지 여부를 결정 티베로 6이상 서버에서 Geometry 컬럼 데이터를 WKB 포맷으로 저장하기 때문에 export나 import할 때 이 옵션 을 사용하면 성능면에서 이점을 얻을 수 있다. export할 때 geom_asbytes 옵션을 ‘Y’로 설정하면 st_asbinary 같은 함수를 사용하지 않고 LOB 그대로 처리한다. |
tbExport가 제공하는 다양한 매개변수들을 필요한 상황에 알맞게 적용하는 방법을 다음 수행 예시들을 통해 자세히 살펴보자.
CREATE TABLE TIBEROTEST.TABLE01 ( col1 VARCHAR2(2 BYTE) , col2 VARCHAR2(2 BYTE) , col3 VARCHAR2(2 BYTE) , col4 VARCHAR2(2 BYTE)) TABLESPACE COMDATA; CREATE TABLE TIBEROTEST.TABLE02 ( col1 VARCHAR2(2 BYTE) , col2 VARCHAR2(2 BYTE) , col3 VARCHAR2(2 BYTE) , col4 VARCHAR2(2 BYTE)) TABLESPACE COMDATA; CREATE TABLE TIBEROTEST.TABLE03 ( col1 VARCHAR2(2 BYTE) , col2 VARCHAR2(2 BYTE) , col3 VARCHAR2(2 BYTE) , col4 VARCHAR2(2 BYTE)) TABLESPACE COMDATA; CREATE INDEX TIBEROTEST.TABLE01IX ON TIBEROTEST.TABLE01 (col1) TABLESPACE COMDATA; CREATE INDEX TIBEROTEST.TABLE02IX ON TIBEROTEST.TABLE02 (col1) TABLESPACE COMDATA; CREATE INDEX TIBEROTEST.TABLE03IX ON TIBEROTEST.TABLE03 (col1) TABLESPACE COMDATA; GRANT SELECT, INSERT, UPDATE, DELETE ON TIBEROTEST.TABLE01 TO PUBLIC; GRANT SELECT, INSERT, UPDATE, DELETE ON TIBEROTEST.TABLE02 TO PUBLIC; GRANT SELECT, INSERT, UPDATE, DELETE ON TIBEROTEST.TABLE03 TO PUBLIC; CREATE PUBLIC SYNONYM TABLE01 FOR TIBEROTEST.TABLE01; CREATE PUBLIC SYNONYM TABLE02 FOR TIBEROTEST.TABLE02; CREATE PUBLIC SYNONYM TABLE03 FOR TIBEROTEST.TABLE03; INSERT INTO TIBEROTEST.TABLE01 VALUES('01','02','03','04'); INSERT INTO TIBEROTEST.TABLE01 VALUES('11','12','13','14'); INSERT INTO TIBEROTEST.TABLE01 VALUES('21','22','23','24'); INSERT INTO TIBEROTEST.TABLE01 VALUES('31','32','33','34'); INSERT INTO TIBEROTEST.TABLE02 VALUES('01','02','03','04'); INSERT INTO TIBEROTEST.TABLE02 VALUES('11','12','13','14'); INSERT INTO TIBEROTEST.TABLE02 VALUES('21','22','23','24'); INSERT INTO TIBEROTEST.TABLE02 VALUES('31','32','33','34'); INSERT INTO TIBEROTEST.TABLE03 VALUES('01','02','03','04'); INSERT INTO TIBEROTEST.TABLE03 VALUES('11','12','13','14'); INSERT INTO TIBEROTEST.TABLE03 VALUES('21','22','23','24'); INSERT INTO TIBEROTEST.TABLE03 VALUES('31','32','33','34'); COMMIT;
tibero:/tibero/exptest # tbexport USERNAME=sys PASSWORD=xxxxx SID=xxxxx PORT=11111 FILE=/tibero/exptest/exptest02.dat LOG=/tibero/exptest/exptest02.log USER=tiberotest tbexport 6.0 (FS04) 120037 TmaxData Corporation Copyright (c) 2008-. All rights reserved. the USER: tiberotest: Thu Nov 17 14:00:15 KST 2016 Export national character set: UTF-16 exporting schema: "TIBEROTEST" exporting tables [0] TIBEROTEST.TABLE01 4 rows expected [1] TIBEROTEST.TABLE02 4 rows expected [2] TIBEROTEST.TABLE03 4 rows expected exporting indexes Packing the file... Export completed successfully: Thu Nov 17 14:00:24 KST 2016
tibero:/tibero/exptest # tbexport USERNAME=sys PASSWORD=xxxxx SID=xxxxx PORT=11111 FILE=/tibero/exptest/exptest03.dat LOG=/tibero/exptest/exptest03.log TABLE=TIBEROTEST.TABLE01,TIBEROTEST.TABLE02 tbexport6.0(FS04) 120037 TmaxData Corporation Copyright (c) 2008-. All rights reserved. the TABLE:TIBEROTEST.TABLE01,TIBEROTEST.TABLE02: Thu Nov17 14:00:57 KST 2016 Export national character set:UTF-16 exporting table: "TIBEROTEST"."TABLE01" exporting table: "TIBEROTEST"."TABLE02" [0] TIBEROTEST.TABLE01 4 rows expected [1] TIBEROTEST.TABLE02 4 rows expected exporting indexes exporting object privileges exporting indexes exporting object privileges Packing the file... Export completed successfully:Thu Nov 17 14:01:06 KST 2016
tibero:/tibero/exptest # tbexport USERNAME=sys PASSWORD=xxxxx SID=xxxxx PORT=11111 FILE=/tibero/exptest/exptest04.dat LOG=/tibero/exptest/exptest04.log USER=tiberotest exclude=table:"\"=\'TABLE01\'"\" exclude=table:"\"=\'TABLE02\'"\" # exclude 변수에는 equal(=) 조건 외에 like 조건도 다음과 같이 사용이 가능하다. # exclude=table:"\"LIKE\'TABLE01%\'"\" tbexport6.0(FS04) 120037 TmaxData Corporation Copyright (c) 2008-. All rights reserved. the USER:tiberotest:Thu Nov 1714:26:05 KST 2016 Export national character set:UTF-16 exporting schema: "TIBEROTEST" exporting tables [0] TIBEROTEST.TABLE03 4 rows expected exporting indexes Packing the file... Export completed successfully:Thu Nov 17 14:26:15 KST 2016
tibero:/tibero/exptest # tbexport USERNAME=sys PASSWORD=xxxxx SID=xxxxx PORT=11111 FILE=/tibero/exptest/exptest02.dat LOG=/tibero/exptest/exptest02.log USER=tiberotest INDEX=N tbexport6.0(FS04) 120037 TmaxData Corporation Copyright (c) 2008-. All rights reserved. the USER:tiberotest:Thu Nov 1714:46:02 KST 2016 Export national character set:UTF-16 exporting schema: "TIBEROTEST" exporting tables [0] TIBEROTEST.TABLE01 4 rows expected [2] TIBEROTEST.TABLE03 4 rows expected [1] TIBEROTEST.TABLE02 4 rows expected Packing the file... Export completed successfully:Thu Nov 17 14:46:08 KST 2016
tibero:/tibero/exptest # tbexport USERNAME=sys PASSWORD=xxxxx SID=xxxxx PORT=11111 FILE=/tibero/exptest/exptest06.dat LOG=/tibero/exptest/exptest06.log TABLE=TIBEROTEST.TABLE01,TIBEROTEST.TABLE02 QUERY="\"WHERE COL1 LIKE'3%'"\" tbexport6.0(FS04) 120037 TmaxData Corporation Copyright (c) 2008-. All rights reserved. the TABLE:TIBEROTEST.TABLE01,TIBEROTEST.TABLE02:Thu Nov 17 14:50:11 KST 2016 Export national character set:UTF-16 exporting table: "TIBEROTEST"."TABLE01" exporting table: "TIBEROTEST"."TABLE02" [1] TIBEROTEST.TABLE02 1 rows expected [0] TIBEROTEST.TABLE01 1 rows expected exporting indexes exporting object privileges exporting indexes exporting object privileges Packing the file... Export completed successfully:Thu Nov 17 14:50:19 KST 2016
tibero:/tibero/exptest #tbexport USERNAME=sys PASSWORD=xxxxx SID=xxxxx PORT=11111 FILE=/tibero/exptest/exptest07.dat LOG=/tibero/exptest/exptest07.log TABLE=TIBEROTEST.TABLE01, TIBEROTEST.TABLE02 REMAP_TABLESPACE=COMDATA:USERS # 수행 로그에는 TABLESPACE가 변경된 것이 확인되지는 않는다. # tbimport 사례에서 실제로 exptest07.dat를 수행한 이후 # TABLESPACE가 변경되었는지 확인해보자 the TABLE: TIBEROTEST.TABLE01, TIBEROTEST.TABLE02: Thu Nov 17 14:56:19 KST 2016 Export national character set: UTF-16 exporting table: "TIBEROTEST"."TABLE01" exporting table: "TIBEROTEST"."TABLE02" [0] TIBEROTEST.TABLE01 4 rows expected [1] TIBEROTEST.TABLE02 4 rows expected exporting indexes exporting object privileges exporting indexes exporting object privileges Packing the file... Export completed successfully: Thu Nov 17 14:56:26 KST 2016
CFG 파일을 활용하면 일반 에디터에 작성하는 것처럼 매개변수 파일들을 설정할수 있으므로 실수할 확률이 적고 편리하다. 다만, 매개변수 종류에 따라 cfgfile을 사용하지 않았을 때의 입력값과 차이가 나는 것이 다수 존재하므로 주의해야 한다
(예 : QUERY 변수 사용 시 cfgfile의 경우 [QUERY=WHERE COL1 LIKE '3%']와 같이 입력하고 cfgfile을 사용하지 않았을 때는 [QUERY="\" WHERE COL1LIKE '3%'"\"]와 같이 입력해야 한다).
tibero:/tibero/exptest # vi tbExportCfg01.cfg <--vi editor를 통해 매개변수 설정 ---------------------------------------------------------------- USERNAME=sys PASSWORD=xxxxx SID=xxxxx PORT=11111 FILE=/tibero/exptest/exptest08.dat LOG=/tibero/exptest/exptest08.log USER=tiberotest ---------------------------------------------------------------- tibero:/tibero/exptest # tbexport cfgfile=tbExportCfg01.cfg <-- cfg 파일을 지정하여 tbExport 수행
TbExport 파일을 차후에 TbImport했을 때 원하는 오브젝트들이 모두 정확하게 이관되었는지를 확인하기 위해 모든 테이블의 ROW 데이터를 하나하나 비교해 볼 수는 없지만 최소한 오브젝트 타입, STATUS별 개수 정보는 확인하는 것이 바람직하다.
-- object type, status별 개수 확인 SELECT OBJECT_TYPE, STATUS, SUM(1) AS NUM_OBJ FROM DBA_OBJECTS WHERE OWNER = 'TESTOWNER' GROUP BY OBJECT_TYPE, STATUS ORDER BY OBJECT_TYPE, STATUS; ------------ ------- ---------- object_type status num_obj ------------ ------- ---------- index vaild 295 procedure valid 6 procedure invaild 1 --(이하생략)
이관 전후 status 개수 차이가 존재할 때 어떤 오브젝트가 invaild 되었는지를 확인하기 위해서는 dba_objects 자체를 백업해두는 것이 좋다. 특히 단편화(fragmentation) 제거 목적 등으로 동일 데이터베이스에 tbImport를 할 경우는 tbImport 이후 dba_objects 현황이 변경될 것이므로 반드시 별도의 오브젝트에 백업해야 한다.
-- dba_objects 백업 CREATE TABLE BACKUP_OBJECTS AS SELECT * FROM DBA_OBJECTS WHERE OWNER = ‘TESTOWNER’;
만약 추출 대상 오브젝트들과 관계된 오브젝트들이 다른 계정에도 다수 존재한다면 해당 계정의 정보도 모두 함 께 추출해야 한다(불확실할 경우 전체 정보를 추출한다). 특정 오브젝트를 포함하는 다른 오브젝트는 다음과 같이 DBA_SOURCE를 통해 파악이 가능하다
--관계된 오브젝트 찾기 SELECT DISTINCT NAME, OWNER FROM DBA_SOURCE WHERE UPPER(TEXT) LIKE ‘%OBJECT명%’;
- 강좌 URL : http://www.gurubee.net/lecture/4167
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.