본문 바로가기

닷컴's_열공/Database

imp/exp 적절한 사용법

1. 테이블 Export 하기

Export 명령은 Import 에 비하여 비교적 간단하다. exp 명령과 옵션을 이용해서 바로 실행시키거나 exp 명령만 실행하여 
Interactive Mode 로 수행이 가능하다.
Export 단위는 사용자 혹은 테이블 단위가 되며 tables 옵션을 생략한 경우 default 로 사용자 단위 export 를 수행한다.

일반적인 export 실행 명령어

exp 사용자ID/암호@오라클인스턴스명 file=백업할 파일명 indexes=yes grants=yes constraints=yes

옵션을 보면 각 옵션이 어떤 역할을 하는지 쉽게 알 수 있을 것이다. 위 옵션들은 기본적은 옵션으로 exp 를 interactive mode
로 
실행했을 경우는
buffer size 등과 같은 몇개의 옵션을 볼 수 있으나 보통 기본값으로 하면 된다.

indexes=yes(no) : 사용자 테이블을 export 할 때 관련 Index 도 같이 export 한다
grants=yes(no)  : 사용자의 권한도 같이 export 한다
contraints=yes(no) : 사용자 테이블에 걸려있는 각종 제약조건(constraints)를 모두 export 한다.

옵션은 Y/N 으로 지정해도 된다.

* 주의 : Oracle9i 에서 export 할 경우 각 테이블의 통계 정보가 생성되어 있지 않으면 익스포트시 Warning 이 발생할 수
있다. 
Warning 이 발생한다고 해도
Import 를 하는 경우에 큰 지장은 없으므로 무시해도 되지만 Warning 자체가 기분이 나쁘다면 statistics 옵션으로 Warning 을
숨
길 수 있다.

exp 사용자ID/암호@오라클인스턴스명 file=백업할 파일명 indexes=yes grants=yes constraints=yes statistics=none


테이블 단위로만 Export 하고 싶다면 tables 옵션을 이용하여 Export 받을 테이블들을 명시하면 된다.

exp 사용자ID/암호@오라클인스턴스명 file=백업할 파일명 indexes=yes grants=yes constraints=yes 
tables=category,cat_template,template

위 명령어는 category , cat_template , template 테이블만 export 하여 dump file 을 생성한다.

* 참고
테이블의 통계 정보란? 오라클은 Cost Based Optimizer 와 Rule Based Optimizer 를 모두 지원하며 설치시 기본값은 Choose
다.
Cost Based Optimizer 모드로 오라클이 동작하는 경우 각 테이블에 대한 통계 정보를 생성하여 그 정보를 바탕으로 적절한 
Execution Plan 을 생성한다.
테이블 통계 정보는 레코드수, 테이블 사이즈 , 인덱스 값들의 분포도 등을 포함하고 있다.

좀 더 자세한 옵션에 대한 설명은 

http://www.dbconnect.com/mcexuser_exp.htm

를 참고한다.

2. 테이블 Import 하기

Import 작업은 Export 에 비해 데이터베이스 상황에 따라서 에러 발생 소지가 굉장히 많은 작업이다. 주로 에러는 Export 보다

Import 시 많이 발생한다.

에러의 패턴은 주로 

1. 익스포트할 사용자와 임포트할 사용자의 ID가 틀린 경우
2. 익스포트한 객체들의 테이블 스페이스와 임포트할 테이블 스페이스 이름이 다른 경우
3. 임포트할 테이블스페이스 스토리지 옵션과 덤프할 데이터가 맞지 않은 경우 ( Initial 사이즈가 너무 크거나 작다거나 등 )

의 경우 많이 발생한다.

1. 익스포트한 사용자와 임포트할 사용자의 ID가 틀린 경우

fromuser , touser 옵션을 사용하여 명시적으로 ID 를 지정한다.

예 ) imp 오라클사용자명/암호@인스턴스명 file=덤프파일이름 fromuser=익스포트한사용자ID touser=임포트할ID

