exp 단점
① 시간 예측 불가
 
ex) no archive모드에서 DB끄지 않고 백업받는 법 : exp full=yes 밖에 없다.
    <0214>:24:00:00 → 04:00:00:00 → 04:30:00:00 → 05:00:00:00 → 05:30 ~~~
 
② 일시 정지 불가 : 중간에 끝내면 취소됨
 
③ 속도 저속


 
↓ 개선
 

Datapump
 
장점
① 시간 예측 가능
② 일시 정지 가능
③ 속도 고속
   : exp와 비교해서 20배 이상정도 빠름
 
단점
① 10g 이상 사용가능
② exp와 호환안됨
   : exp로 백업한 자료는 imp로, expdp로 백업한 자료는 impdp로 해야한다. exp로 한것 impdp로 불가능.


 



 

※ 명령어 비교
export/import
  = exp  :  imp

datapump
  = expdp : impdp

 
  
 

expdp 실행 모드
1. full 모드
2. schema 모드 - 특정 사용자
3. tablespace 모드 - tablespaces 파라미터
4. table 모드


 

 

Attach 모드 옵션
Add_file : 덤프파일을 추가할 때 사용한다
Exit : Job 의 작업에서 빠져나간다
Kill_job : 해당 작업을 완전히 삭제한다
Parallel : 현재 작업중인 프로세스의 개수를 조정
Start_job : 중단된 작업을 다시 시작할 때 사용한다
Status : 현재 작업상태를 모니터링하는 갱신 시간을 지정합니다.
Stop_job : 현재 작업을 중단 한다.


 
 
 
 

※ 참고
imp전 사전작업
① T/S생성 - 구 DB와 동일
② Temp T/S 생성
③ 사용자 생성
 
해놓고 exp/imp 하기.


 
 
 



impdp 관련 파라미터
○ Include
  : Import 원하는 테이블만
  - Include=object_name:\"\=\'조건\'\"
    Ex. SQL> impdp scott/tiger directory=datapump dumpfile=scott05.dmp include=table:\"\=\'emp\'\"
        → emp테이블만 impdp해라.
 
○ Exclude
  : 특정 테이블만 빼고 impdp 하려고 할때 사용
  - 사용법은 include와 동일
 
○ Table_exists_action
  - skip : 같은 테이블을 만나면 건너뛰고 다음 테이블을 impdp 한다.
  - append : 같은 테이블을 만나면 기존 내용에 데이터를 추가 한다.
             Cf. exp는 무조건 append 이다.
  - truncate : 같은 테이블을 만나면 기존 테이블을 truncate 하고 새로 impdp 한다.
  - drop : 기존 테이블을 drop 하고 테이블을 새로 만들어서 새로운 내용을 impdpd 한다.
 
○ Remap_schema
  : Scott user로 expdp 받은테이블을 다른 유저로 impdp 할때 사용함
  - remap_schema=scott:hr
 
○ Remap_tablespace
  : 기존 테이블스페이스에서 다른 테이블스페이스로 테이블을 impdp 시킬때 사용
  - Remap_tablespace='users':'example'
    Cf. 테이블 스페이스 이동시키기
        ※ 하고나서 주의사항 : 인덱스까지 재생성 or Rebuild
           이유 : 테이블 스페이스가 바뀌었기 때문에(인덱스안의 RowID에는 테이블스페이스번호 맨앞부분에 포함되어있음)
           Ex. SQL> Alter table hr.employees move tablespace data1;
 
2012/01/26 - [Study/Oracle - Admin] - admin 17 - DATA 관리 - table, column : 리오그 부분 참조



 
 



 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-사전 환경설정 시작
 
Datapump는 export/import와 다르게 유티리티가 직접 OS 파일에 I/O를 할수 없다.
→ 미리 디렉토리가 만들어져 있어야 하며, datapump를 수행하는 사용자는 그 디렉토리에 접근할 수 있는 권한이 있어야 한다.
 : 이 기능으로 DBA는 datapump의 보안관리까지 가능.
 
 
$ mkdir /data/datapump
$ sqlplus / as sysdba;
 
SQL> create or replace directory datapump as '/data/datapump';
 : 형식 -> create (or replace생략가능) directory 오라클용디렉토리이름 as 'OS디렉토리이름-실제로데이터들어가는곳';
 
SQL> grant read,write on directory datapump to scott;
 : 형식 -> grant read,write on directory 위에서지정해준오라클용디렉토리이름 to 유저이름;
   모든유저에게 권한 주고 싶으면 to public;
 
SQL> grant create any directory to scott;
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-사전 환경설정 끝
 
 





 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습 시작
 
실습 1: scott 계정의 emp,dept 테이블만 백업 받기
 
$ expdp scott/tiger tables=emp,dept directory=datapump job_name=t1 dumpfile=emp_dept
 
 
 
 
실습 2: scott schema 전부 백업 받기
 
$ expdp scott/tiger schemas=scott directory=datapump dumpfile=scott01.dmp
 
 
 
 
실습 3: DB 전체 백업 받기
 
