- 출처: 의외로 모르는 Export/Import의 기초
- 11g Utility
- expdp/impdp help 내용 정리하기 전에 도움이 될 것 같아서 정리해본다.
사용 방법
Data Pump는, 대량의 데이터를 다루는 큰 작업(Job) 용도
- Data Pump에서는, Master Table을 생성하기 위한 Overhead에 의해 작은 작업은 늦어지지만, 대량의 데이터를 고속으로 처리하는 것은 중/대규모 작업에서 가장 큰 메리트이다.
# 디렉토리 오브젝트 생성
SQL> CREATE DIRECTORY DPUMP_DIR1 AS 'home/oracle/oradata/dpump_dir';
SQL> GRANT READ, WRITE ON DIRECTORY dpump_dir1 TO scott; -- 권한 부여
COMMAND> expdp scott/tiger tables=emp,dept directory=dpump_dir1
DATA_PUMP_DIR
, 혹은 Directory Object DATA_PUMP_DIR
가 참조된다.# 환경변수의 설정
COMMAND> set DATA_PUMP_DIR=DPUMP_DIR1; export DATA_PUMP_DIR
COMMAND> expdp scott/tiger schemas=scott
모드 | 기능 설명 | 파라미터 |
---|---|---|
전체(Full) | 데이터베이스 전체를 내보내기 | FULL=y |
스키마(Schema) | 지정된 스키마 전체를 내보내기 | SCHEMAS=schema[, …] |
테이블(Table) | 지정된 테이블 전체를 내보내기 | TABLES=table[, …] |
테이블스페이스(Tablespace) | 지정된 테이블스페이스 전체를 내보내기 | TABLESPACES=tablespace[, …] |
ex1> expdp scott/tiger full=y <<------- full mode
ex2> expdp scott/tiger dumpfile=exp.dmp tables=emp,dept <<------- table모드
필터 처리를 수행하고, export의 대상이 되는 object를 세밀하게 설정이 가능하다.
INCLUDE/EXCLUDE 파라미터는 동시에 지정할 수 없다.
export 대상 object를 include 파라미터로 지정한다.
COMMAND> expdp scott/tiger include=table
COMMAND> expdp scott/tiger include=index
expdp scott/tiger exclude=index:"LIKE 'EMP%'"
공백 등을 구분자로 하지 않도록
"
이 필요하지만, OS에 따라서 escape 문자가 필요하게 된다. 따라서 통상적으론 parameter를 기술한 파일에서 읽는 것이 편리하다.
COMMAND > cat parfile.txt
FLASHBACK_TIME="TO_TIMESTAMP('2004/03/20 10:00','YYYY/MM/DD HH:MI')"
COMMAND > expdp scott/tiger parfile=parfile.txt
COMMAND > expdp scott/tiger flashback_scn=364909
---> scn 번호 기준으로 데이터를 내보내는 명령어
# 병렬도의 지정
COMMAND > expdp scott/tiger parallel=3 dumpfile=dpump_dir1:expdat%U.dmp,
dpump_dir2%U.dmp
--- %U(치환변수)를 지정하지 않는 경우, dumpfile 파일 수는 parallel 수에 맞출 필요가 있다.
--- 지정되어 있는 경우, 지정된 파일이 round robin으로 사용된다.
COMMAND > ls –lR
dpump_dir1: --- 생성된 dump file set 확인
…….expdat01.dmp
…….expdat02.dmp
dpump_dir2:
…….expdat01.dmp
BLOCKS 모드
--- 블록 사이즈에 오브젝트의 블록 수를 곱해 예상한다. (정확도는 높지 않음)STATISTICS 모드
--- 기존의 통계정보를 기반으로 크기를 추정한다. DBMS_STATS에서 수집한 정보를 활용한다. 일반적으로 STATISTICS 방식이 더 정확하다.# 덤프 파일을 생성하지 않고 크기만 출력: ESTIMATE_ONLY=y를 지정한다.
COMMAND> expdp scott/tiger tables=emp,dept estimate=blocks
estimate_only=y
COMMAND> impdp scott/tiger tables=emp,dept -- dumpfile로부터 emp 테이블과 dept 테이블만을 import
COMMAND> impdp scott/tiger include=index -- dumpfile로부터 index만 import
참고: export의 네트워크 링크 지정은, 원격 데이터베이스의 데이터를 로컬로 export하는 기능이다. import 경우에는 직접 로컬 데이터베이스에 쓰므로, dumpfile을 생성하지 않는다.
expdp 명령에서 NETWORK_LINK를 사용하면 원격 데이터베이스의 데이터를 로컬 시스템에 export(내보내기)하는 작업을 수행할 수 있다.
예를 들어, 원격 데이터베이스에서 데이터를 추출하여 로컬 데이터베이스의 dump 파일로 저장하는 방식
이때 dump 파일이 로컬에 저장되며, 네트워크를 통해 원격 데이터베이스와 연결하여 데이터를 가져온다.
expdp scott/tiger network_link=remote_db_link directory=DATA_PUMP_DIR dumpfile=remote_data.dmp
impdp 명령에서 NETWORK_LINK를 사용하면 원격 데이터베이스의 데이터를 직접 로컬 데이터베이스로 가져오는(import) 작업을 할 수 있다. 이때 dump 파일을 생성하지 않는다.
원격 데이터베이스에서 직접 데이터를 로컬 데이터베이스로 삽입하므로, 중간에 dump 파일을 생성할 필요가 없습니다.
impdp scott/tiger network_link=remote_db_link directory=DATA_PUMP_DIR tables=emp
위의 예시는 원격 데이터베이스에서 emp 테이블을 로컬 데이터베이스로 직접 가져오는(import) 작업을 수행하는 명령어
즉, 원격 데이터베이스의 데이터를 로컬에 덤프 파일로 저장한다.
외래 키 제약조건을 일시적으로 비활성화 한 후, 데이터만 import한 후 다시 활성화한다.
COMMAND> expdp system/manager ;
SQL> alter table emp disable constraint emp_no_fk ; -- 관련된 모든 외래 키 제약조건을 disable로 설정
COMMAND> impdp system/manager ;
SQL> alter table emp enable constraints emp_no_fk ; -- 관련된 모든 외래 키 제약조건을 enable로 설정
command> impdp system/manager remap_schema=oradirect:dummy
SQL> insert into oradirect.emp select * from dummy.emp where emp_id=100;
SQL> drop table dummy.emp
- 주의: export한 시점의 데이터와 삭제한 데이터가 일치하는지는 불명확하기 때문에, 이 예시의 경우 emp_id=100의 데이터에 관해 export할 때랑 실수해서 삭제한 시점이 동일했다는 것을 전제로 한다.
기본값: 데이터는 최대 사이즈에 도달할 때까지 1개 파일로 쓰여진다.
용도: FILESIZE 파라미터값(BYTE제한)을 지정하면, EXPORT utility 에 의해 각각의 덤프파일에 지정한 byte값만을 쓰게 된다.
예) exp scott/tiger TABLES=emp FILESIZE=2048👉KB, MB, GB를 붙여 지정할 수도 있다.
FILESIZE=5MB를 지정한 경우
예: 직종이 SALESMAN, 급여가 1600보다 적은 종업원만을 export할 경우
exp scott/tiger TABLES=emp QUERY="WHERE job='SALESMAN' and sal <1600"
impdp scott/tiger TABLES=(wendy.emp) 👉SQLFILE='index.txt'
주의
- password는 SQL File에 포함되지 않는 점에 주의할 것
- 예를 들면, (CREATE USER 등) 실행한 ddl에 connect 문이 포함되어 있는 경우,
- 그 문장은 주석처리 되어, schema 명만 표시된다.
TEST_TABLE테이블을 import할 때 SQLFILE을 사용하는 경우
impdp oradirect/oradirect dumpfile=test_table.dmp tables=test_table 👉sqlfile=sqlfile.txt
COMPRESSION={ALL|DATA_ONLY|METADATA_ONLY|NONE}
여기서부터는 Advanced Compression 필수
스키마를 지정하고, 메타데이터, 데이터와 같이 압축해서 덤프 파일 scott.dmp로 export
- expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp COMPRESSION=ALL SCHEMAS=scott
ENCRYPTION = {ALL | DATA_ONLY | ENCRYPTED_COLUMNS_ONLY | METADATA_ONLY| NONE}
Dump File에서 데이터만 암호화되는 export 구문
$ expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott_enc.dmp SCHEMAS=scott ENCRYPTION=data_only ENCRYPTION_PASSWORD=tiger