

# Amazon RDS의 Oracle로 데이터 가져오기
<a name="Oracle.Procedural.Importing"></a>

Amazon RDS DB for Oracle 인스턴스로 데이터를 가져오는 방법은 다음 사항에 따라 다릅니다.
+ 보유하고 있는 데이터의 양
+ 데이터베이스의 데이터베이스 객체 수
+ 데이터베이스의 데이터베이스 객체 다양성

예를 들어, 요구 사항에 따라 다음과 같은 도구를 사용할 수 있습니다.
+ Oracle SQL Developer - 20MB 데이터베이스를 가져옵니다.
+ Oracle Data Pump - 복합 데이터베이스 또는 수백 메가바이트나 수 테라바이트 크기의 데이터베이스를 가져옵니다. 예를 들어 온프레미스 데이터베이스에서 RDS for Oracle DB 인스턴스로 테이블스페이스를 전송할 수 있습니다. Amazon S3 또는 Amazon EFS를 사용하여 데이터 파일 및 메타데이터를 전송할 수 있습니다. 자세한 내용은 [Oracle 전송 가능한 테이블스페이스를 사용한 마이그레이션](oracle-migrating-tts.md), [Amazon EFS 통합](oracle-efs-integration.md), [Amazon S3 통합](oracle-s3-integration.md) 단원을 참조하세요.
+ AWS Database Migration Service(AWS DMS) - 다운타임 없이 데이터베이스를 마이그레이션합니다. AWS DMS에 대한 자세한 내용은 [AWS Database Migration Service란 무엇입니까?](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 및 블로그 게시물 [AWS DMS를 사용하여 거의 0에 가까운 다운타임으로 Oracle 데이터베이스 마이그레이션](https://aws.amazon.com/blogs/database/migrating-oracle-databases-with-near-zero-downtime-using-aws-dms/)을 참조하세요.

**중요**  
이전 마이그레이션 기술을 사용하기 전에 데이터베이스를 백업하는 것이 좋습니다. 데이터를 가져온 후 스냅샷을 생성하여 RDS for Oracle DB 인스턴스를 백업할 수 있습니다. 나중에 스냅샷을 복원할 수 있습니다. 자세한 내용은 [데이터 백업, 복원 및 내보내기](CHAP_CommonTasks.BackupRestore.md) 섹션을 참조하세요.

많은 데이터베이스 엔진의 경우 대상 데이터베이스로 전환할 준비가 될 때까지 진행 중인 복제가 계속될 수 있습니다. AWS DMS를 사용하여 동일하거나 다른 데이터베이스 엔진에서 RDS for Oracle로 마이그레이션할 수 있습니다. 다른 데이터베이스 엔진에서 마이그레이션하는 경우 AWS Schema Conversion Tool을 사용하여 AWS DMS에서 마이그레이션되지 않는 스키마 객체를 마이그레이션할 수 있습니다.

**Topics**
+ [Oracle SQL Developer를 사용한 가져오기](Oracle.Procedural.Importing.SQLDeveloper.md)
+ [Oracle 전송 가능한 테이블스페이스를 사용한 마이그레이션](oracle-migrating-tts.md)
+ [Oracle Data Pump를 사용한 가져오기](Oracle.Procedural.Importing.DataPump.md)
+ [Oracle 내보내기/가져오기를 통해 가져오기](Oracle.Procedural.Importing.ExportImport.md)
+ [Oracle SQL\$1Loader를 사용하여 가져오기](Oracle.Procedural.Importing.SQLLoader.md)
+ [Oracle 구체화된 보기로 마이그레이션](Oracle.Procedural.Importing.Materialized.md)

# Oracle SQL Developer를 사용한 가져오기
<a name="Oracle.Procedural.Importing.SQLDeveloper"></a>

Oracle SQL Developer는 Oracle에서 무상으로 배포한 그래픽 Java 도구입니다. SQL Developer는 두 Oracle 데이터베이스 간의 데이터 마이그레이션이나 MySQL 등의 다른 데이터베이스에서 Oracle 데이터베이스로 데이터 마이그레이션을 위한 옵션을 제공합니다. 이 도구는 작은 데이터베이스를 마이그레이션하는 데 매우 적합합니다.

데스크톱 컴퓨터(Windows, Linux 또는 Mac) 또는 서버 중 하나에 이 도구를 설치할 수 있습니다. SQL Developer를 설치한 후에는 SQL Developer를 사용하여 원본 및 대상 데이터베이스에 연결할 수 있습니다. 도구 메뉴의 **Database Copy** 명령을 사용하여 데이터를 RDS for Oracle DB 인스턴스에 복사합니다.

SQL Developer를 다운로드하려면 [ http://www.oracle.com/technetwork/developer-tools/sql-developer](http://www.oracle.com/technetwork/developer-tools/sql-developer)를 참조하십시오.

데이터 마이그레이션을 시작하기 전에 Oracle SQL Developer 제품을 읽는 것이 좋습니다. Oracle에서는 MySQL 및 SQL Server 등 다른 데이터베이스에서 마이그레이션하는 방법을 설명하는 문서도 제공합니다. 자세한 정보는 Oracle 설명서에서 [http://www.oracle.com/technetwork/database/migration](http://www.oracle.com/technetwork/database/migration)을 참조하십시오.

# Oracle 전송 가능한 테이블스페이스를 사용한 마이그레이션
<a name="oracle-migrating-tts"></a>

Oracle 전송 가능한 테이블스페이스 기능을 사용하여 온프레미스 Oracle 데이터베이스의 테이블스페이스 세트를 RDS for Oracle DB 인스턴스로 복사할 수 있습니다. 물리적 수준에서 Amazon EFS 또는 Amazon S3를 사용하여 소스 데이터 파일과 메타데이터 파일을 대상 DB 인스턴스에 전송합니다. 전송 가능한 테이블스페이스 기능은 `rdsadmin.rdsadmin_transport_util` 패키지를 사용합니다. 이 패키지의 구문 및 의미는 [테이블스페이스 전송](rdsadmin_transport_util.md) 섹션을 참조하세요.

테이블스페이스를 전송하는 방법을 설명하는 블로그 게시물은 [전송 가능한 테이블스페이스를 사용하도록 Oracle 데이터베이스를 AWS로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-oracle-databases-to-aws-using-transportable-tablespace/) 및 [RMAN을 사용한 Amazon RDS for Oracle 전송 가능 테이블스페이스](https://aws.amazon.com/blogs/database/amazon-rds-for-oracle-transportable-tablespaces-using-rman/)를 참조하세요.

**Topics**
+ [Oracle 전송 가능한 테이블스페이스 개요](#oracle-migrating-tts.overview)
+ [1단계: 소스 호스트 설정](#oracle-migrating-tts.setup-phase)
+ [2단계: 전체 테이블스페이스 백업 준비](#oracle-migrating-tts.initial-br-phase)
+ [3단계: 증분 백업 생성 및 전송](#oracle-migrating-tts.roll-forward-phase)
+ [4단계: 테이블스페이스 전송](#oracle-migrating-tts.final-br-phase)
+ [5단계: 전송된 테이블스페이스 검증](#oracle-migrating-tts.validate)
+ [6단계: 남은 파일 정리](#oracle-migrating-tts.cleanup)

## Oracle 전송 가능한 테이블스페이스 개요
<a name="oracle-migrating-tts.overview"></a>

전송 가능한 테이블스페이스 세트는 전송 중인 테이블스페이스 세트에 대한 데이터 파일과 테이블스페이스 메타데이터를 포함하는 내보내기 덤프 파일로 구성됩니다. 전송 가능한 테이블스페이스와 같은 물리적 마이그레이션 솔루션에서는 데이터 파일, 구성 파일 및 Data Pump 덤프 파일과 같은 물리적 파일을 전송합니다.

**Topics**
+ [전송 가능한 테이블스페이스의 장점 및 단점](#oracle-migrating-tts.overview.benefits)
+ [전송 가능한 테이블스페이스의 제한 사항](#oracle-migrating-tts.limitations)
+ [전송 가능한 테이블스페이스의 사전 요구 사항](#oracle-migrating-tts.requirements)

### 전송 가능한 테이블스페이스의 장점 및 단점
<a name="oracle-migrating-tts.overview.benefits"></a>

가동 중지 시간을 최소화하면서 하나 이상의 대규모 테이블스페이스를 RDS로 마이그레이션해야 하는 경우 전송 가능한 테이블스페이스를 사용하는 것이 좋습니다. 전송 가능한 테이블스페이스에는 논리적 마이그레이션에 비해 다음과 같은 이점이 있습니다.
+ 대부분의 다른 Oracle 마이그레이션 솔루션보다 가동 중지 시간이 짧습니다.
+ 전송 가능한 테이블스페이스 기능은 물리적 파일만 복사하므로 논리적 마이그레이션에서 발생할 수 있는 데이터 무결성 오류와 논리적 손상을 방지합니다.
+ 추가 라이선스가 필요하지 않습니다.
+ 예를 들어 Oracle Solaris 플랫폼에서 Linux로 마이그레이션하는 등 다양한 플랫폼 및 엔디안(endianness) 유형 간에 테이블스페이스 세트를 마이그레이션할 수 있습니다. 하지만 Windows 서버 간에 테이블스페이스를 주고받는 것은 지원되지 않습니다.
**참고**  
Linux는 완벽하게 테스트되고 지원됩니다. 일부 UNIX 버전은 테스트되지 않았습니다.

전송 가능한 테이블스페이스를 사용하는 경우 Amazon S3 또는 Amazon EFS를 사용하여 데이터를 전송할 수 있습니다.
+ EFS를 사용하는 경우 백업은 가져오는 동안 EFS 파일 시스템에 남아 있습니다. 나중에 파일을 제거할 수 있습니다. 이 기법에서는 DB 인스턴스에 EBS 스토리지를 프로비저닝할 필요가 없습니다. 따라서 S3 대신 Amazon EFS를 사용하는 것이 좋습니다. 자세한 내용은 [Amazon EFS 통합](oracle-efs-integration.md) 섹션을 참조하세요.
+ S3를 사용하는 경우 DB 인스턴스에 연결된 EBS 스토리지에 RMAN 백업을 다운로드합니다. 가져오는 동안 파일은 EBS 스토리지에 남아 있습니다. 가져온 후에는 DB 인스턴스에 할당된 상태로 남아 있는 이 공간을 비워 여유 공간을 확보할 수 있습니다.

전송 가능한 테이블스페이스의 주요 단점은 Oracle Database에 대해 비교적 높은 수준의 지식이 필요하다는 것입니다. 자세한 내용은 **Oracle Database 관리자 안내서의 [데이터베이스 간 테이블스페이스 전송](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-F7B2B591-AA88-4D16-8DCF-712763923FFB)을 참조하세요.

### 전송 가능한 테이블스페이스의 제한 사항
<a name="oracle-migrating-tts.limitations"></a>

RDS for Oracle에서 이 기능을 사용하는 경우 전송 가능한 테이블스페이스에 대한 Oracle Database 제한 사항이 적용됩니다. 자세한 내용은 **Oracle Database 관리자 안내서의 [전송 가능한 테이블스페이스 제한 사항]( https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-DAB51E42-9BBC-4001-B5CB-0ECDBE128787) 및 [데이터 전송에 대한 일반 제한 사항](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173)을 참조하세요. RDS for Oracle의 전송 가능한 테이블스페이스에 대한 다음과 같은 추가 제한 사항에 유의하세요.
+ 소스 데이터베이스와 대상 데이터베이스 모두 Standard Edition 2(SE2)를 사용할 수 없습니다. Enterprise Edition만 지원됩니다.
+ Oracle Database 11g 데이터베이스를 소스로 사용할 수 없습니다. RMAN 크로스 플랫폼 전송 가능한 테이블스페이스 기능은 Oracle Database 11g에서 지원하지 않는 RMAN 전송 메커니즘을 사용합니다.
+ 전송 가능한 테이블스페이스를 사용하여 RDS for Oracle DB 인스턴스에서 데이터를 마이그레이션할 수 없습니다. RDS for Oracle DB 인스턴스로 데이터를 마이그레이션하는 경우에만 전송 가능한 테이블스페이스를 사용할 수 있습니다.
+ Windows 운영 체제는 지원되지 않습니다.
+ 하위 릴리스 수준에서는 테이블스페이스를 데이터베이스로 전송할 수 없습니다. 대상 데이터베이스는 릴리스 수준이 소스 데이터베이스 이상이어야 합니다. 예를 들어 Oracle Database 21c에서 Oracle Database 19c로 테이블스페이스를 전송할 수 없습니다.
+ `SYSTEM` 및 `SYSAUX`와 같은 관리 테이블스페이스는 전송할 수 없습니다.
+ PL/SQL 패키지, Java 클래스, 뷰, 트리거, 시퀀스, 사용자, 역할 및 임시 테이블과 같은 비데이터 객체는 전송할 수 없습니다. 비데이터 객체를 전송하려면 객체를 수동으로 만들거나 Data Pump 메타데이터 내보내기 및 가져오기를 사용하세요. 자세한 내용은 [내 Oracle 지원 노트 1454872.1](https://support.oracle.com/knowledge/Oracle%20Cloud/1454872_1.html)을 참조하세요.
+ 암호화된 테이블스페이스 또는 암호화된 열을 사용하는 테이블스페이스를 전송할 수 없습니다.
+ Amazon S3를 사용하여 파일을 전송하는 경우 지원되는 최대 파일 크기는 5TiB입니다.
+ 소스 데이터베이스에서 Spatial과 같은 Oracle 옵션을 사용하는 경우 대상 데이터베이스에 동일한 옵션이 구성되어 있지 않으면 테이블스페이스를 전송할 수 없습니다.
+ Oracle 복제본 구성에서는 테이블스페이스를 RDS for Oracle DB 인스턴스로 전송할 수 없습니다. 이 문제를 해결하려면 모든 복제본을 삭제하고 테이블스페이스를 전송한 다음 복제본을 다시 생성하면 됩니다.

### 전송 가능한 테이블스페이스의 사전 요구 사항
<a name="oracle-migrating-tts.requirements"></a>

 시작하기 전에 다음 작업을 완료하세요.
+ My Oracle Support의 다음 문서에 설명된 전송 가능한 테이블스페이스의 요구 사항을 검토하세요.
  + [교차 플랫폼 증분 백업을 사용하여 전송 가능한 테이블스페이스 가동 시간 단축(문서 ID 2471245.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2471245.1)
  + [전송 가능한 테이블스페이스(TTS) 제한 사항 및 한계: 세부 정보, 참조 및 해당하는 경우 버전(문서 ID 1454872.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1454872.1)
  + [전송 가능한 테이블스페이스(TTS)에 대한 기본 참고 사항 - 일반적인 질문 및 문제(문서 ID 1166564.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1166564.1)
+ 엔디안 변환을 계획하세요. 소스 플랫폼 ID를 지정하는 경우 RDS for Oracle은 엔디안을 자동으로 변환합니다. 플랫폼 ID를 찾는 방법을 알아보려면 [동일한 Data Guard 구성의 이기종 기본 및 물리적 대기에 대한 Data Guard 지원(문서 ID 413484.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=413484.1)을 참조하세요.
+ 대상 DB 인스턴스에서 전송 가능한 테이블스페이스 기능이 사용 설정되어 있는지 확인하세요. 이 기능은 다음 쿼리를 실행할 때 `ORA-20304` 오류가 발생하지 않는 경우에만 사용 설정됩니다.

  ```
  SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files);
  ```

  전송 가능한 테이블스페이스 기능이 사용 설정되지 않았으면 DB 인스턴스를 재부팅하세요. 자세한 내용은 [ DB 인스턴스 재부팅](USER_RebootInstance.md) 섹션을 참조하세요.
+ 소스 및 대상 데이터베이스에서 시간대 파일이 동일한지 확인합니다.
+ 소스 및 대상 데이터베이스의 데이터베이스 문자 세트가 다음 요구 사항 중 하나를 충족하는지 확인합니다.
  + 문자 세트가 동일해야 합니다.
  + 문자 세트가 호환되어야 합니다. 호환성 요구 사항 목록은 Oracle Database 설명서의 [General Limitations on Transporting Data](https://docs.oracle.com/en/database/oracle/oracle-database/19/spmdu/general-limitations-on-transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173)를 참조하세요.
+ Amazon S3를 사용하여 파일을 전송하려는 경우 다음을 수행하세요.
  + 파일 전송에 Amazon S3 버킷을 사용할 수 있고 Amazon S3 버킷이 DB 인스턴스와 동일한 AWS 리전에 있어야 합니다. 지침을 보려면 *Amazon Simple Storage Service 시작 안내서*에서 [버킷 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)을 참조하세요.
  + [Amazon S3와 RDS for Oracle 통합을 위한 IAM 권한 구성](oracle-s3-integration.preparing.md)의 지침에 따라 Amazon RDS 통합을 위해 Amazon S3 버킷을 준비해야 합니다.
+ Amazon EFS를 사용하여 파일을 전송하려는 경우 [Amazon EFS 통합](oracle-efs-integration.md)의 지침에 따라 EFS를 구성해야 합니다.
+ 대상 DB 인스턴스에서 자동 백업을 켜는 것이 좋습니다. [메타데이터 가져오기 단계](#oracle-migrating-tts.transport.import-dmp)가 실패할 수 있으므로 DB 인스턴스를 가져오기 전 상태로 복원할 수 있어야 합니다. 그러면 테이블스페이스를 다시 백업하고 전송하고 가져올 필요가 없습니다.

## 1단계: 소스 호스트 설정
<a name="oracle-migrating-tts.setup-phase"></a>

이 단계에서는 My Oracle Support에서 제공하는 전송 테이블스페이스 스크립트를 복사하고 필요한 구성 파일을 설정합니다. 다음 단계에서는 **소스 호스트가 **대상 인스턴스로 전송할 테이블스페이스가 포함된 데이터베이스를 실행하고 있습니다.

**소스 호스트를 설정하는 방법**

1. 소스 호스트에 Oracle 홈의 소유자로 로그인합니다.

1. `ORACLE_HOME` 및 `ORACLE_SID` 환경 변수가 소스 데이터베이스를 가리키는지 확인합니다.

1. 데이터베이스에 관리자로 로그인하고 시간대 버전, DB 문자 세트 및 국가 문자 세트가 대상 데이터베이스와 동일한지 확인합니다.

   ```
   SELECT * FROM V$TIMEZONE_FILE;
   SELECT * FROM NLS_DATABASE_PARAMETERS 
     WHERE PARAMETER IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
   ```

1. [Oracle Support 노트 2471245.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2471245.1)에 설명된 대로 전송 가능한 테이블스페이스 유틸리티를 설정합니다.

   설정에는 소스 호스트의 `xtt.properties` 파일 편집이 포함됩니다. 다음 샘플 `xtt.properties` 파일은 `/dsk1/backups` 디렉터리에 있는 세 개의 테이블스페이스에 대한 백업을 지정합니다. 이는 대상 DB 인스턴스로 전송하려는 테이블스페이스입니다. 또한 엔디안을 자동으로 변환할 소스 플랫폼 ID를 지정합니다.
**참고**  
유효한 플랫폼 ID 정보는 [동일한 Data Guard 구성의 이기종 기본 및 물리적 대기에 대한 Data Guard 지원(문서 ID 413484.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=413484.1)을 참조하세요.

   ```
   #linux system 
   platformid=13
   #list of tablespaces to transport
   tablespaces=TBS1,TBS2,TBS3
   #location where backup will be generated
   src_scratch_location=/dsk1/backups
   #RMAN command for performing backup
   usermantransport=1
   ```

## 2단계: 전체 테이블스페이스 백업 준비
<a name="oracle-migrating-tts.initial-br-phase"></a>

이 단계에서는 테이블스페이스를 처음으로 백업하고 대상 호스트로 백업을 전송한 다음, `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` 프로시저에 따라 테이블스페이스를 복원합니다. 이 단계가 완료되면 초기 테이블스페이스 백업이 대상 DB 인스턴스에 상주하며 증분 백업으로 업데이트할 수 있습니다.

**Topics**
+ [1단계: 소스 호스트의 테이블스페이스 백업](#oracle-migrating-tts.backup-full)
+ [2단계: 백업 파일을 대상 DB 인스턴스로 전송](#oracle-migrating-tts.transfer-full)
+ [3단계: 대상 DB 인스턴스에 테이블스페이스 가져오기](#oracle-migrating-tts.initial-tts-import)

### 1단계: 소스 호스트의 테이블스페이스 백업
<a name="oracle-migrating-tts.backup-full"></a>

이 단계에서는 `xttdriver.pl` 스크립트를 사용하여 테이블스페이스의 전체 백업을 만듭니다. `xttdriver.pl`의 출력은 `TMPDIR` 환경 변수에 저장됩니다.

**테이블스페이스를 백업하는 방법**

1. 테이블스페이스가 읽기 전용 모드인 경우 `ALTER TABLESPACE` 권한이 있는 사용자로 소스 데이터베이스에 로그인하고 테이블스페이스를 읽기/쓰기 모드로 설정합니다. 그렇지 않은 경우 다음 단계로 건너뜁니다.

   다음 예에서는 `tbs1`, `tbs2` 및 `tbs3`를 읽기/쓰기 모드로 설정합니다.

   ```
   ALTER TABLESPACE tbs1 READ WRITE;
   ALTER TABLESPACE tbs2 READ WRITE;
   ALTER TABLESPACE tbs3 READ WRITE;
   ```

1. `xttdriver.pl` 스크립트를 사용하여 테이블스페이스를 백업합니다. 선택적으로 스크립트를 디버그 모드에서 실행하도록 `--debug`를 지정할 수 있습니다.

   ```
   export TMPDIR=location_of_log_files
   cd location_of_xttdriver.pl
   $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup
   ```

### 2단계: 백업 파일을 대상 DB 인스턴스로 전송
<a name="oracle-migrating-tts.transfer-full"></a>

이 단계에서는 스크래치 위치에서 백업 및 구성 파일을 대상 DB 인스턴스로 복사합니다. 다음 옵션 중 하나를 선택하세요.
+ 소스 및 대상 호스트가 Amazon EFS 파일 시스템을 공유하는 경우 `cp` 등의 운영 체제 유틸리티를 사용하여 스크래치 위치에서 백업 파일과 `res.txt` 파일을 공유 디렉터리로 복사합니다. [3단계: 대상 DB 인스턴스에 테이블스페이스 가져오기](#oracle-migrating-tts.initial-tts-import) 단원을 참조하세요.
+ Amazon S3 버킷으로 백업을 스테이징해야 하는 경우 다음 단계를 완료하세요.

![\[Amazon 3 또는 Amazon EFS를 사용하여 파일을 전송합니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/oracle-tts.png)


#### 2.2단계: 백업을 Amazon S3 버킷에 업로드
<a name="oracle-migrating-tts.upload-full"></a>

스크래치 디렉터리의 백업과 `res.txt` 파일을 Amazon S3 버킷에 업로드합니다. 자세한 내용은 **Amazon Simple Storage Service 사용 설명서의 [객체 업로드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)를 참조하세요.

#### 2.3단계: Amazon S3 버킷에서 대상 DB 인스턴스로 백업 다운로드
<a name="oracle-migrating-tts.download-full"></a>

이 단계에서는 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 프로시저를 사용하여 RDS for Oracle DB 인스턴스에 백업을 다운로드합니다.

**Amazon S3 버킷에서 백업을 다운로드하는 방법**

1. SQL\$1Plus 또는 Oracle SQL Developer를 시작하고 RDS for Oracle DB 인스턴스에 로그인합니다.

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

   ```
   EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'res.txt');
   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) 섹션을 참조하세요.

### 3단계: 대상 DB 인스턴스에 테이블스페이스 가져오기
<a name="oracle-migrating-tts.initial-tts-import"></a>

테이블스페이스를 대상 DB 인스턴스로 복원하려면 `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` 프로시저를 사용합니다. 이 프로시저는 데이터 파일을 올바른 엔디안(endian) 형식으로 자동 변환합니다.

Linux 이외의 플랫폼에서 가져오는 경우 `import_xtts_tablespaces` 호출 시 `p_platform_id` 파라미터를 사용하여 소스 플랫폼을 지정합니다. 지정하는 플랫폼 ID가 [2단계: 소스 호스트의 테이블스페이스 메타데이터 내보내기](#oracle-migrating-tts.transport.export)의 `xtt.properties` 파일에서 지정하는 ID와 일치해야 합니다.

**대상 DB 인스턴스에 테이블스페이스 가져오기**

1. Oracle SQL 클라이언트를 시작하고 마스터 사용자로 대상 RDS for Oracle DB 인스턴스에 로그인합니다.

1. 가져올 테이블스페이스와 백업이 포함된 디렉터리를 지정하여 `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` 프로시저를 실행합니다.

   다음 예에서는 *DATA\$1PUMP\$1DIR* 디렉터리에서 *TBS1*, *TBS2* 및 *TBS3* 테이블스페이스를 가져옵니다. 소스 플랫폼은 플랫폼 ID가 `6`인 AIX 기반 시스템(64비트)입니다. `V$TRANSPORTABLE_PLATFORM` 쿼리를 통해 플랫폼 ID를 찾을 수 있습니다.

   ```
   VAR task_id CLOB
   
   BEGIN
     :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces(
           'TBS1,TBS2,TBS3',
           'DATA_PUMP_DIR',
           p_platform_id => 6);
   END;
   /
   
   PRINT task_id
   ```

1. (선택 사항) `rdsadmin.rds_xtts_operation_info` 테이블을 쿼리하여 진행 상황을 모니터링합니다. `xtts_operation_state` 열에는 `EXECUTING`, `COMPLETED` 또는 `FAILED` 값이 표시됩니다.

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```
**참고**  
장기 실행 작업의 경우 `V$SESSION_LONGOPS`, `V$RMAN_STATUS` 및 `V$RMAN_OUTPUT`을 쿼리할 수도 있습니다.

1. 이전 단계의 작업 ID를 사용하여 완료된 가져오기의 로그를 확인합니다.

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));
   ```

   다음 단계로 이동하기 전에 가져오기가 성공적으로 완료되었는지 확인합니다.

## 3단계: 증분 백업 생성 및 전송
<a name="oracle-migrating-tts.roll-forward-phase"></a>

이 단계에서는 소스 데이터베이스가 활성 상태인 동안 정기적으로 증분 백업을 만들어 전송합니다. 이 방법을 사용하면 최종 테이블스페이스 백업의 크기가 줄어듭니다. 증분 백업을 여러 개 수행하는 경우 대상 인스턴스에 적용하려면 먼저 마지막 증분 백업 이후에 `res.txt` 파일을 복사해야 합니다.

가져오기 단계가 선택 사항이라는 점을 제외하고 단계는 [2단계: 전체 테이블스페이스 백업 준비](#oracle-migrating-tts.initial-br-phase)와 동일합니다.

## 4단계: 테이블스페이스 전송
<a name="oracle-migrating-tts.final-br-phase"></a>

이 단계에서는 읽기 전용 테이블스페이스를 백업하고 Data Pump 메타데이터를 내보내고 이러한 파일을 대상 호스트로 전송하고 테이블스페이스와 메타데이터를 모두 가져옵니다.

**Topics**
+ [1단계: 읽기 전용 테이블스페이스 백업](#oracle-migrating-tts.final-backup)
+ [2단계: 소스 호스트의 테이블스페이스 메타데이터 내보내기](#oracle-migrating-tts.transport.export)
+ [3단계: (Amazon S3만 해당) 백업 및 내보내기 파일을 대상 DB 인스턴스로 전송](#oracle-migrating-tts.transport)
+ [4단계: 대상 DB 인스턴스에 테이블스페이스 가져오기](#oracle-migrating-tts.restore-full)
+ [5단계: 대상 DB 인스턴스에 테이블스페이스 메타데이터 가져오기](#oracle-migrating-tts.transport.import-dmp)

### 1단계: 읽기 전용 테이블스페이스 백업
<a name="oracle-migrating-tts.final-backup"></a>

이 단계는 [1단계: 소스 호스트의 테이블스페이스 백업](#oracle-migrating-tts.backup-full)과 동일하지만 한 가지 차이점은 테이블스페이스를 마지막으로 백업하기 전에 테이블스페이스를 읽기 전용 모드로 설정한다는 점입니다.

다음 예에서는 `tbs1`, `tbs2` 및 `tbs3`를 읽기 전용 모드로 설정합니다.

```
ALTER TABLESPACE tbs1 READ ONLY;
ALTER TABLESPACE tbs2 READ ONLY;
ALTER TABLESPACE tbs3 READ ONLY;
```

### 2단계: 소스 호스트의 테이블스페이스 메타데이터 내보내기
<a name="oracle-migrating-tts.transport.export"></a>

소스 호스트에서 `expdb` 유틸리티를 실행하여 테이블스페이스 메타데이터를 내보냅니다. 다음 예에서는 *DATA\$1PUMP\$1DIR* 디렉터리의 *TBS1*, *TBS2*, *TBS3* 테이블스페이스를 *xttdump.dmp* 덤프 파일로 내보냅니다.

```
expdp username/pwd \
dumpfile=xttdump.dmp \
directory=DATA_PUMP_DIR \
statistics=NONE \
transport_tablespaces=TBS1,TBS2,TBS3 \
transport_full_check=y \
logfile=tts_export.log
```

*DATA\$1PUMP\$1DIR*이 Amazon EFS의 공유 디렉터리인 경우 [4단계: 대상 DB 인스턴스에 테이블스페이스 가져오기](#oracle-migrating-tts.restore-full)로 건너뛰세요.

### 3단계: (Amazon S3만 해당) 백업 및 내보내기 파일을 대상 DB 인스턴스로 전송
<a name="oracle-migrating-tts.transport"></a>

Amazon S3를 사용하여 테이블스페이스 백업과 Data pump 내보내기 파일을 스테이징하려면 다음 단계를 완료하세요.

#### 3.1단계: 소스 호스트에서 Amazon S3 버킷으로 백업 및 덤프 파일 업로드
<a name="oracle-migrating-tts.transport.upload-dmp"></a>

소스 호스트에서 Amazon S3 버킷으로 백업 및 덤프 파일을 업로드합니다. 자세한 내용은 **Amazon Simple Storage Service 사용 설명서의 [객체 업로드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)를 참조하세요.

#### 3.2단계: Amazon S3 버킷에서 대상 DB 인스턴스로 백업 및 덤프 파일 다운로드
<a name="oracle-migrating-tts.transport.download-dmp"></a>

이 단계에서는 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 프로시저를 사용하여 RDS for Oracle DB 인스턴스에 백업 및 덤프 파일을 다운로드합니다. [2.3단계: Amazon S3 버킷에서 대상 DB 인스턴스로 백업 다운로드](#oracle-migrating-tts.download-full) 섹션의 단계를 따르세요.

### 4단계: 대상 DB 인스턴스에 테이블스페이스 가져오기
<a name="oracle-migrating-tts.restore-full"></a>

`rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` 프로시저를 사용하여 테이블스페이스를 복원합니다. 이 프로시저의 구문 및 의미는 [전송된 테이블스페이스를 DB 인스턴스로 가져오기](rdsadmin_transport_util_import_xtts_tablespaces.md) 섹션을 참조하세요.

**중요**  
최종 테이블스페이스 가져오기를 완료한 후 다음 단계는 [Oracle Data Pump 메타데이터를 가져오는 것](#oracle-migrating-tts.transport.export)입니다. 가져오기에 실패할 경우 DB 인스턴스를 실패 이전 상태로 되돌리는 것이 중요합니다. 따라서 [Amazon RDS의 단일 AZ DB 인스턴스에 대한 DB 스냅샷 생성](USER_CreateSnapshot.md)의 지침에 따라 DB 인스턴스의 DB 스냅샷을 만드는 것이 좋습니다. 스냅샷에는 가져온 테이블스페이스가 모두 포함되므로 가져오기가 실패할 경우 백업 및 가져오기 프로세스를 반복하지 않아도 됩니다.  
대상 DB 인스턴스에 자동 백업이 켜져 있는데 메타데이터를 가져오기 전에 Amazon RDS가 유효한 스냅샷이 시작되었음을 감지하지 못하면 RDS는 스냅샷 생성을 시도합니다. 인스턴스 활동에 따라 이 스냅샷은 성공하거나 실패할 수 있습니다. 유효한 스냅샷이 검색되지 않거나 스냅샷을 시작할 수 없는 경우 메타데이터 가져오기가 오류와 함께 종료됩니다.

**대상 DB 인스턴스에 테이블스페이스 가져오기**

1. Oracle SQL 클라이언트를 시작하고 마스터 사용자로 대상 RDS for Oracle DB 인스턴스에 로그인합니다.

1. 가져올 테이블스페이스와 백업이 포함된 디렉터리를 지정하여 `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` 프로시저를 실행합니다.

   다음 예에서는 *DATA\$1PUMP\$1DIR* 디렉터리에서 *TBS1*, *TBS2* 및 *TBS3* 테이블스페이스를 가져옵니다.

   ```
   BEGIN
     :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces('TBS1,TBS2,TBS3','DATA_PUMP_DIR');
   END;
   /
   PRINT task_id
   ```

1. (선택 사항) `rdsadmin.rds_xtts_operation_info` 테이블을 쿼리하여 진행 상황을 모니터링합니다. `xtts_operation_state` 열에는 `EXECUTING`, `COMPLETED` 또는 `FAILED` 값이 표시됩니다.

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```
**참고**  
장기 실행 작업의 경우 `V$SESSION_LONGOPS`, `V$RMAN_STATUS` 및 `V$RMAN_OUTPUT`을 쿼리할 수도 있습니다.

1. 이전 단계의 작업 ID를 사용하여 완료된 가져오기의 로그를 확인합니다.

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));
   ```

   다음 단계로 이동하기 전에 가져오기가 성공적으로 완료되었는지 확인합니다.

1. [Amazon RDS의 단일 AZ DB 인스턴스에 대한 DB 스냅샷 생성](USER_CreateSnapshot.md)의 지침에 따라 수동 DB 스냅샷을 생성합니다.

### 5단계: 대상 DB 인스턴스에 테이블스페이스 메타데이터 가져오기
<a name="oracle-migrating-tts.transport.import-dmp"></a>

이 단계에서는 `rdsadmin.rdsadmin_transport_util.import_xtts_metadata` 프로시저에 따라 전송 가능한 테이블스페이스 메타데이터를 RDS for Oracle DB 인스턴스로 가져옵니다. 이 프로시저의 구문 및 의미는 [전송 가능한 테이블스페이스를 DB 인스턴스로 가져오기](rdsadmin_transport_util_import_xtts_metadata.md) 섹션을 참조하세요. 작업 중에는 가져오기 상태가 `rdsadmin.rds_xtts_operation_info` 테이블에 표시됩니다.

**중요**  
메타데이터를 가져오기 전에 테이블스페이스를 가져온 후 DB 스냅샷이 성공적으로 생성되었는지 확인하는 것이 좋습니다. 가져오기 단계가 실패하면 DB 인스턴스를 복원하고 가져오기 오류를 해결한 다음 가져오기를 다시 시도하세요.

**RDS for Oracle DB 인스턴스로 Data Pump 메타데이터 가져오기**

1. Oracle SQL 클라이언트를 시작하고 마스터 사용자로 대상 DB 인스턴스에 로그인합니다.

1. 전송된 테이블스페이스에 스키마를 소유하는 사용자가 아직 없다면 생성합니다.

   ```
   CREATE USER tbs_owner IDENTIFIED BY password;
   ```

1. 덤프 파일의 이름과 디렉터리 위치를 지정하여 메타데이터를 가져옵니다.

   ```
   BEGIN
     rdsadmin.rdsadmin_transport_util.import_xtts_metadata('xttdump.dmp','DATA_PUMP_DIR');
   END;
   /
   ```

1. (선택 사항) 전송 가능한 테이블스페이스 기록 테이블을 쿼리하여 메타데이터 가져오기 상태를 확인합니다.

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```

   작업이 완료되면 테이블스페이스가 읽기 전용 모드가 됩니다.

1. (선택 사항) 로그 파일을 확인합니다.

   다음 예에서는 BDUMP 디렉터리의 내용을 나열한 다음 가져오기 로그를 쿼리합니다.

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP'));
   
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file(
     p_directory => 'BDUMP',
     p_filename => 'rds-xtts-import_xtts_metadata-2023-05-22.01-52-35.560858000.log'));
   ```

## 5단계: 전송된 테이블스페이스 검증
<a name="oracle-migrating-tts.validate"></a>

이 선택적 단계에서는 `rdsadmin.rdsadmin_rman_util.validate_tablespace` 프로시저를 사용하여 전송된 테이블스페이스를 검증한 다음 테이블스페이스를 읽기/쓰기 모드로 설정합니다.

**전송된 데이터를 검증하는 방법**

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

1. `rdsadmin.rdsadmin_rman_util.validate_tablespace` 프로시저를 사용하여 테이블스페이스를 검증합니다.

   ```
   SET SERVEROUTPUT ON
   BEGIN
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS1',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS2',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS3',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
   END;
   /
   ```

1. 테이블스페이스를 읽기/쓰기 모드로 설정합니다.

   ```
   ALTER TABLESPACE TBS1 READ WRITE;
   ALTER TABLESPACE TBS2 READ WRITE;
   ALTER TABLESPACE TBS3 READ WRITE;
   ```

## 6단계: 남은 파일 정리
<a name="oracle-migrating-tts.cleanup"></a>

이 선택적 단계에서는 불필요한 파일을 모두 제거합니다. `rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files` 프로시저를 사용하여 테이블스페이스 가져오기 후 분리된 데이터 파일을 나열한 다음, `rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files` 프로시저를 사용하여 삭제합니다. 이 프로시저의 구문 및 의미는 [테이블스페이스 가져오기 후 분리된 파일 나열](rdsadmin_transport_util_list_xtts_orphan_files.md) 및 [테이블스페이스 가져오기 후 분리된 파일 삭제](rdsadmin_transport_util_cleanup_incomplete_xtts_import.md) 섹션을 참조하세요.

**남은 파일을 정리하는 방법**

1. 다음과 같이 *DATA\$1PUMP\$1DIR*에서 오래된 백업을 제거합니다.

   1. `rdsadmin.rdsadmin_file_util.listdir`을 실행하여 백업 파일을 나열합니다.

      ```
      SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
      ```

   1. `UTL_FILE.FREMOVE`를 호출하여 백업을 하나씩 제거합니다.

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

1. 테이블스페이스를 가져왔지만 테이블스페이스에 대한 메타데이터를 가져오지 않은 경우 다음과 같이 분리된 데이터 파일을 삭제할 수 있습니다.

   1. 삭제해야 하는 분리된 데이터 파일을 나열합니다. 다음 예에서는 `rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files` 프로시저를 호출합니다.

      ```
      SQL> SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files);
      
      FILENAME       FILESIZE
      -------------- ---------
      datafile_7.dbf 104865792
      datafile_8.dbf 104865792
      ```

   1. `rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import` 프로시저를 실행하여 분리된 파일을 삭제합니다.

      ```
      BEGIN
        rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import('DATA_PUMP_DIR');
      END;
      /
      ```

      정리 작업을 수행하면 `BDUMP` 디렉터리에 `rds-xtts-delete_xtts_orphaned_files-YYYY-MM-DD.HH24-MI-SS.FF.log` 이름 형식을 사용하는 로그 파일이 생성됩니다.

   1. 이전 단계에서 생성된 로그 파일을 읽습니다. 다음 예에서는 `rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log` 로그를 읽습니다.

      ```
      SELECT * 
      FROM TABLE(rdsadmin.rds_file_util.read_text_file(
             p_directory => 'BDUMP',
             p_filename  => 'rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log'));
      
      TEXT
      --------------------------------------------------------------------------------
      orphan transported datafile datafile_7.dbf deleted.
      orphan transported datafile datafile_8.dbf deleted.
      ```

1. 테이블스페이스를 가져오고 테이블스페이스에 대한 메타데이터도 가져왔지만 호환성 오류나 기타 Oracle Data Pump 문제가 발생한 경우 부분적으로 전송된 데이터 파일을 다음과 같이 정리하세요.

   1. `DBA_TABLESPACES`를 쿼리하여 부분적으로 전송된 데이터 파일이 포함된 테이블스페이스를 나열합니다.

      ```
      SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE PLUGGED_IN='YES';
      
      TABLESPACE_NAME
      --------------------------------------------------------------------------------
      TBS_3
      ```

   1. 테이블스페이스와 부분적으로 전송된 데이터 파일을 삭제합니다.

      ```
      DROP TABLESPACE TBS_3 INCLUDING CONTENTS AND DATAFILES;
      ```

# 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'); 
```

# Oracle 내보내기/가져오기를 통해 가져오기
<a name="Oracle.Procedural.Importing.ExportImport"></a>

다음 조건에서는 Oracle 내보내기/가져오기 유틸리티를 마이그레이션에 사용하는 것이 효과적일 수도 있습니다.
+ 데이터 크기가 작습니다.
+ 이진 플로트 및 더블과 같은 데이터 유형은 필요하지 않습니다.

가져오기 프로세스는 필요한 스키마 객체를 생성합니다. 따라서 객체를 생성하기 위해 스크립트를 먼저 실행할 필요가 없습니다.

내보내기 및 가져오기 유틸리티로 Oracle Instant Client를 설치하기 위한 가장 쉬운 방법은 Oracle을 설치하는 것입니다. 소프트웨어를 다운로드하려면 [https://www.oracle.com/database/technologies/instant-client.html](https://www.oracle.com/database/technologies/instant-client.html)을 방문하세요. 설명서를 보려면 *Oracle Database 유틸리티* 설명서의 [SQL\$1Loader, 내보내기, 가져오기를 위한 Instant Client](https://docs.oracle.com/en/database/oracle/oracle-database/21/sutil/instant-client-sql-loader-export-import.html#GUID-FF1B6F75-09F5-4911-9317-9776FAD15965)를 참조하세요.

**테이블을 내보낸 다음 가져오기**

1. `exp` 명령을 사용하여 소스 데이터베이스에서 테이블을 내보냅니다.

   다음 명령은 `tab1`, `tab2` 및 `tab3`이라는 테이블을 내보냅니다. 덤프 파일은 `exp_file.dmp`입니다.

   ```
   exp cust_dba@ORCL FILE=exp_file.dmp TABLES=(tab1,tab2,tab3) LOG=exp_file.log
   ```

   내보내기 프로세스에서는 지정된 테이블에 대한 스키마 및 데이터를 모두 포함하는 이진 덤프 파일을 생성합니다.

1. 이제 `imp` 명령을 사용하여 이 스키마와 데이터를 대상 데이터베이스로 가져옵니다.

   다음 명령을 실행하면 덤프 파일 `exp_file.dmp`에서 `tab1`, `tab2`, `tab3` 테이블을 가져옵니다.

   ```
   imp cust_dba@targetdb FROMUSER=cust_schema TOUSER=cust_schema \  
   TABLES=(tab1,tab2,tab3) FILE=exp_file.dmp LOG=imp_file.log
   ```

사용자의 필요에 맞게 여러 버전의 내보내기 및 가져오기가 있습니다. 자세한 내용은 Oracle 설명서를 참조하십시오.

# Oracle SQL\$1Loader를 사용하여 가져오기
<a name="Oracle.Procedural.Importing.SQLLoader"></a>

객체 수가 제한되어 있는 대규모 데이터베이스의 경우 Oracle SQL\$1Loader를 사용할 수도 있습니다. 원본 데이터베이스에서 내보내고 대상 데이터베이스로 로드하는 프로세스는 스키마와 매우 밀접한 관계가 있으므로, 다음 예에서는 샘플 스키마 객체를 생성하여 원본에서 내보내고 대상 데이터베이스에 로드합니다.

Oracle SQL\$1Loader를 설치하는 가장 쉬운 방법은 Oracle Instant Client를 설치하는 것입니다. 소프트웨어를 다운로드하려면 [https://www.oracle.com/database/technologies/instant-client.html](https://www.oracle.com/database/technologies/instant-client.html)을 방문하세요. 설명서를 보려면 *Oracle Database 유틸리티* 설명서의 [SQL\$1Loader, 내보내기, 가져오기를 위한 Instant Client](https://docs.oracle.com/en/database/oracle/oracle-database/21/sutil/instant-client-sql-loader-export-import.html#GUID-FF1B6F75-09F5-4911-9317-9776FAD15965)를 참조하세요.

**Oracle SQL\$1Loader를 사용하여 데이터를 가져오려면**

1. 다음 SQL 문을 사용해 샘플 원본 테이블을 생성합니다.

   ```
   CREATE TABLE customer_0 TABLESPACE users 
      AS (SELECT ROWNUM id, o.* 
          FROM   ALL_OBJECTS o, ALL_OBJECTS x 
          WHERE  ROWNUM <= 1000000);
   ```

1. 대상 RDS for Oracle DB 인스턴스에서 데이터를 로드하는 데 사용되는 대상 테이블을 생성합니다. `WHERE 1=2` 절을 사용하면 `ALL_OBJECTS`의 구조를 복사하지만 행은 복사하지 않게 됩니다.

   ```
   CREATE TABLE customer_1 TABLESPACE users 
     AS (SELECT 0 AS ID, OWNER, OBJECT_NAME, CREATED
         FROM   ALL_OBJECTS
         WHERE  1=2);
   ```

1. 원본 데이터베이스의 데이터를 텍스트 파일로 내보냅니다. 다음 예에서는 SQL\$1Plus를 사용합니다. 실제 데이터의 경우 대개 데이터베이스의 모든 객체에 대한 내보내기를 수행하는 스크립트를 생성해야 할 것입니다.

   ```
   ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS'
   
   SET LINESIZE 800 HEADING OFF FEEDBACK OFF ARRAY 5000 PAGESIZE 0
   SPOOL customer_0.out 
   SET MARKUP HTML PREFORMAT ON
   SET COLSEP ','
   
   SELECT id, owner, object_name, created 
   FROM   customer_0; 
   
   SPOOL OFF
   ```

1. 데이터를 설명하는 제어 파일을 생성해야 합니다. 이 단계를 수행하려면 스크립트를 작성해야 할 수 있습니다.

   ```
   cat << EOF > sqlldr_1.ctl 
   load data
   infile customer_0.out
   into table customer_1
   APPEND
   fields terminated by "," optionally enclosed by '"'
   (
     id           POSITION(01:10)    INTEGER EXTERNAL,
     owner        POSITION(12:41)    CHAR,
     object_name  POSITION(43:72)    CHAR,
     created      POSITION(74:92)    date "YYYY/MM/DD HH24:MI:SS"
   )
   ```

   필요할 경우 이전 코드에서 생성된 파일을 Amazon EC2 인스턴스 등의 스테이징 영역으로 복사합니다.

1. 대상 데이터베이스에 대한 적절한 사용자 이름 및 암호와 함께 SQL\$1Loader를 사용하여 데이터를 가져옵니다.

   ```
   sqlldr cust_dba@targetdb CONTROL=sqlldr_1.ctl BINDSIZE=10485760 READSIZE=10485760 ROWS=1000 
   ```

# Oracle 구체화된 보기로 마이그레이션
<a name="Oracle.Procedural.Importing.Materialized"></a>

Oracle 구체화된 보기 복제를 사용하여 최신 데이터 세트를 효율적으로 마이그레이션할 수 있습니다. 복제를 사용하면 대상 테이블을 원본 테이블과 동기화된 상태로 유지할 수 있습니다. 따라서 필요한 경우 나중에 Amazon RDS로 전환할 수 있습니다.

구체화된 보기로 마이그레이션하려면 먼저 다음 요구 사항을 충족해야 합니다.
+ 대상 데이터베이스에서 원본 데이터베이스로의 액세스를 구성합니다. 다음 예에서는 SQL\$1Net을 통해 RDS for Oracle 대상 데이터베이스가 원본에 연결할 수 있도록 원본 데이터베이스에서 액세스 규칙이 활성화되었습니다.
+ RDS for Oracle DB 인스턴스에서 원본 데이터베이스로 연결되는 데이터베이스 링크를 생성합니다.

**구체화된 보기를 사용하여 데이터 마이그레이션**

1. 원본 및 RDS for Oracle 대상 인스턴스 모두에서 동일한 암호로 인증할 수 있는 사용자 계정을 생성합니다. 다음 예에서는 이름이 `dblink_user`인 사용자를 생성합니다.

   ```
   CREATE USER dblink_user IDENTIFIED BY my-password
     DEFAULT TABLESPACE users
     TEMPORARY TABLESPACE temp;
      
   GRANT CREATE SESSION TO dblink_user;
   
   GRANT SELECT ANY TABLE TO dblink_user;
   
   GRANT SELECT ANY DICTIONARY TO dblink_user;
   ```
**참고**  
보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

1. 새로 생성된 사용자를 사용하여 RDS for Oracle 대상 인스턴스에서 원본 인스턴스로의 데이터베이스 링크를 생성합니다.

   ```
   CREATE DATABASE LINK remote_site
     CONNECT TO dblink_user IDENTIFIED BY my-password
     USING '(description=(address=(protocol=tcp) (host=my-host) 
       (port=my-listener-port)) (connect_data=(sid=my-source-db-sid)))';
   ```
**참고**  
보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

1. 링크를 테스트합니다.

   ```
   SELECT * FROM V$INSTANCE@remote_site;
   ```

1. 원본 인스턴스에서 주 키와 구체화 보기 로그를 사용하여 샘플 테이블을 생성합니다.

   ```
   CREATE TABLE customer_0 TABLESPACE users 
     AS (SELECT ROWNUM id, o.* 
         FROM   ALL_OBJECTS o, ALL_OBJECTS x
         WHERE  ROWNUM <= 1000000);
   
   ALTER TABLE customer_0 ADD CONSTRAINT pk_customer_0 PRIMARY KEY (id) USING INDEX;
   
   CREATE MATERIALIZED VIEW LOG ON customer_0;
   ```

1. 대상 RDS for Oracle DB 인스턴스에서 구체화된 보기를 생성합니다.

   ```
   CREATE MATERIALIZED VIEW customer_0 
     BUILD IMMEDIATE REFRESH FAST 
     AS (SELECT * 
         FROM   cust_dba.customer_0@remote_site);
   ```

1. 대상 RDS for Oracle DB 인스턴스에서 구체화된 보기를 새로 고칩니다.

   ```
   EXEC DBMS_MVIEW.REFRESH('CUSTOMER_0', 'f');
   ```

1. 구체화된 보기를 삭제하고 `PRESERVE TABLE` 절을 포함하여 구체화된 보기 컨테이너 테이블과 그 내용을 보관합니다.

   ```
   DROP MATERIALIZED VIEW customer_0 PRESERVE TABLE;
   ```

   보관한 테이블에는 끊긴 구체화된 보기와 같은 이름이 있습니다.