$ expdp system/oracle full=y directory=datapump dumpfile=full01.dmp job_name=a
 
 
 
실습 4: 일시 중단 후 다시 작업하기
 : expdp를 수행중 서버 부하를 많이 줘서 일시 중단후 이어서 다시 작업하는 경우
 
$ expdp system/oracle full=y directory=datapump dumpfile=full02.dmp job_name=a
 
중간에 Ctrl+C 를 눌러서 취소
Export> status ← 현재 상황 보기
Export> stop_job ← 일시 중단 시킴
 
 
현재 작업중인 jobs 검색
col owner_name for a10
col job_name for a10
col operation for a10
col job_mode for a10
col state for a20
SQL> select owner_name, job_name, operation, job_mode, state from dba_datapump_jobs;
 
 
$ expdp system/oracle attach=system.a  ← 일시 중단된 작업에 다시 접속
 
Export> status ← 현재 상황 보기
Export> start_job ← 작업재개
Export> exit ← 나가더라도, 작업은 백그라운드로 계속 돌아간다.
 
 
 
실습 5: 비정상적으로 종료된 job 취소하기

---사전설정-----
$ mkdir /data/dp1
$ mkdir /data/dp2
$ mkdir /data/dp3
$ mkdir /data/dp4
$ sqlplus / as sysdba;
 
SQL> create directory dp1 as '/data/dp1';
SQL> create directory dp2 as '/data/dp2';
SQL> create directory dp3 as '/data/dp3';
SQL> create directory dp4 as '/data/dp4';
 
SQL> grant read,write on directory dp1 to scott;
SQL> grant read,write on directory dp2 to scott;
SQL> grant read,write on directory dp3 to scott;
SQL> grant read,write on directory dp4 to scott;
----------------
 
① Datapump 수행 중 비정상 종료
$ expdp system/oracle full=y directory=dp1 dumpfile=full01.dmp job_name=dp1
Ctrl + c 눌러서 작업 정지
Export> stop
 
$ expdp system/oracle full=y directory=dp2 dumpfile=full02.dmp job_name=dp2
Ctrl + c 눌러서 작업 정지
Export> stop
 
