Programming/Oracle

Oracle expdp/impdp(데이타펌프)

초록깨비 2022. 7. 15. 15:34
728x90

Datapump

10g부터는 Datapump를 사용해서 기존 보다 빠르게 작업을 할 수 있으나 

적은 양의 데이터를 이동시킬때는 Export와 Import 유틸리티를 이용하는게 더 빠름.

 

Datapump는 Directory 객체를 생성하여 사용하고(OS파일에 I/O 할 수 없슴)

export/import 작업을 진행하는 유저에게 해당 객체에 대해 읽기, 쓰기 권한을 부여 해야한다(필수!!!)

 

expdp :  디렉터리에 dmp 파일에 저장

impdp :  디렉터리에서 dmp 파일을 읽어 데이터베이스에 생성

 

 

◈ DATAPUMP 필요 권한

   .  create session

   ·  create table

   ·  create directory

   ·  read, write on directory

 

 DATAPUMP 장점

   . 필요한 디스크 공간 예측 : estimate 파라미터를 사용하여 필요한 디스크 공간 예측 가능 

       expdp system/password full=y estimate_only=y   : 디스크 공간 예측 

 

   . 원격지 DB에 작업 수행 가능 : db link를 통해 원격지 db에 expdp/impdp 수행 가능 

   . REMAPPING 기능 지원 : datafile, tablespace, 스키마 변경 가능 

     

 

 EXPDP 실행 모드

    . full  : DB 전체 export 

    . tablespace  

    . schema

    . table 

 

 DATAPUMP 설정 순서

    1)  소스/타겟 서버에 directory 생성 및 권한 부여   

          mkdir data/datapump

          chown -R oracle:dba /data/datapump 

          

           create directory DATAPUMP as '/data/datapump' ;

           grant read,write on directory DATAPUMP to scott;

           grant create any directory to scott; 

    2)  expdp 명령어로 dmp 파일 생성   

    3)  ftp로 타겟 서버로 dmp 파일 전송         

         - 타겟서버의 disk 용량 확인!!!용량이 부족하면 에러남!!!   

   4)  impdp 명령어로 dmp파일 내용 db에 적재 

         - permission에러나면 dmp 파일의 권한을 확인한다

           chown -R oracle:dba backup.dmp   : oracle이 해당 dump파일을 읽을 수 있게 

         - tablespace 사이즈 확인!!

 

 

 

[ DATAPUMP 설정 ]

1)  directory 조회

SELECT * FROM dba_directories;  

    . DATAPUMP : datapump를 위해 사용자가 만든 것

    . DATA_PUMP_DIR : 오라클 기본 directory 

                             (데이타펌프시 사용 안함->사용자 생성한 directory로 사용)

 

                       

                       설정 전 초기 화면

2) source/target 서버에 directory 생성

     2-1) unix 일때 

 

      ① 파일 디렉토리 생성 및 권한 부여

mkdir /data/datapump

  

      ② 폴더 권한 주기(권한을 oracle오너랑 그룹으로 맞춰준다) : chown으로

chown -R oracle:dba /data/datapump 

 

                       

      ③ 데이타펌프 alias 생성

 

         su - oracle : oracle로 접속 

 

        서버 하나에 DB가 여러개 생성되어 있으면 해당 DB로 접속(SID입력) : erpdbtest 

 

sqlplus / as sysdba ;

 

CREATE DIRECTORY DATAPUMP AS '/data/datapump';

     :  /data/datapump에 대한 alias 생성(DATAPUMP) 

     ④ expdp 할 유저에게 해당 디렉토리 접근권한 부여

          - scott user에 datapump 디렉토리에 접근할 수 있는 권한 설정

 

           grant read, write on directory datapump to scott( or public); 

 

 

          grant create any directory to scott ;   // scott가 directory 생성 권한 없을때 사용

 

    ⑤ datapump 디렉터리 생성 확인

 

 

   2-2) WINDOWS 서버일때 : DIRECTORY  생성 및 권한주기 

 

         CREATE DIRECTORY DATAPUMP AS 'E:\db_backup\datapump';

 

         GRANT READ, WRITE ON DIRECTORY DATAPUMP TO SYSTEM;

 

         GRANT CREATE ANY DIRECTORY TO SYSTEM;

 

 

3) EXPDP

 

  특정 테이블 expdb 할때

     expdp scott/tiger directory=DATAPUMP dumpfile=backup.dmp

              logfile=backup.log tables=emp,dept

 

  ② 유저별로 expdb 할때

     expdp system/password directory=DATAPUMP dumpfile=backup.dmp

               logfile=backup.log schemas=scott

 

  ③ Full로 받을 때

     expdp system/password directory=DATAPUMP dumpfile=backup.dmp

               logfile=backup.log job_name=backup full=y

 

  ④ 특정 사이즈로 받을때

     expdp system/password directory=DATAPUMP dumpfile=backup%U.dmp 

               logfile=backup.log job_name=backup full=y filesize=1g

  

  ⑤ EXCLUDE/INCLUDE 사용법

