행위

"Oracle 데이터펌프 API활용"의 두 판 사이의 차이

DB CAFE

(파일 복사)
(IMPORT API)
 
(같은 사용자의 중간 판 27개는 보이지 않습니다)
1번째 줄: 1번째 줄:
== 스키마의 메타 동기화 ==
+
== EXPORT API ==
 +
=== 스키마 EXPORT ===
 
<source lang=sql>
 
<source lang=sql>
 
DECLARE
 
DECLARE
24번째 줄: 25번째 줄:
 
</source>
 
</source>
  
 
+
=== 테이블 EXPORT API ===
== 데이터펌프 EXPORT API ==
 
  
 
-- 1.테이블 DUMP EXPORT 스크립트  
 
-- 1.테이블 DUMP EXPORT 스크립트  
52번째 줄: 52번째 줄:
 
DBMS_DATAPUMP.START_JOB(hdnl);
 
DBMS_DATAPUMP.START_JOB(hdnl);
 
END;
 
END;
</source>
 
 
== 데이터펌프 IMPORT API ==
 
<source lang=sql>
 
DECLARE
 
dph NUMBER;
 
v_job_name VARCHAR(100) := 'IMP_JOB_TEST';
 
 
BEGIN
 
-- DB_LINK 이용
 
  dph := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA'  ,job_name => v_job_name, remote_link => 'db링크명');
 
 
-- 덤프파일 작업시 
 
--  dbms_datapump.add_file(handle => p_dph,
 
--                        filename => 'EXPIMP%U.DMP',
 
--                        directory => 'EXPIMP', filetype=>1);
 
-- 로그
 
 
  dbms_datapump.add_file(handle => dph,
 
                        filename => v_job_name||'.log',
 
                        directory => 'DATA_PUMP_DIR', filetype=>3);
 
 
-- 스키마 정보
 
DBMS_DATAPUMP.METADATA_FILTER(handle => dph ,
 
                              name  => 'SCHEMA_EXPR',
 
                              value  => ' IN (''MIG_BACKUP'')');
 
 
-- 테이블 존재시 TRUNCATE/REPLACE/APPEND 
 
  dbms_datapump.set_parameter(handle => dph,
 
                              name => 'TABLE_EXISTS_ACTION',
 
                              value =>'REPLACE');
 
 
-- 테이블 정보
 
DBMS_DATAPUMP.METADATA_FILTER(handle => dph
 
                            ,name  => 'NAME_EXPR'
 
                            ,value  => ' IN (''TB_TEST'')'
 
                            ,object_type => 'TABLE'
 
                            );
 
                           
 
  dbms_datapump.start_job(dph);
 
 
  dbms_datapump.detach(dph);
 
EXCEPTION
 
  WHEN OTHERS THEN
 
    dbms_output.put_line('Error:' || sqlerrm || ' on Job-ID:' || dph);
 
END;
 
/
 
</source>
 
 
=== 데이터펌프 IMPORT_개별TABLE복구 ===
 
<source lang=sql>
 
DECLARE
 
dph NUMBER;
 
v_job_name VARCHAR(100) := 'IMP_JOB_TABLE_RECOVERY';
 
 
BEGIN
 
-- DB_LINK 이용
 
  dph := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA'  ,job_name => v_job_name); -- , remote_link => 'db링크명'
 
 
-- 덤프파일 작업시 
 
  dbms_datapump.add_file(handle => dph,
 
                        filename => 'EXP_EMP_20200102_01.EXP',
 
                        directory => 'DATA_PUMP_DIR', filetype=>1);
 
-- 로그
 
 
  dbms_datapump.add_file(handle => dph,
 
                        filename => v_job_name||'.log',
 
                        directory => 'DATA_PUMP_DIR', filetype=>3);
 
 
-- 스키마 정보
 
DBMS_DATAPUMP.METADATA_FILTER(handle => dph ,
 
                              name  => 'SCHEMA_EXPR',
 
                              value  => ' IN (''EMP'')');
 
 
