oracle data pump는 oracle 10g(이하 10g)부터 지원되는 data export, import 도구로 oracle DB를 백업하거나 복구 혹은 다른 서버로의 이전에 사용된다. 또한 기존 export, import 도구(exp, imp)와 비교하여 속도나 효율면에서 더 향상되었다 한다. data pump에 대한 상세한 내용은 오라클 기술 문서를 검색해보거나 검색 엔진에서 조금만 검색해봐도 쉽게 찾을 수 있다.


본 글에서는 data pump를 상세하게 파헤치는것 보다는 필자의 경험과 사례 중심으로 기술하고자 한다. 우선 필자의 경우 oracle 11g(이하 11g)에서 특정 user(db)를 10g로 옮기되 user(db)명 및 table space를 변경하고 싶었다.


11g에서 해당 db를 exp로 백업을 받은 후 10g로 imp를 시도하고 나서야 exp는 다른 버전간 특히 상위 버전에서 하위버전으로는 지원하지 않는 다는 것을 알았다.  그래서 expdp(data pump)를 이용하기로 했다.


우선 data pump를 사용하기 위해서는 directory를 생성해야 한다. directory는 sqlplus나 db client 도구를 이용하여 sysdba 유저로 directory를 생성한다. directory 생성에 앞서 미리 물리구조를 만들어 놓는다.  물리구조는 windows 나 unix/linux 각 형식대로 만들고 기술하면 된다. (특별한 언급이 없는 한 모든 작업은 cmd 창 또는 터미널로 한다)


cmd창에서 '>sqlplus "/as sysdba" 명령어를 입력하여 db에 로그인 해보자. 로그인한 후 아래와 같이 directory를 생성한다.


CREATE DIRECTORY directory_name AS '물리구조';  (예: create directory dump as 'c:\temp'; )


생성되었으면 아래와 같이 조회해 보자. 생성한 directory가 보일것이다.


select * from dba_directories;


자 이제 datapump expdp의 반은 다 된셈이다. 반만 남았다. expdp를 명령어 프롬프트(cmd)에서 실행해보자. 


EXPDP 유저/비번 DUMPFILE=export_target_db.dmp DIRECTORY=dump  SCHEMAS=export_target_user VERSION=10.x.0.x.0 LOGFILE=explog.log

  • expdp : export datapump 명령어

  • 유저/비번 : system 계정을 사용하거나 자신의 db를 백업할 경우 tnsname도 기술해야 한다. (expdp 유저/비번@tnsname ... )
  • dumpfile : 백업 받고자 하는 파일명 지정한 directory의 물리위치에 dump 파일이 생성된다.
  • directory : expdp 파일이 저장될 directory 명
  • schemas : 백업대상 db이다.  또는 대신 full=y는 전체 DB를 백업한다는 의미이다. (system이 아닌 특정유저의 db를 백업하는 경우 생략해도 괜찮다) 
  • version : 동일하거나 상위 버전으로 복구한다면 생략해도 되지만 하위버전으로 복구하거나 이전한다면 반드시 해당 버전으로 지정해야 한다. 필자는 11g에서 expdp를 실행했으며 dump를 10g에서 impdp 할 예정이므로 10g의 상세버전을 지정한다.
  • logfile : expdp의 로그를 기록한다. 지정된 directory에 생성된다.


백업이 잘되었다면 물리구조 경로에 백업된 *.dmp 파일과 log 파일이 보일것이다. 제일먼저 log 파일을 열어 내용을 확인해보자. 에러가 없다면 잘 된것이다.


추가로 expdp 시 특정 스키마(테이블)를 제외하고 dump를 실행하는 옵션을 설명한다.


EXCLUDE=TABLE:\"IN \(\'TABLE_1\', \'TABLE_2\',,,, \'TABLE_n\'\)\"


또 특정 스키마 추가시에는 INCLUDE를 사용하면 되겠다.


다음으로 impdp를 설명할 것이다. 필자는 11g에서 백업한 db를 10g에 다른 이름의 db로 이전할 것이다. 10g에도 가능하면 동일한 위치, 동일한 이름으로 directory를 생성하자. 11g에서 expdp한 파일을 10g의 directory의 물리 위치(c:\temp)로 옮겨놓고 10g에 tablespace와 user를 생성하자. oracle에 db를 생성하는 것은 user와 tablespace를 만들고 스키마 및 데이터 등을 넣어주는 것이라 할 수 있다.


자 다음의 순서대로 cmd에서 sqlplus로 10g에 접속하여 순서대로 user와 tablespace를 생성해보자.


- 테이블스페이스 생성

CREATE TABLESPACE tablespace_name

DATAFILE 'C:\oracle\product\10.2.0\oradata\xxxx\xxxx.DBF'

SIZE 300M

AUTOEXTEND ON NEXT 50M;

※ DATAFILE의 물리위치는 시스템마다 다를 수 있으며 tablespace의 구성을 비롯하여 물리파일명은 사용자가 원하는 것을 사용한다.


- 유저생성 및 테이블스페이스 지정

CREATE USER 새로운_유저 IDENTIFIED BY 비밀번호

DEFAULT TABLESPACE 새로생성한_tablespace명

QUOTA UNLIMITED ON 새로생성한_tablespace명;


- 권한부여

GRANT CONNECT, RESOURCE TO 새로운_유저;

GRANT UNLIMITED TABLESPACE TO 새로운_유저;


이제 data를 복구(이전)할 준비가 끝났다.  아래와 같이 impdp를 명령어 프롬프트(cmd)에서 실행해보자.


IMPDP system/비밀번호 DIRECTORY=dump DUMPFILE=import_target_db.dmp REMAP_SCHEMA=11g_user_name:10g_new_user_name  REMAP_TABLESPACE=11g_user_name_d:10g_new_user_name_d LOGFILE=impdp.log


  • impdp : import datapump 명령어

  • 유저/비번 : system 계정을 사용하거나 자신의 db를 복구할 경우 tnsname도 기술해야 한다. (impdp 유저/비번@tnsname ... )

  • directory : 복구에 사용되는 dump 파일이 위치하는 directory, 물리위치에 log파일이 생성된다.

  • dumpfile : 복구 dump 파일

  • remap_schema : dump 당시 schema에서 변경하고자 하는 schema 지정

  • remap_tablespace : dump 당시 tablespace에서 변경하고자 하는 tablespace 지정

  • logfile : impdp의 log 파일


심각한 오류 없이 imp가 무사히(?) 완료되면 directory 위치에 로그파일이 생성된다. 로그파일을 열어서 impdp를 확인한다.

간혹 schema에 table이나 index의 tablespace가 서로 다른 경우가 있다. 실제 db에 존재하는 tablespace라 실행에는 문제가 없었다 하더라도 import 시에는 존재하지 않는 tablespace이기 때문에 에러가 발생한다. 이러한 경우 tablespace를 변경해줘야 한다.

  • table : ALTER TABLE table_name MOVE TABLESPACE tablespace_name;
  • index : ALTER INDEX index_name REBUILD TABLESPACE tablespace_name; 

만약 import하고자하는 db가 동일한 schema 및 동일한 tablespace라 한다면 impdp는 다음과 같이 매우 간단해 질 수 있다.

IMPDP 유저/비번 DIRECTORY=dump DUMPFILE=import_target_db.dmp  LOGFILE=impdp.log

마찬가지로 impdp 종료 후 log를 확인해보자. 별다른 에러가 없다면 잘 된것이다.


Posted by Anfenee
,