

# Oracle Data Pump를 사용한 가져오기
<a name="Oracle.Procedural.Importing.DataPump"></a>

Oracle Data Pump는 Oracle 데이터를 덤프 파일로 내보내고 다른 Oracle 데이터베이스로 가져올 수 있는 유틸리티입니다. Oracle Data Pump는 Oracle 내보내기/가져오기 유틸리티를 장기적으로 대체합니다. Oracle Data Pump는 Oracle 데이터베이스에서 Amazon RDS DB 인스턴스로 대량의 데이터를 이동하는 기본적인 방법입니다.

이 섹션의 예에서는 Oracle 데이터베이스로 데이터를 가져오는 한 방법만 설명하지만, Oracle Data Pump는 다른 여러 가져오기 방법을 지원합니다. 자세한 내용은 [Oracle 데이터베이스 설명서](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html#GUID-501A9908-BCC5-434C-8853-9A6096766B5A)를 참조하세요.

이 부분의 예제에서는 `DBMS_DATAPUMP` 패키지를 사용합니다. Oracle Data Pump 명령줄 유틸리티 `impdp` 및 `expdp`를 사용하여 동일한 작업을 수행할 수 있습니다. Oracle 인스턴트 클라이언트를 포함하여 Oracle 클라이언트 설치의 일부로 원격 호스트에 이러한 유틸리티를 설치할 수 있습니다. 자세한 내용을 알아보려면 [Oracle Instant Client를 사용하여 Amazon RDS for Oracle DB 인스턴스에 대해 Data Pump 가져오기 또는 내보내기를 실행하려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/rds-oracle-instant-client-datapump/)를 참조하세요.

**Topics**
+ [Oracle Data Pump 개요](#Oracle.Procedural.Importing.DataPump.Overview)
+ [Oracle Data Pump와 Amazon S3 버킷으로 데이터 가져오기](#Oracle.Procedural.Importing.DataPump.S3)
+ [Oracle Data Pump와 데이터베이스 링크로 데이터 가져오기](#Oracle.Procedural.Importing.DataPump.DBLink)

## Oracle Data Pump 개요
<a name="Oracle.Procedural.Importing.DataPump.Overview"></a>

Oracle Data Pump는 다음 구성 요소로 이루어집니다.
+ 명령줄 클라이언트 `expdp` 및 `impdp`
+ `DBMS_DATAPUMP` PL/SQL 패키지
+ `DBMS_METADATA` PL/SQL 패키지

다음 시나리오에 Oracle Data Pump를 사용하면 됩니다.
+ Oracle 데이터베이스(온프레미스 또는 Amazon EC2 인스턴스 중 하나)에서 RDS for Oracle DB 인스턴스로 데이터를 가져옵니다.
+ RDS for Oracle DB 인스턴스에서 Oracle 데이터베이스(온프레미스 또는 Amazon EC2 인스턴스)로 데이터를 가져옵니다.
+ RDS for Oracle DB 인스턴스 간에 데이터를 가져옵니다(예: EC2-Classic에서 VPC로 데이터 마이그레이션).

Oracle Data Pump 유틸리티를 다운로드하려면 Oracle Technology Network 웹사이트의 [Oracle 데이터베이스 소프트웨어 다운로드](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)를 참조하세요. Oracle 데이터베이스 버전 간에 마이그레이션할 때 호환성 고려 사항은 [Oracle 데이터베이스 설명서](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-BAA3B679-A758-4D55-9820-432D9EB83C68)를 참조하세요.

### Oracle Data Pump 워크플로우
<a name="Oracle.Procedural.Importing.DataPump.Overview.how-it-works"></a>

일반적으로 Oracle Data Pump를 사용하는 단계는 다음과 같습니다.

1. 데이터를 소스 데이터베이스의 덤프 파일로 내보냅니다.

1. 덤프 파일을 대상 RDS for Oracle DB 인스턴스로 업로드합니다. Amazon S3 버킷을 사용하거나 두 데이터베이스 간 데이터베이스 링크를 사용하여 전송할 수 있습니다.

1. 덤프 파일의 데이터를 RDS for Oracle DB 인스턴스로 가져옵니다.

### Oracle Data Pump 모범 사례
<a name="Oracle.Procedural.Importing.DataPump.Overview.best-practices"></a>

Oracle Data Pump를 사용하여 데이터를 RDS for Oracle 인스턴스로 가져오는 경우 다음과 같은 모범 사례를 적용하는 것이 좋습니다.
+ 특정 스키마 및 객체를 가져오려면 `schema` 또는 `table` 모드로 가져오기를 수행하십시오.
+ 가져오는 스키마를 애플리케이션에 필요한 스키마로 제한하십시오.
+ `full` 모드로 가져오거나 시스템 유지관리 구성 요소의 스키마를 가져오지 않습니다.

  RDS for Oracle은 `SYS` 또는 `SYSDBA` 관리 사용자에 대한 액세스를 허용하지 않으므로 이 작업을 수행하면 Oracle 데이터 딕셔너리가 손상되고 데이터베이스 안정성에 영향을 줄 수 있습니다.
+ 대량의 데이터를 로드할 경우 다음을 수행합니다.

  1. 덤프 파일을 대상 RDS for Oracle DB 인스턴스로 전송합니다.

  1. DB 인스턴스의 스냅샷을 만듭니다.

  1. 가져오기를 테스트하여 성공적으로 수행되는지 확인합니다.

  데이터베이스 구성 요소가 무효화된 경우 DB 인스턴스를 삭제하고 DB 스냅샷에서 다시 생성할 수 있습니다. 복원된 DB 인스턴스에는 DB 스냅샷을 가져왔을 때 DB 인스턴스에 준비된 모든 덤프 파일이 포함됩니다.
+ Oracle Data Pump 내보내기 파라미터 `TRANSPORT_TABLESPACES`, `TRANSPORTABLE` 또는 `TRANSPORT_FULL_CHECK`를 사용하여 생성된 덤프 파일을 가져오지 마세요. RDS for Oracle DB 인스턴스는 이러한 덤프 파일 가져오기를 지원하지 않습니다.
+ `SYS`, `SYSTEM`, `RDSADMIN`, `RDSSEC` 및 `RDS_DATAGUARD`에 Oracle 스케줄러 객체가 포함되어 있고 다음 범주에 속하는 덤프 파일은 가져오지 마세요.
  + 작업
  + 프로그램
  + Schedules
  + 체인
  + 규칙
  + 평가 컨텍스트
  + 규칙 세트

  RDS for Oracle DB 인스턴스는 이러한 덤프 파일 가져오기를 지원하지 않습니다.
+ 지원되지 않는 Oracle Scheduler 객체를 제외하려면 Data Pump 내보내기 중에 추가 지시문을 사용합니다. `DBMS_DATAPUMP`를 사용하는 경우 `DBMS_METADATA.START_JOB` 앞에 `METADATA_FILTER`를 추가로 넣을 수 있습니다.

  ```
  DBMS_DATAPUMP.METADATA_FILTER(
    v_hdnl,
    'EXCLUDE_NAME_EXPR',
    q'[IN (SELECT NAME FROM SYS.OBJ$ 
           WHERE TYPE# IN (66,67,74,79,59,62,46) 
           AND OWNER# IN
             (SELECT USER# FROM SYS.USER$ 
              WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
              )
          )
    ]',
    'PROCOBJ'
  );
  ```

  `expdp`를 사용하는 경우 다음 예에 표시된 `exclude` 지시문이 포함된 파라미터 파일을 생성합니다. 그런 다음 `PARFILE=parameter_file` 명령과 함께 `expdp`을 사용합니다.

  ```
  exclude=procobj:"IN 
    (SELECT NAME FROM sys.OBJ$
     WHERE TYPE# IN (66,67,74,79,59,62,46) 
     AND OWNER# IN 
       (SELECT USER# FROM SYS.USER$ 
        WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
       )
    )"
  ```

## Oracle Data Pump와 Amazon S3 버킷으로 데이터 가져오기
<a name="Oracle.Procedural.Importing.DataPump.S3"></a>

다음 가져오기 프로세스에서는 Oracle Data Pump와 Amazon S3 버킷을 사용합니다. 단계는 다음과 같습니다.

1. Oracle [DBMS\$1DATAPUMP](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html) 패키지를 사용한 소스 데이터베이스의 데이터를 내보냅니다.

1. 덤프 파일을 Amazon S3 버킷에 저장합니다.

1. 덤프 파일을 Amazon S3 버킷에서 대상 RDS for Oracle DB 인스턴스의 `DATA_PUMP_DIR` 디렉터리로 다운로드합니다.

1. `DBMS_DATAPUMP` 패키지를 사용하여 복사된 덤프 파일의 데이터를 RDS for Oracle DB 인스턴스로 가져옵니다.

**Topics**
+ [Oracle Data Pump와 Amazon S3 버킷으로 데이터를 가져오기 위한 요건](#Oracle.Procedural.Importing.DataPumpS3.requirements)
+ [1단계: RDS for Oracle 대상 DB 인스턴스의 데이터베이스 사용자에게 권한 부여](#Oracle.Procedural.Importing.DataPumpS3.Step1)
+ [2단계: DBMS\$1DATAPUMP를 사용하여 데이터를 덤프 파일로 내보내기](#Oracle.Procedural.Importing.DataPumpS3.Step2)
+ [3단계: 덤프 파일을 Amazon S3 버킷에 업로드](#Oracle.Procedural.Importing.DataPumpS3.Step3)
+ [4단계: Amazon S3 버킷에서 대상 DB 인스턴스로 덤프 파일 다운로드](#Oracle.Procedural.Importing.DataPumpS3.Step4)
+ [5단계: DBMS\$1DATAPUMP를 사용하여 덤프 파일을 대상 DB 인스턴스로 가져오기](#Oracle.Procedural.Importing.DataPumpS3.Step5)
+ [6단계: 정리](#Oracle.Procedural.Importing.DataPumpS3.Step6)

### Oracle Data Pump와 Amazon S3 버킷으로 데이터를 가져오기 위한 요건
<a name="Oracle.Procedural.Importing.DataPumpS3.requirements"></a>

이 프로세스를 수행하려면 다음 요구 사항이 충족되어야 합니다.
+ 파일 전송에 Amazon S3 버킷을 사용할 수 있고 Amazon S3 버킷이 DB 인스턴스와 동일한 AWS 리전에 있어야 합니다. 지침을 보려면 *Amazon Simple Storage Service 시작 안내서*에서 [버킷 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)을 참조하세요.
+ Amazon S3 버킷에 업로드하는 객체는 5TB 이하여야 합니다. Amazon S3의 객체 작업에 대한 자세한 내용은 [Amazon Simple Storage Service 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html)를 참조하세요.
**참고**  
덤프 파일이 5TB를 초과하면 병렬 옵션을 사용하여 Oracle Data Pump 내보내기를 실행할 수 있습니다. 이 작업은 개별 파일에 대해 5TB 제한을 초과하지 않도록 데이터를 여러 덤프 파일로 분산합니다.
+ [Amazon S3와 RDS for Oracle 통합을 위한 IAM 권한 구성](oracle-s3-integration.preparing.md)의 지침에 따라 Amazon RDS 통합을 위한 Amazon S3 버킷을 준비해야 합니다.
+ 원본 인스턴스 및 대상 DB 인스턴스에 덤프 파일을 저장할 수 있는 충분한 스토리지 공간이 있는지 확인해야 합니다.

**참고**  
이 프로세스는 덤프 파일을 모든 Oracle DB 인스턴스의 사전 구성된 디렉터리인 `DATA_PUMP_DIR` 디렉터리로 가져옵니다. 이 디렉터리는 데이터 파일과 동일한 스토리지 볼륨에 위치합니다. 덤프 파일을 가져올 때 기존 Oracle 데이터 파일은 더 많은 공간을 사용합니다. 따라서 DB 인스턴스가 공간의 추가 사용을 수용할 수 있는지 확인해야 합니다. 가져온 덤프 파일은 자동으로 삭제되거나 `DATA_PUMP_DIR` 디렉터리에서 제거됩니다. 가져온 덤프 파일을 제거하려면 Oracle 웹사이트에 있는 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)를 사용하십시오.

### 1단계: RDS for Oracle 대상 DB 인스턴스의 데이터베이스 사용자에게 권한 부여
<a name="Oracle.Procedural.Importing.DataPumpS3.Step1"></a>

이 단계에서는 데이터를 가져올 스키마를 생성하고 사용자에게 필요한 권한을 부여합니다.

**사용자를 생성하고 RDS for Oracle 대상 인스턴스에 필요한 권한을 부여하는 방법**

1. SQL\$1Plus 또는 Oracle SQL Developer를 사용하여 데이터를 가져올 RDS for Oracle DB 인스턴스에 마스터 사용자로 로그인합니다. DB 인스턴스 연결에 대한 정보는 [Oracle DB 인스턴스에 연결](USER_ConnectToOracleInstance.md) 섹션을 참조하세요.

1. 데이터를 가져오려면 먼저 테이블 스페이스를 생성해야 합니다. 자세한 내용은 [RDS for Oracle에서 테이블스페이스 생성 및 크기 조정](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)을 참조하세요.

1. 사용자 계정을 생성하고 데이터를 가져올 사용자 계정이 없는 경우 필요한 권한 및 역할을 부여합니다. 데이터를 다수의 사용자 스키마로 가져오려는 경우에는 사용자 계정을 각각 생성한 후에 필요한 권한과 역할을 부여합니다.

   예를 들어 다음 SQL 문은 새로운 사용자를 생성하고 해당 사용자가 소유한 스키마에 데이터를 가져오는 데 필요한 권한과 역할을 부여합니다. 다음 단계에서 `schema_1`을 이 단계의 스키마 이름으로 대체합니다.

   ```
   CREATE USER schema_1 IDENTIFIED BY my_password;
   GRANT CREATE SESSION, RESOURCE TO schema_1;
   ALTER USER schema_1 QUOTA 100M ON users;
   ```
**참고**  
보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

   위 문은 새로운 사용자에게 `CREATE SESSION` 권한과 `RESOURCE` 역할을 부여합니다. 어떤 데이터베이스 객체를 가져오느냐에 따라 권한과 역할이 추가로 필요할 수 있습니다.

### 2단계: DBMS\$1DATAPUMP를 사용하여 데이터를 덤프 파일로 내보내기
<a name="Oracle.Procedural.Importing.DataPumpS3.Step2"></a>

덤프 파일을 만들려면 `DBMS_DATAPUMP` 패키지를 사용합니다.

**Oracle 데이터를 덤프 파일로 내보내는 방법**

1. SQL Plus 또는 Oracle SQL Developer를 사용하여 관리 사용자 권한으로 소스 RDS for Oracle DB 인스턴스에 연결합니다. 소스 데이터베이스가 RDS for Oracle DB 인스턴스인 경우 Amazon RDS 마스터 사용자 권한으로 연결합니다.

1. `DBMS_DATAPUMP` 프로시저를 호출하여 데이터를 내보냅니다.

   다음 스크립트는 `SCHEMA_1` 스키마를 `DATA_PUMP_DIR` 디렉터리에 있는 `sample.dmp` 덤프 파일로 내보냅니다. `SCHEMA_1`을 내보내려는 스키마 이름으로 바꿉니다.

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN(
       operation => 'EXPORT', 
       job_mode  => 'SCHEMA', 
       job_name  => null
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl         , 
       filename  => 'sample.dmp'   , 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_dump_file
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_exp.log', 
       directory => 'DATA_PUMP_DIR' , 
       filetype  => dbms_datapump.ku$_file_type_log_file
     );
     DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl,
       'EXCLUDE_NAME_EXPR',
       q'[IN (SELECT NAME FROM SYS.OBJ$ 
              WHERE TYPE# IN (66,67,74,79,59,62,46) 
              AND OWNER# IN 
                (SELECT USER# FROM SYS.USER$ 
                 WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
                )
             )
       ]',
       'PROCOBJ'
     );
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**참고**  
Data Pump는 작업을 비동기적으로 시작합니다. Data Pump 작업 모니터링에 대한 자세한 내용은 Oracle 설명서의 [Monitoring Job Status](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)를 참조하세요.

1. (선택 사항) `rdsadmin.rds_file_util.read_text_file` 프로시저를 호출하여 내보내기 로그의 내용을 확인할 수 있습니다. 자세한 내용은 [DB 인스턴스 디렉터리의 파일 목록 읽기](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)을 참조하세요.

### 3단계: 덤프 파일을 Amazon S3 버킷에 업로드
<a name="Oracle.Procedural.Importing.DataPumpS3.Step3"></a>

Amazon RDS 프로시저 `rdsadmin.rdsadmin_s3_tasks.upload_to_s3`를 사용하여 덤프 파일을 Amazon S3 버킷에 업로드합니다. 다음 예제에서는 `DATA_PUMP_DIR` 디렉터리에서 모든 파일을 `amzn-s3-demo-bucket`이라는 이름의 Amazon S3 버킷에 업로드합니다.

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
  p_bucket_name    =>  'amzn-s3-demo-bucket',       
  p_directory_name =>  'DATA_PUMP_DIR') 
AS TASK_ID FROM DUAL;
```

`SELECT` 문은 `VARCHAR2` 데이터 형식으로 작업 ID를 반환합니다. 자세한 내용은 [RDS for Oracle DB 인스턴스에서 Amazon S3 버킷으로 파일 업로드](oracle-s3-integration.using.md#oracle-s3-integration.using.upload)을 참조하세요.

### 4단계: Amazon S3 버킷에서 대상 DB 인스턴스로 덤프 파일 다운로드
<a name="Oracle.Procedural.Importing.DataPumpS3.Step4"></a>

Amazon RDS `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 프로시저를 사용하여 단계를 수행합니다. 디렉터리에 파일을 다운로드할 때 동일한 이름의 파일이 디렉터리에 이미 있는 경우, 이 `download_from_s3` 프로시저는 다운로드를 건너뜁니다. 다운로드 디렉터리에서 파일을 제거하려면 Oracle 웹사이트에 있는 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)를 사용하세요.

**덤프 파일을 다운로드하는 방법**

1. SQL\$1Plus 또는 Oracle SQL Developer를 시작하여 Amazon RDS 대상 Oracle DB 인스턴스에서 마스터로 로그인합니다.

1. Amazon RDS `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 프로시저를 사용하여 덤프 파일을 다운로드합니다.

   다음 예에서는 `amzn-s3-demo-bucket`이라는 이름의 Amazon S3 버킷에서 모든 파일을 `DATA_PUMP_DIR` 디렉터리로 다운로드합니다.

   ```
   SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
     p_bucket_name    =>  'amzn-s3-demo-bucket',
     p_directory_name =>  'DATA_PUMP_DIR')
   AS TASK_ID FROM DUAL;
   ```

   `SELECT` 문은 `VARCHAR2` 데이터 형식으로 작업 ID를 반환합니다. 자세한 내용은 [Amazon S3 버킷의 파일을 Oracle DB 인스턴스로 다운로드](oracle-s3-integration.using.md#oracle-s3-integration.using.download)을 참조하세요.

### 5단계: DBMS\$1DATAPUMP를 사용하여 덤프 파일을 대상 DB 인스턴스로 가져오기
<a name="Oracle.Procedural.Importing.DataPumpS3.Step5"></a>

`DBMS_DATAPUMP`를 사용하여 스키마를 RDS for Oracle DB 인스턴스로 가져옵니다. `METADATA_REMAP`과 같은 추가 옵션이 필요할 수 있습니다.

**대상 DB 인스턴스로 데이터를 가져오는 방법**

1. SQL\$1Plus 또는 SQL Developer를 시작하여 마스터 사용자로 RDS for Oracle DB 인스턴스에 로그인합니다.

1. `DBMS_DATAPUMP` 프로시저를 직접 호출하여 데이터를 가져옵니다.

   다음 예에서는 `sample_copied.dmp`에서 대상 DB 인스턴스로 *SCHEMA\$11* 데이터를 가져옵니다.

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN( 
       operation => 'IMPORT', 
       job_mode  => 'SCHEMA', 
       job_name  => null);
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_copied.dmp', 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_dump_file);
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_imp.log', 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_log_file);
     DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**참고**  
Data Pump 작업은 비동기로 시작됩니다. Data Pump 작업 모니터링에 대한 자세한 정보는 Oracle 설명서의 [Monitoring Job Status](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)를 참조하십시오. `rdsadmin.rds_file_util.read_text_file` 절차를 사용하여 가져오기 로그의 내용을 볼 수 있습니다. 자세한 내용은 [DB 인스턴스 디렉터리의 파일 목록 읽기](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)을 참조하세요.

1. 대상 DB 인스턴스의 스키마 테이블을 나열하여 데이터 가져오기 작업을 확인합니다.

   예를 들어 다음 쿼리는 `SCHEMA_1`의 테이블 수를 반환합니다.

   ```
   SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1';
   ```

### 6단계: 정리
<a name="Oracle.Procedural.Importing.DataPumpS3.Step6"></a>

데이터를 가져온 후에는 유지하지 않을 파일을 삭제할 수 있습니다.

**불필요한 파일을 제거하는 방법**

1. SQL\$1Plus 또는 SQL Developer를 시작하여 마스터 사용자로 RDS for Oracle DB 인스턴스에 로그인합니다.

1. 다음 명령을 사용하여 `DATA_PUMP_DIR`의 파일을 나열합니다.

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
   ```

1. 다음 명령을 사용하여 `DATA_PUMP_DIR`에서 더 이상 필요하지 않은 파일을 삭제합니다.

   ```
   EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','filename');
   ```

   예를 들어, 다음 명령은 `sample_copied.dmp`라는 파일을 삭제합니다.

   ```
   EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp'); 
   ```

## Oracle Data Pump와 데이터베이스 링크로 데이터 가져오기
<a name="Oracle.Procedural.Importing.DataPump.DBLink"></a>

다음 가져오기 프로세스에서는 Oracle Data Pump 및 Oracle [DBMS\$1FILE\$1TRANSFER](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_FILE_TRANSFER.html) 패키지를 사용합니다. 단계는 다음과 같습니다.

1. 소스 Oracle 데이터베이스(온프레미스 데이터베이스, Amazon EC2 인스턴스 또는 RDS for Oracle DB 인스턴스 등)에 연결합니다.

1. [DBMS\$1DATAPUMP](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html) 패키지를 사용하여 데이터를 내보냅니다.

1. `DBMS_FILE_TRANSFER.PUT_FILE`을 사용하여 데이터베이스 링크를 통해 연결된 대상 RDS for Oracle DB 인스턴스의 `DATA_PUMP_DIR` 디렉터리에 Oracle 데이터베이스의 덤프 파일을 복사합니다.

1. ` DBMS_DATAPUMP` 패키지를 사용하여 복사된 덤프 파일의 데이터를 RDS for Oracle DB 인스턴스로 가져옵니다.

Oracle Data Pump 및 `DBMS_FILE_TRANSFER` 패키지를 사용하는 가져오기 프로세스는 다음 단계로 이루어집니다.

**Topics**
+ [Oracle Data Pump와 데이터베이스 링크로 데이터를 가져오기 위한 요건](#Oracle.Procedural.Importing.DataPumpDBLink.requirements)
+ [1단계: RDS for Oracle 대상 DB 인스턴스 사용자에게 권한 부여](#Oracle.Procedural.Importing.DataPumpDBLink.Step1)
+ [2단계: 소스 데이터베이스에서 사용자에게 권한 부여](#Oracle.Procedural.Importing.DataPumpDBLink.Step2)
+ [3단계: DBMS\$1DATAPUMP를 사용하여 덤프 파일 생성](#Oracle.Procedural.Importing.DataPumpDBLink.Step3)
+ [4단계: 대상 DB 인스턴스의 데이터베이스 링크 생성](#Oracle.Procedural.Importing.DataPumpDBLink.Step4)
+ [5단계: DBMS\$1FILE\$1TRANSFER를 사용하여 내보낸 덤프 파일을 대상 DB 인스턴스로 복사](#Oracle.Procedural.Importing.DataPumpDBLink.Step5)
+ [6단계: DBMS\$1DATAPUMP를 사용하여 대상 DB 인스턴스로 데이터 파일 가져오기](#Oracle.Procedural.Importing.DataPumpDBLink.Step6)
+ [7단계: 정리](#Oracle.Procedural.Importing.DataPumpDBLink.Step7)

### Oracle Data Pump와 데이터베이스 링크로 데이터를 가져오기 위한 요건
<a name="Oracle.Procedural.Importing.DataPumpDBLink.requirements"></a>

이 프로세스를 수행하려면 다음 요구 사항이 충족되어야 합니다.
+ `DBMS_FILE_TRANSFER` 및 `DBMS_DATAPUMP` 패키지에 대한 실행 권한이 있어야 합니다.
+ 원본 DB 인스턴스의 `DATA_PUMP_DIR` 디렉터리에 대한 쓰기 권한이 있어야 합니다.
+ 원본 인스턴스 및 대상 DB 인스턴스에 덤프 파일을 저장할 수 있는 충분한 스토리지 공간이 있는지 확인해야 합니다.

**참고**  
이 프로세스는 덤프 파일을 모든 Oracle DB 인스턴스의 사전 구성된 디렉터리인 `DATA_PUMP_DIR` 디렉터리로 가져옵니다. 이 디렉터리는 데이터 파일과 동일한 스토리지 볼륨에 위치합니다. 덤프 파일을 가져올 때 기존 Oracle 데이터 파일은 더 많은 공간을 사용합니다. 따라서 DB 인스턴스가 공간의 추가 사용을 수용할 수 있는지 확인해야 합니다. 가져온 덤프 파일은 자동으로 삭제되거나 `DATA_PUMP_DIR` 디렉터리에서 제거됩니다. 가져온 덤프 파일을 제거하려면 Oracle 웹사이트에 있는 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)를 사용하십시오.

### 1단계: RDS for Oracle 대상 DB 인스턴스 사용자에게 권한 부여
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step1"></a>

RDS for Oracle 대상 DB 인스턴스에서 사용자에게 권한을 부여하려면 다음 단계를 수행합니다.

1. SQL Plus 또는 Oracle SQL Developer를 사용하여 데이터를 가져올 RDS for Oracle DB 인스턴스에 연결합니다. Amazon RDS 마스터 사용자 권한으로 연결합니다. DB 인스턴스 연결에 대한 자세한 정보는 [Oracle DB 인스턴스에 연결](USER_ConnectToOracleInstance.md) 단원을 참조하십시오.

1. 데이터를 가져오려면 먼저 테이블 스페이스를 생성해야 합니다. 자세한 내용은 [RDS for Oracle에서 테이블스페이스 생성 및 크기 조정](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles) 섹션을 참조하세요.

1. 데이터를 가져올 사용자 계정이 존재하지 않으면 사용자 계정을 생성한 후 필요한 권한과 역할을 부여합니다. 데이터를 다수의 사용자 스키마로 가져오려는 경우에는 사용자 계정을 각각 생성한 후에 필요한 권한과 역할을 부여합니다.

   예를 들어 다음 명령은 *schema\$11*이라는 신규 사용자를 생성하고, 해당 사용자의 스키마로 데이터를 가져오는 데 필요한 권한과 역할을 부여합니다.

   ```
   CREATE USER schema_1 IDENTIFIED BY my-password;
   GRANT CREATE SESSION, RESOURCE TO schema_1;
   ALTER USER schema_1 QUOTA 100M ON users;
   ```
**참고**  
보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

   앞선 예에서는 새로운 사용자에게 `CREATE SESSION` 권한과 `RESOURCE` 역할을 부여합니다. 하지만 가져오는 데이터베이스 객체에 따라 권한과 역할이 추가로 필요할 수도 있습니다.
**참고**  
다음 단계에서 `schema_1`을 이 단계의 스키마 이름으로 대체합니다.

### 2단계: 소스 데이터베이스에서 사용자에게 권한 부여
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step2"></a>

SQL\$1Plus 또는 Oracle SQL Developer를 사용하여 가져올 데이터를 포함하는 RDS for Oracle DB 인스턴스에 연결합니다. 필요할 경우 사용자 계정을 생성하고 필요한 권한을 부여합니다.

**참고**  
원본 데이터베이스가 Amazon RDS 인스턴스인 경우 이 단계를 건너뛸 수 있습니다. 이 경우 Amazon RDS 마스터 사용자 계정을 사용하여 데이터를 내보냅니다.

다음 명령은 새 사용자를 생성하고 필요한 권한을 부여합니다.

```
CREATE USER export_user IDENTIFIED BY my-password;
GRANT CREATE SESSION, CREATE TABLE, CREATE DATABASE LINK TO export_user;
ALTER USER export_user QUOTA 100M ON users;
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO export_user;
GRANT SELECT_CATALOG_ROLE TO export_user;
GRANT EXECUTE ON DBMS_DATAPUMP TO export_user;
GRANT EXECUTE ON DBMS_FILE_TRANSFER TO export_user;
```

**참고**  
보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

### 3단계: DBMS\$1DATAPUMP를 사용하여 덤프 파일 생성
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step3"></a>

덤프 파일을 만들려면 다음을 수행합니다.

1. SQL\$1Plus 또는 Oracle SQL Developer를 통해 관리 사용자 권한으로, 또는 2단계에서 생성한 사용자 권한으로 소스 Oracle 인스턴스에 연결합니다. 소스 데이터베이스가 Amazon RDS for Oracle DB 인스턴스인 경우 Amazon RDS 마스터 사용자 권한으로 연결합니다.

1. Oracle Data Pump 유틸리티를 사용하여 덤프 파일을 생성합니다.

   다음 스크립트는 `DATA_PUMP_DIR` 디렉터리에 *sample.dmp*라는 덤프 파일을 생성합니다.

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN( 
       operation => 'EXPORT' , 
       job_mode  => 'SCHEMA' , 
       job_name  => null
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample.dmp'    , 
       directory => 'DATA_PUMP_DIR' , 
       filetype  => dbms_datapump.ku$_file_type_dump_file
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl           , 
       filename  => 'sample_exp.log' , 
       directory => 'DATA_PUMP_DIR'  , 
       filetype  => dbms_datapump.ku$_file_type_log_file
     );
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl              ,
       'SCHEMA_EXPR'       ,
       'IN (''SCHEMA_1'')'
     );
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl,
       'EXCLUDE_NAME_EXPR',
       q'[IN (SELECT NAME FROM sys.OBJ$ 
              WHERE TYPE# IN (66,67,74,79,59,62,46) 
              AND OWNER# IN 
                (SELECT USER# FROM SYS.USER$ 
                 WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
                )
             )
       ]',
       'PROCOBJ'
     );
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**참고**  
Data Pump 작업은 비동기로 시작됩니다. Data Pump 작업 모니터링에 대한 자세한 정보는 Oracle 설명서의 [Monitoring Job Status](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)를 참조하십시오. `rdsadmin.rds_file_util.read_text_file` 절차를 사용하여 내보내기 로그의 내용을 볼 수 있습니다. 자세한 내용은 [DB 인스턴스 디렉터리의 파일 목록 읽기](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles) 섹션을 참조하세요.

### 4단계: 대상 DB 인스턴스의 데이터베이스 링크 생성
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step4"></a>

소스 DB 인스턴스와 대상 DB 인스턴스 간에 데이터베이스 링크를 생성합니다. 데이터베이스 링크를 생성하고 내보내기 덤프 파일을 전송하려면 로컬 Oracle 인스턴스가 DB 인스턴스와 네트워크로 연결되어 있어야 합니다.

이번 단계에서도 이전 단계와 동일한 사용자 계정에 연결합니다.

동일한 VPC 또는 피어링된 VPC 내에서 두 DB 인스턴스 간에 데이터베이스 링크를 생성하려면 두 DB 인스턴스에 서로에게 이르는 유효한 경로가 있어야 합니다. 각 DB 인스턴스의 보안 그룹은 다른 DB 인스턴스로(부터)의 수신 및 발신을 허용해야 합니다. 보안 그룹 인바운드 또는 아웃바운드 규칙은 동일한 VPC 또는 피어링된 VPC에서 보안 그룹을 참조할 수 있습니다. 자세한 내용은 [VPC의 DB 인스턴스에 사용하기 위한 데이터베이스 링크 조정](Appendix.Oracle.CommonDBATasks.DBLinks.md) 섹션을 참조하세요.

다음 명령은 대상 DB 인스턴스의 Amazon RDS 마스터 사용자에게 연결하는 `to_rds`라는 데이터베이스 링크를 생성합니다.

```
CREATE DATABASE LINK to_rds 
  CONNECT TO <master_user_account> IDENTIFIED BY <password>
  USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>)
         (PORT=<listener port>))(CONNECT_DATA=(SID=<remote SID>)))';
```

### 5단계: DBMS\$1FILE\$1TRANSFER를 사용하여 내보낸 덤프 파일을 대상 DB 인스턴스로 복사
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step5"></a>

`DBMS_FILE_TRANSFER`를 사용하여 원본 데이터베이스의 덤프 파일을 대상 DB 인스턴스로 복사합니다. 다음 스크립트는 원본 인스턴스에 있는 sample.dmp라는 덤프 파일을 *to\$1rds*(이전 단계에서 생성됨)라는 대상 데이터베이스 링크로 복사합니다.

```
BEGIN
  DBMS_FILE_TRANSFER.PUT_FILE(
    source_directory_object       => 'DATA_PUMP_DIR',
    source_file_name              => 'sample.dmp',
    destination_directory_object  => 'DATA_PUMP_DIR',
    destination_file_name         => 'sample_copied.dmp', 
    destination_database          => 'to_rds' );
END;
/
```

### 6단계: DBMS\$1DATAPUMP를 사용하여 대상 DB 인스턴스로 데이터 파일 가져오기
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step6"></a>

DB 인스턴스에서 Oracle Data Pump를 사용하여 스키마를 가져옵니다. METADATA\$1REMAP 등 추가 옵션이 필요할 수 있습니다.

 Amazon RDS 마스터 사용자 계정으로 DB 인스턴스에 연결하여 데이터를 가져옵니다.

```
DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN( 
    operation => 'IMPORT', 
    job_mode  => 'SCHEMA', 
    job_name  => null);
  DBMS_DATAPUMP.ADD_FILE( 
    handle    => v_hdnl, 
    filename  => 'sample_copied.dmp',
    directory => 'DATA_PUMP_DIR', 
    filetype  => dbms_datapump.ku$_file_type_dump_file );
  DBMS_DATAPUMP.ADD_FILE( 
    handle    => v_hdnl, 
    filename  => 'sample_imp.log', 
    directory => 'DATA_PUMP_DIR', 
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/
```

**참고**  
Data Pump 작업은 비동기로 시작됩니다. Data Pump 작업 모니터링에 대한 자세한 정보는 Oracle 설명서의 [Monitoring Job Status](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)를 참조하십시오. `rdsadmin.rds_file_util.read_text_file` 절차를 사용하여 가져오기 로그의 내용을 볼 수 있습니다. 자세한 내용은 [DB 인스턴스 디렉터리의 파일 목록 읽기](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles) 섹션을 참조하세요.

DB 인스턴스에서 해당 사용자의 테이블을 보고 데이터 가져오기를 확인할 수 있습니다. 예를 들어 다음 쿼리는 `schema_1`의 테이블 수를 반환합니다.

```
SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1'; 
```

### 7단계: 정리
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step7"></a>

데이터를 가져온 후에는 유지하지 않을 파일을 삭제할 수 있습니다. 다음 명령을 사용하여 `DATA_PUMP_DIR`의 파일을 나열할 수 있습니다.

```
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
```

`DATA_PUMP_DIR`에서 더 이상 필요하지 않은 파일을 삭제하려면 다음 명령을 사용합니다.

```
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','<file name>');
```

예를 들어, 다음 명령은 `"sample_copied.dmp"`라는 파일을 삭제합니다.

```
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp'); 
```