-- 테이블 존재시 TRUNCATE/REPLACE/APPEND 
 
  dbms_datapump.set_parameter(handle => dph,
 
                              name => 'TABLE_EXISTS_ACTION',
 
                              value =>'TRUNCATE');
 
 
-- 테이블 정보
 
DBMS_DATAPUMP.METADATA_FILTER(handle => dph
 
                            ,name  => 'NAME_EXPR'
 
                            ,value  => ' IN (''TB_TEST'')'
 
                            ,object_type => 'TABLE'
 
                            );
 
                           
 
  dbms_datapump.start_job(dph);
 
 
  dbms_datapump.detach(dph);
 
EXCEPTION
 
  WHEN OTHERS THEN
 
    dbms_output.put_line('Error:' || sqlerrm || ' on Job-ID:' || dph);
 
END;
 
/
 
 
</source>
 
</source>
  
173번째 줄: 79번째 줄:
  
 
== 파일 복사(ASM등) ==
 
== 파일 복사(ASM등) ==
 +
{{틀:타이틀 투명
 +
|제목= OS상의 파일복사 명령를 DB에서 직접 수행이 가능.
 
* DBMS_FILE_TRANSFER.COPY_FILE 패키지/함수
 
* DBMS_FILE_TRANSFER.COPY_FILE 패키지/함수
 
* 소스 디렉토리에서 파일을 읽고 대상 디렉토리에 복사  
 
* 소스 디렉토리에서 파일을 읽고 대상 디렉토리에 복사  
 +
* ASM 과 로컬 디스크간 복사
 
* 소스 및 대상 디렉토리는 로컬 파일 시스템에 있거나 ASM (Automatic Storage Management) 디스크 그룹에 있거나  
 
* 소스 및 대상 디렉토리는 로컬 파일 시스템에 있거나 ASM (Automatic Storage Management) 디스크 그룹에 있거나  
 
로컬 파일 시스템과 ASM간에 어느 방향 으로든 복사 할 수 있음.
 
로컬 파일 시스템과 ASM간에 어느 방향 으로든 복사 할 수 있음.
 +
}}
  
 
<source lang=sql>
 
<source lang=sql>
190번째 줄: 100번째 줄:
 
</source>
 
</source>
  
=== DB LINK를 이용한 파일 복사 ===
+
=== DB LINK를 이용한 파일 복사(밀어 넣기) ===
* DBMS_FILE_TRANSFER.PUT_FILE  패키지/함수  
+
{{틀:타이틀 투명
 +
|제목= DBMS_FILE_TRANSFER.PUT_FILE  패키지/함수  
 
* 소스 에서 프로시져 실행 해야 함.  
 
* 소스 에서 프로시져 실행 해야 함.  
 
* 소스 => 타겟으로 복사  
 
* 소스 => 타겟으로 복사  
 
* 로컬 파일 또는 ASM을 읽고 원격 데이터베이스에 접속하여 원격 파일 시스템에 파일 사본을 작성합니다.
 
* 로컬 파일 또는 ASM을 읽고 원격 데이터베이스에 접속하여 원격 파일 시스템에 파일 사본을 작성합니다.
 +
* DB링크 간의 DUMP파일 복사가 가능(.log파일은 복사 안됨,12c)
 +
}}
 
<source lang=sql>
 
<source lang=sql>
 
BEGIN
 
BEGIN
 
