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!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습 끝
'Oracle > Oracle - 백업&복구' 카테고리의 다른 글
백업&복구 19 - DB Link (2) | 2012.02.15 |
---|---|
백업&복구 18 - Clone DB : DB 무정지 상태에서의 복구 (2) | 2012.02.15 |
백업&복구 16 - export / import (1) | 2012.02.13 |
백업&복구 15.3 - Redo log file 장애 유형5~11 : Current 인경우 (0) | 2012.02.10 |
백업&복구 15.2 - Redo log file 장애 유형1~4 : Current 아닌경우 (0) | 2012.02.10 |