Export & Import Database in Oracle
OracleのExport/Import Utility를 이용하여 데이터를 export/import하는 방법을 소개한다.
Export Utility
Export명령의 syntax는 다음과 같다.
exp 사용자ID/암호@오라클인스턴스명 file=백업할 파일명 indexes=yes grants=yes constraints=yes
Export 단위는 사용자 혹은 테이블 단위가 되며 tables 옵션을 생략한 경우 default 로 사용자 단위 export 를 수행한다.
사용할 수 있는 옵션에는 다음과 같은 것들이 있다.
option | 내용 | 비고 |
---|---|---|
-userid | EXPORT를 실행시키고 있는 username/password명. | |
-buffer | 데이터 행들을 가져오는데 사용되는 버퍼의 크기. | |
-file | 생성되는 EXPORT덤프 파일명. | |
-filesize | EXPORT덤프 파일의 최대 크기 | |
-grants | 데이터베이스 객체에 대한 권한 정보의 EXPORT여부 (Y/N 플래그) | |
-indexes | 테이블에 대한 INDEXES의 EXPORT여부 (Y/N 플래그) | |
-rows | 행들에 대한 EXPORT여부. (Y/N 플래그) | 만약 “no”이면 데이터는 EXPORT되지않고 테이블의 정의만 EXPORT |
-constraints | 테이블에 대한 제약조건 정보의 EXPORT여부 (Y/N 플래그) | |
-compress | IMPORT에 대비하여 테이블의 데이터를 한 extent로 압축 할것인가의 여부(Y/N 플래그) | |
-full | 전체 데이터베이스를 EXPORT할것인가의 여부 (Full Level Export) (Y/N 플래그) | |
-owner | EXPORT될 데이터베이스의 소유자명 (User Level Export)[owner=user] | |
-tables | export될 테이블의 리스트(Table Level Export) [tables=(table1, table2, …)] | |
-statistics | 통계정보의 생성유무(estimate/none) | warning을 무시할경우 none |
Import Utility
Import명령어의 Syntax는 다음과 같다
imp userid="오라클사용자명/암호@인스턴스명" file='덤프파일이름' fromuser=익스포트한사용자ID touser=임포트할ID
사용할 수 있는 옵션에는 다음과 같은 것들이 있다.
option | 내용 | 비고 |
---|---|---|
-userid | IMPORT를 실생시키는 계정의 username/password명 | |
-buffer | 데이터를 행들을 가져오는데 사용되는 buffer의 bytes수 | |
-file | IMPORT될 EXPORT 덤프 파일명 | |
-show | 파일 내용이 화면에 표시되어야 할 것인가를 나타냄(Y/N 플래그) | |
-ignore | IMPORT중 CREATE명령을 실행할 때 만나게 되는 에러들을 무시할 것인지 결정(Y/N 플래그) | |
-indexes | 테이블 INDEX의 IMPORT여부(Y/N 플래그) | |
-rows | 테이블 데이터를 IMPORT할 것인가(Y/N 플래그) | 만약 “N”로 설정하면 데이터베이스 객체들에 대한 DDL만이 실행 |
-full | FULL엑스포트 덤프 파일이 IMPORT 할때 사용 | |
-tables | IMPORT될 테이블 리스트 | |
-commit | 배열(배열의 크기는 BUFFER에 의해 설정됩니다) 단위로 COMMIT을 할것인가 결정 | 기본적으로는 테이블 단위로 COMMIT |
-fromuser | EXPORT덤프 파일로 부터 읽혀져야 하는 객체들을 갖고 있는 테이터베이스 계정 | |
-touser | EXPORT덤프 안에 있는 객체들이 IMPORT될 데이터베이스 계정 |
Import 작업은 Export 에 비해 데이터베이스 상황에 따라서 에러 발생 소지가 굉장히 많은 작업이다. 주로 에러는 Export 보다Import 시 많이 발생한다.
에러의 패턴은 주로
- 익스포트할 사용자와 임포트할 사용자의 ID가 틀린 경우
- 익스포트한 객체들의 테이블 스페이스와 임포트할 테이블 스페이스 이름이 다른 경우
- 임포트할 테이블스페이스 스토리지 옵션과 덤프할 데이터가 맞지 않은 경우 ( 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 명령어를 실행해서 임포트 작업을 진행한다.