DBMS_FILE_TRANSFER.PUT_FILE(
 
DBMS_FILE_TRANSFER.PUT_FILE(
 +
source_directory_object      => 'DATA_PUMP_DIR',    -- 패키지 실행하는 DB
 +
source_file_name              => 'sample.dmp',      -- 패키지 실행하는 DIRECTORY의 덤프파일명
 +
destination_directory_object  => 'DATA_PUMP_DIR2',  -- DB링크 원격지 디렉토리
 +
destination_file_name        => 'sample_copied.dmp',-- DB링크 원격지에 저장될 파일명
 +
destination_database          => '디비링크명'
 +
);
 +
END;
 +
/
 +
</source>
 +
 +
=== 파일 복사(가져오기) ===
 +
{{틀:타이틀 투명
 +
|제목= DBMS_FILE_TRANSFER.GET_FILE
 +
* 원격 데이터베이스에 접속하여 원격 파일을 로컬 파일 시스템 또는 ASM에 파일 복사.
 +
* 절차가 성공적으로 완료 될 때까지 대상 파일이 닫히지 않음.
 +
}}
 +
<source lang=sql>
 +
BEGIN
 +
DBMS_FILE_TRANSFER.GET_FILE(
 
source_directory_object      => 'DATA_PUMP_DIR',
 
source_directory_object      => 'DATA_PUMP_DIR',
 
source_file_name              => 'sample.dmp',
 
source_file_name              => 'sample.dmp',
destination_directory_object  => 'DATA_PUMP_DIR2',
+
source_database              => '디비링크명',
destination_file_name        => 'sample_copied.dmp',
+
destination_directory_object  => 'DATA_PUMP_DIR2',  
destination_database          => '디비링크명'  
+
destination_file_name        => 'sample_copied.dmp'  
 
);
 
);
 
END;
 
END;

2023년 10월 14일 (토) 02:49 기준 최신판

thumb_up 추천메뉴 바로가기


1 EXPORT API[편집]

1.1 스키마 EXPORT[편집]

DECLARE
    hndl NUMBER;
    TAG_NAME  VARCHAR2(30) := 'EXP_MIG_TEST01';
BEGIN
    hndl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT'
                              , job_mode => 'SCHEMA' -- FULL, SCHEMA, TABLE, TABLESPACE, TRANSPORTABLE
                              , job_name=>'JOB_'||TAG_NAME
                              --, remote_link => 'DBLINK_NAME', version => 'LATEST'
                              );
    DBMS_DATAPUMP.ADD_FILE( handle => hndl, filename => TAG_NAME||'.dmp', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE, reusefile=>1);
    DBMS_DATAPUMP.ADD_FILE( handle => hndl, filename => TAG_NAME||'.log', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
    
    -- DBMS_DATAPUMP.SET_PARAMETER(handle=> hndl, name=> 'INCLUDE_METADATA', value=> 1); -- META 포함여부
    DBMS_DATAPUMP.DATA_FILTER(handle=> hndl, name=> 'INCLUDE_ROWS', value=> 0);  -- DATA 포함 여부 0, 
    DBMS_DATAPUMP.METADATA_FILTER(handle=> hndl, name=> 'SCHEMA_EXPR', value=>'IN (''FED40'',''TTT'')');
    -- DBMS_DATAPUMP.METADATA_FILTER(handle=> hndl, name=> 'NAME_EXPR', value=>'IN (''FED40'', ''TEST'')');
    -- DBMS_DATAPUMP.METADATA_FILTER(handle=> hndl, name=> 'NAME_LIST', value=>'''EMP'',''DEPT''');

    
    DBMS_DATAPUMP.START_JOB(hndl);
END;

1.2 테이블 EXPORT API[편집]

-- 1.테이블 DUMP EXPORT 스크립트

DECLARE
hdnl NUMBER;

BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>'JOB_EXP_TB_RC_JEJU_14');

DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'INIT_BK_TB_RC_JEJU_14_20190910.EXP', directory => 'DATAPUMP2', filetype => dbms_datapump.ku$_file_type_dump_file ,reusefile=>1);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'INIT_BK_TB_RC_JEJU_14_20190910.LOG', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file  ,reusefile=>1);

-- 스키마 정보 
 DBMS_DATAPUMP.METADATA_FILTER(handle => hdnl,
                               name   => 'SCHEMA_EXPR',
                               value  => ' IN (''유저명'')'
                               );