INCLUDE = object_type[:name_clause] [, ...]

      ※ 주의사항

          ▶ name_clause에 제공하는 이름은 데이터베이스의 기존 개체인 

              대소문자를 포함하여 정확히 일치해야 합니다

          ▶ exclude/include 옵션 사용시 모든 문자에 \(역슬래쉬)를 입력해야

              syntax 오류 발생하지 않음

     

      예제) 

          ◈ TABLE중 이름이 TB_%는 제외하고 EXPDP 하기(LIKE사용해서) 

                 expdp scott/tiger directory=DATAPUMP dumpfile=etc.dmp 

                            logfile=etc.log exclude=TABLE:\"LIKE \'TB_%\'\"

 

          ◈ 특정 TABLE은 제외하고 EXPDP 하기(IN사용해서)

                expdp scott/tiger directory=DATAPUMP dumpfile=etc.dmp 

                            logfile=etc.log  exclude=TABLE:\"IN\(\'DEPT\',\'EMPLOYEE\'\)\" 

 

          ◈  package, function, procedure만 expdp 하기 

                 expdp scott/tiger directory=DATAPUMP dumpfile=etc.dmp 

                            logfile=etc.log include=PACKAGE,FUNCTION,PROCEDURE  

 

 

   ⑥ QUERY조건 사용법

        TB_DATA 테이블의 YYMM <= '202112' 조건만 expdp 하기)       

              expdp scott/tiger directory=DATAPUMP  

                         dumpfile=etc.dmp logfile=etc.log

                         tables=TB_DATA query='TB_DATA:"where yymm <= '202112'"'

 

(full export 를 하기 위해서는 DATAPUMP_EXP_FULL_DATABASE 롤을 부여 받아야함)

 

▶ 옵션 설명

   . derectory : dmp파일이 저장되어여 있는 directory

   . logfile : 로그파일 저장 이름

   . full=y : db 전체 export  

   . tablespaces : 지정된 테이블스페이스에 저장된 object export

   . schemas : 지정된 user가 소유한 object export

   . tables : 지정된 테이블 export(여러개일 경우 콤마(,)로 구분) 

   . exclude : 작업에서 제외 될 object 종류와 이름을 지정

        exclude=table:\"=emp\'\"     : emp 테이블만 제외 

   . include : 작업에 포함 될 object 종류와 이름을 지정 

        include=table(object type):"dept"(object_name)  : dept 테이블만 포함(대소문자 주의) 

   . parfile : 파라미터를 미리 지정하여 저장후 참조해서 사용(확장자는 상관없음)

   . content=[all | data_only | metadata_only] 

             all : 테이블 데이타와 메타데이타 포함

             data_only : 테이블 데이타만 

             metadata_only : 메타 데이타만 

    . remap_tablespace :  타겟 서버에서 object가 저장될 테이블스페이스 변경 

                remap_tablespace='users':'temp'  

    . remap_schema : 타겟 서버 db에서 object user 변경

                remap_schema=scott:user1 

    . remap_datafile : 타겟 서버 db의 데이터파일 변경 

                remap_datafile= 'c:\user1.dbf':'c:\data\user2.dbf' 

    . estimate_only : 내보내기 수행하지 않고 작업 추정 

    . filesize : 덤프파일 크기 지정

    . flashback_scn : 세션 스냅 샷을 다시 설정 하는데 사용되는 scn

    . flashback_time : 지정된 시간과 가장 가까운 scn을 가져 오는데 사용

    . job_name : 작업 이름

    . network_link : 타켓 서버 db link 이름

                network_link=dept@db_link명  

    . parallel : 병렬 처리 프로세스 갯수 

    . query 

    . status : 작업시 갱신 내용을 status에 설정된 시간 간격으로 진행상태를 보여줌

    . transport_full_check : 테이블스페이스에 존재하는 테이블과 인덱스 의존성 검사 유무

          Y : 테이블과 인덱스가 동일한 테이블스페이스에 존재해야 함 

          N : 테이블과 인덱스가 다른 테이블스페이스에 존재 해야 함 

    .  attach : 중단된 작업에 다시 접속할때 사용

                attach scott/tiger job_name=backup

    . reuse_dumpfiles : 저장할 덤프파일이 있으면 덮어씀

                reuse_dumpfiles=Y 

 

 

 

  