$ expdp system/oracle full=y directory=dp3 dumpfile=full03.dmp job_name=dp3
Ctrl + c 눌러서 작업 정지
Export> stop
 
 
② 현재 작업중인 jobs 검색
col owner_name for a10
col job_name for a10
col operation for a10
col job_mode for a10
col state for a20
SQL> select owner_name, job_name, operation, job_mode, state from dba_datapump_jobs;
 
 
③ 파일 수동 삭제
$ rm -fr /data/dp1/*
$ rm -fr /data/dp2/*
$ rm -fr /data/dp3/*
 
 
④ 중지되었던 job에 다시 접속 시도 - 에러발생
 
$ expdp system/oracle attach=dp1
$ expdp system/oracle attach=dp2
$ expdp system/oracle attach=dp3
 
 
⑤ 위 문제의 정보를 가진 마스터 테이블 확인 후 삭제
 
col owner.object for a15
SQL> select o.status, o.object_id, o.object_type, o.owner||',||object_name "OWNER.OBJECT"
  2  from dba_objects o, dba_datapump_jobs j
  3  where o.owner=j.owner_name
  4  and o.object_name=j.job_name
  5  and j.job_name not like 'BIN$%'
  6 order by 4,2;
 
 
SQL> drop table system.dp1;
SQL> drop table system.dp2;
SQL> drop table system.dp3;
 
SQL> select owner_name, job_name, operation, job_mode, state from dba_datapump_jobs;
모두 삭제되어 있음.
 
 
 

실습 6: 여러 사용자의 테이블 한꺼번에 expdp 받기

$ expdp system/oracle directory=datapump dumpfile=scott15.dmp tables=scott.emp, dpuser.tt01
기존의export에서 쓰던 방법으로느 에러
▶ 각각의 사용자 별로 따로 expdp작업을 수행
 
 

 
실습 7: 병렬 expdp 작업 하기
 
$ expdp system/oracle full=y directory=datapump dumpfile=full04.dmp job_name=4 parallel=4
 
$ top
띄우고 -c
 
 

실습 8: 파일 위치 다르게 병렬로 expdp 작업하기
DATADIR1~4 디렉토리 생성.
 
$ expdp system/oracle full=y parallel=4 \
        dumpfile=DATADIR1:full1%U.dat, \
        dumpfile=DATADIR2:full2%U.dat, \
        dumpfile=DATADIR3:full3%U.dat, \
        dumpfile=DATADIR4:full4%U.dat, \
        filesize=100M
 
 
 
실습 9: 파라미터 파일 사용해서 expdp 수행 - 여러개의 파일로 분할 expdp
 
$ vi expdp_pump.par
userid=system/oracle
directory=datapump
job_name=datapump
logfile=expdp.log
dumpfile=expdp_%U.dmp
filesize=100M
full=y
:wq!
 
$ expdp parfile=expdp_pump.par
 
 
 
 
실습 10: 파라미터파일 이용해서 scott.test 테이블 impdp 작업하기

$ vi expdp_pump.par
userid=scott/tiger
directory=datapump
job_name=datapump
logfile=impdp_expdp.log
dumpfile=expdp_%U.dmp
table=test
table_exists_action=append
:wq!
 
 
$ impdp parfile=impdp.par
 
 
 
실습 11: Impdp 병렬 작업하기
 
$ impdp system/manager parallel=4 \
        dumpfile = DATADIR1:full1%U.dat, \
        dumpfile = DATADIR2:full2%U.dat, \
        dumpfile = DATADIR3:full3%U.dat, \
        dumpfile = DATADIR4:full4%U.dat, \
        table_exists_action=append
 
 
 
 
실습 12: Import 수행하지 않고 DDL 문장만 추출하기
 
$ impdp system/oracle directory=datapump dumpfile=expdp_%U.dmp sqlfile=datapump.dat
 
 
 
실습 13:  작업 예상 시간 추출하기
 
SQL> select sid, serial#, sofar, totalwork from v$session_longops where opname='DATAPUMP2' and sofar !=totalwork;
 
 
 
실습 14: 데이터 펌프 재 설치하기 (10.2 이상 버전)
 
① SQL> @$ORACLE_HOME/rdbms/admin/catdph.sql
② SQL> @$ORACLE_HOME/rdbms/admin/prvtdtde.plb
③ SQL> @$ORACLE_HOME/rdbms/admin/catdpb.sql
④ SQL> @$ORACLE_HOME/rdbms/admin/dbmspump
⑤ SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql
 
 
 
실습 15: 데이터 펌프 수행시 암호화 작업 (11g 새 기술)
 
$ expdp system/oracle full=y directory=datapump dumpfile=full04.dmp job_name=abc ENCRYPTION=data_only ENCRYPTION_PASSWORD=epasswd
 
※ ENCRYTION 뒤에 올수 있는 값
  - ALL : 모든 데이터와 메타 데이터를 암호화 한다.
  - DATA_ONLY : 덤프 파일에 저장될 데이터만 암호화 한다.
  - ENCRYPTED_COLUMNS_ONLY : 특정 컬럼만 암호화 한다.
  - METADATA_ONLY : 메타 데이터만 암호화 한다.
  - NONE : 암호화를 사용하지 않는다. 기본값이다.
 
 
 
실습 16: 일자 별 schema 별로 자동 백업 받는 스크립트
 : AS-IS 서버에서 모든 schema 별로 datapump를 수행해서 To-Be 서버로 옮길때, schema가 너무 많은 경우 힘들다.
 : 특정 백업 디렉토리(ex. /data/backup/expdp) 아래에 백업을 수행하는 년-월-일-시간 형식의 디렉토리를 자동생성
 : 그 아래에 Schema 별로 dmp 파일과 log 파일을 생성
 : 많은 옵션 중에서 기본 옵션만 주고 만들어져있으니 필요 옵션 수정해서 사용
 
$ vi expdp_script.sh
export LANG=C
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10g
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb
 
sqlplus /nolog << EOF3
conn / as sysdba
set head off
set time off
set timing off
set feedback off
set echo off
set line 200
col name for a100
spool /home/oracle/expdp.tmp
select '!mkdir -p /data/backup/expdp/'||to_char(sysdate,'YYYY_MM_DD_HH24') from dual;
select 'create or replace directory datapump_'||to_char(sysdate,'YYYY_MM_DD_HH24')||' as '||""||' /data/backup/expdp/'||to_char(sysdate,'YYYY_MM_DD_HH24')||''''||';' from daul;
select distinct 'grant read, write on directory '||' datapump_'||to_char(sysdate,'YYYY_MM_DD_HH24')||' to '|| lower(owner) from dba_tables where owner not in ('SYS','DBSNMP','WMSYS','IX','SYSTEM','OE','PM','EXFSYS','OLAPSYS','MDSYS','SYSMAN','LOADER','XDB','ORDSYS',
'OUTLN','TSMSYS','DMSYS','CTXSYS');
select distinct '!expdp system/oracle'||' schemas='||lower(owner)||' job_name='||lower(owner)||'_datapump_'||to_char(sysdate,'YYYY_MM_DD_HH24')||' directory=datapump_'||to_char(sysdate,'YYYY_MM_DD_HH24')||' dumpfile='||lower(owner)||'_%U.dmp'||' logfile='||lower(owner)||'.log'||' filesize=100m' from dba_tables where owner not in('SYS','DBSNMP','WMSYS','IX','SYSTEM','OE','PM','EXFSYS','OLAPSYS','MDSYS','SYSMAN','LOADER','XDB',
'ORDSYS','OUTLN','TSMSYS','DMSYS','CTXSYS');
spool off
!cat /home/oracle/expdp.tmp|grep -v SQL|grep -v SYS>/home/oracle/expdp.sh
@/home/oracle/expdp.sh
exit
EOF3
 
:wq!
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습 끝
 
Posted by 딩구르
,