-- 테이블 정보  
DBMS_DATAPUMP.METADATA_FILTER(handle => hdnl
                             ,name   => 'NAME_EXPR'
                             ,value  => ' IN (''테이블명'')'
                             ,object_type => 'TABLE'
                             );

DBMS_DATAPUMP.START_JOB(hdnl);
END;

2 데이터펌프 로그파일 읽기 API[편집]

DECLARE 
V1 VARCHAR2(200); --32767
F1 UTL_FILE.FILE_TYPE; 

BEGIN 
    F1 := UTL_FILE.FOPEN('DATA_PUMP_DIR','INIT_BK_TB_RC_JEJU_12_20190910.LOG','R');	
Loop
	BEGIN
		UTL_FILE.GET_LINE(F1,V1); 
		dbms_output.put_line(V1);
		EXCEPTION WHEN No_Data_Found THEN EXIT; 
	END;
end loop;

IF UTL_FILE.IS_OPEN(F1) THEN
	dbms_output.put_line('File is Open');
end if;

UTL_FILE.FCLOSE(F1);	
END;

3 파일 복사(ASM등)[편집]

 attach_file OS상의 파일복사 명령를 DB에서 직접 수행이 가능.

  • DBMS_FILE_TRANSFER.COPY_FILE 패키지/함수
  • 소스 디렉토리에서 파일을 읽고 대상 디렉토리에 복사
  • ASM 과 로컬 디스크간 복사
  • 소스 및 대상 디렉토리는 로컬 파일 시스템에 있거나 ASM (Automatic Storage Management) 디스크 그룹에 있거나

로컬 파일 시스템과 ASM간에 어느 방향 으로든 복사 할 수 있음.

BEGIN
DBMS_FILE_TRANSFER.COPY_FILE(
  source_directory_object      =>  'SOURCEDIR' -- 소스 디렉토리 
, source_file_name             => 't_xdbtmp.f' -- 소스 파일
, destination_directory_object => 'DGROUP'     -- 타켓 디렉토리
, destination_file_name        =>'t_xdbtmp.f'  -- 타겟 파일
);
END;
/

3.1 DB LINK를 이용한 파일 복사(밀어 넣기)[편집]

 attach_file DBMS_FILE_TRANSFER.PUT_FILE 패키지/함수

  • 소스 에서 프로시져 실행 해야 함.
  • 소스 => 타겟으로 복사
  • 로컬 파일 또는 ASM을 읽고 원격 데이터베이스에 접속하여 원격 파일 시스템에 파일 사본을 작성합니다.
  • DB링크 간의 DUMP파일 복사가 가능(.log파일은 복사 안됨,12c)

BEGIN
DBMS_FILE_TRANSFER.PUT_FILE(
source_directory_object       => 'DATA_PUMP_DIR',    -- 패키지 실행하는 DB
source_file_name              => 'sample.dmp',       -- 패키지 실행하는 DIRECTORY의 덤프파일명
destination_directory_object  => 'DATA_PUMP_DIR2',   -- DB링크 원격지 디렉토리
destination_file_name         => 'sample_copied.dmp',-- DB링크 원격지에 저장될 파일명
destination_database          => '디비링크명' 
);
END;
/

3.2 파일 복사(가져오기)[편집]

 attach_file DBMS_FILE_TRANSFER.GET_FILE

  • 원격 데이터베이스에 접속하여 원격 파일을 로컬 파일 시스템 또는 ASM에 파일 복사.
  • 절차가 성공적으로 완료 될 때까지 대상 파일이 닫히지 않음.

BEGIN
DBMS_FILE_TRANSFER.GET_FILE(
source_directory_object       => 'DATA_PUMP_DIR',
source_file_name              => 'sample.dmp',
source_database               => '디비링크명',
destination_directory_object  => 'DATA_PUMP_DIR2', 
destination_file_name         => 'sample_copied.dmp' 
);
END;
/