▶ 작업 확인 쿼리

    select owner_name, job_name, operation, job_mode, state

      from dba_datapump_jobs ;

      

          . owner_name : 작업 계정

          . job_name : 작업 명칭 

          . job_mode : full, tablespace, table.. 

        . state =  executing  : 작업중

                     no rows selected : 작업완료

                     not running

                     undefined 

                     defining 

 

▶ 작업예상시간 조회 

    SELECT SID, SERIAL#, SOFAR, TOTALWORK
        FROM V$SESSION_LONGOPS
      WHERE OPNAME = 'job_name’(대문자로입력)
           AND SOFAR != TOTALWORK;  

 

 

 

4) IMPDP

    : expdp로 만든 dmp 파일을 타켓 서버의 /data/datapump(설정한 datapump directory)로 이동한다

-    datapump를 사용하려면 미리 directory가 만들어져 있어야하고 접근 할 수 있는 권한이 필요

 

 특정 테이블  

       impdp scott/tiger directory=DATAPUMP dumpfile=backup.DMP 

                 TABLE_EXISTS_ACTION=TRUNCATE logfile=backup.log tables=emp,dept

 

User별  

       impdp system/password directory=DATAPUMP dumpfile=backup.dmp 

                logfile=backup.log schemas=scott

Full  

      impdp system/password  directory=DATAPUMP dumpfile=backup.dmp 

                logfile=backup.log full=y

 

 

▶ 옵션 설명

       . table_exists_action  

              truncate : 동일한 이름의 테이블이 존재할 때 truncate 하고 import

              skip : 동일 테이블 존재시 skip

              append : 동일 테이블 존재시 데이터 추가

              drop : 기존 테이블 drop 후 새로만들어서 import 

       . remap_schema : import의 from_user, to_user와 동일 

              remap_schema=scott:scott  

       . remap_tablespace : 기존 users 테이블스페이스에서 example 테이블스페이스로 import 

              remap_tablespace='users':'example' 

       . remap_datafile : 기존 서버의 datafile에서 타겟 서버 db의 datafile로 매핑 

       . remap_table 

              remap_table=emp:employee 

         . include : 특정 object 나 테이블 포함 

         . exclude : 특정 object 나 테이블 제외

         . network_link 

         .  partition_options : 파티션 테이블을 단일테이블로 import

                    partition_option=merge 

         . data_options=skip_constraint_errors : 제약조건 위배에도 무시하고 진행 

 

 

 

▶ impdp시 에러 발생 대응 

1. ORA-31694: master table "SYS_IMPORT_FULL_01" failed to load/unload
   1) datapump로 export 하지 않았을때
   2) dmp파일을 ftp로 이동할때 binary로 지정하지 않았을때 
   3) dmp 파일 손상되었을때 -> expdp로 dmp 다시 생성 후 impdp 한다

 

2. ORA-31644 unable to position to block number string in dump file " string "
   Export or Import was unable to position its file pointer to a specific block within the dump file. 

   (내보내기 또는 가져오기에서 파일 포인터를 덤프 파일 내의 특정 블록에 배치할 수 없습니다)
   This message is usually followed by device messages from the operating system. 
   (이 메시지 다음에 일반적으로 운영 체제의 장치 메시지가 옵니다)

 

 ★ 처리방법

     expdp로 dmp 다시 생성 후 impdp 한다  

 

 

3. ORA-39001 : invalid argument value 

★ 처리방법

     권한 문제인줄 알았으나 dmp 파일이 정상적이지 않은 문제 였음

      expdp로 만든 dmp파일과 ftp로 올린 dmp 파일 사이즈 비교

          => 타겟 서버에 해당 파일이 저장될 폴더의 disk용량이 확보되어 있어야 함 

    

     용량 확보 되고도 위의 에러가 나면 파일을 읽을수 있는 권한을 확인해야 함 

     아래처럼 dmp파일이 system 그룹으로 되어 있으면 oracle이 읽을 수 없으므로

     해당 파일에 대해서 아래와 같이 작업 후 진행 한다

 

 

          chown -R oracle:dba swg_2207270.dmp  후에 다시 impdp  실행한다  

 

 

 

★ IMPDP 작업 중단(완전 삭제는 kill_job)

     CTRL + C를 눌러도 실제로 작업이 중단된것은 아님

     stop_job을 입력하여 작업을 중단 시킨다 => 재가동 하려면 start_job을 입력한다

 

 

system계정으로 impdp의 상태를 확인한다

 

★ IMPDP 실행중 삭제(kill_job)

     impdp scott/tiger attach=job명

     imp> kill_job 입력

 

         EX) impdp scott/tiger attach=SYS_IMPORT_TABLE_02

                imp>kill_job 

     

 

728x90