2. 익스포트한 DB 와 임포트한 DB 의 테이블스페이스명이 틀린 경우

이 경우에는 여러가지 해결 방법이 있으나 보통 덤프 파일을 통해서 테이블 생성 스크립트를 만든 후 작업을 진행한다

* 덤프 파일에서 테이블 생성 스크립트 추출하기 : imp 명령의 indexfile 옵션을 이용한다

imp 오라클사용자명/암호@인스턴스명 file=덤프파일이름 fromuser=익스포트한사용자ID touser=임포트할ID
indexfile=스크립트명

디렉토리에 스크립트가 생긴 것을 볼 수 있다. 이 생성 스크립트를 바로 사용할 수는 없으니 VI 등의 에디터로 편집한다.

에디터에서 보면 각 오브젝트들의 생성 스크립트가 생긴 것을 볼 수 있다. 이 생성 스크립트는 전부 주석 처리가 되어 있는데 
(REM) 주석을 모두 제거한다.
그리고 생성 스크립트에서 TABLESPACE 이름을 임포트할 곳의 테이블 스크립트에 맞게 변경해준다. 그리고 각 테이블의 생성
스크립
트 마지막 줄에는
... XXX Rows 라고 익스포트된 레코드를 표시하는 부분이 있는데 이 라인들도 모두 제거한다. 그리고 스크립트 처음 부분에
보면 첫
번째 테이블을 생성하고
connect 명령어가 나오는데 이 부분 역시 제거하자.

생성 스크립트를 모두 수정하였으면 SQL/Plus에서 테이블생성스크립트를 돌린 후 imp 명령을 다시 실행한다.

이때 indexfile 옵션은 없애야 하며 대신 ignore=yes 옵션을 추가한다. ignore=yes 는 임포트시 동일한 이름의 오브젝트가 있는
경
우 에러를 내고 임포트를
skip 하는데 이를 무시하고 임포트 할 수 있게 해준다.

imp 오라클사용자명/암호@인스턴스명 file=덤프파일이름 fromuser=익스포트한사용자ID touser=임포트할ID ignore=yes


* 테이블스페이스 스토리지 옵션에 따른 에러는 너무 다양한 에러와 처리 방법이 존재하므로 발생한 에러에 맞는 대응을
해야함

3. 기존의 자료가 이미 있는 경우 전체 테이블 drop script 만드는 법

SQL/Plus 의 Spool 명령어와 TABS 뷰를 이용하여 사용자의 모든 테이블을 드롭하는 스크립트를 생성한다

SQL/Plus 접속 후 

spool drop.sql ( 파일 이름은 알아서.. )
select 'drop table '||table_name||';' from tabs;
spool off

SQL/Plus 를 빠져나가서 보면 drop.sql 이 생성된 것을 볼 수 있다. 이 파일을 수정해서 사용하면 된다.
파일을 열어보면 아까 수행했던 SQL/Plus 화면이 그대로 저장된 것을 볼 수 있다. 이 파일에는 drop table .. 로 시작하는 SQL
구문
과
그렇지 않은 부분이 있으므로 SQL 구문이 아닌 문장을 모두 제거하고 저장한 다음 SQL/PLUS 로 접속해서

@drop

명령을 실행한다 ( 명령은 아니고 drop.sql 을 실행하라는 SQL/Plus 명령이다. 파일명이 drop_table.sql 일 경우는 @drop_table
이
런 식으로 실행한다 )

테이블이 일괄 드롭되나 몇개 테이블들은 Referencial Integrity 에러를 내면서 드롭되지 않는다. 이런 경우는 수동으로 drop
하면 
된다

@drop 으로 테이블을 드롭하였으면

select table_name from tabs;

문을 실행하여 남아있는 테이블들을 확인한 후 

drop table 테이블명;

구문을 실행하여 모두 삭제한다.

테이블이 모두 drop 되면 위에서 언급한 imp 명령어를 실행해서 임포트 작업을 진행한다.