Amazon RDS의 Oracle로 데이터 가져오기 - Amazon Relational Database Service

Amazon RDS의 Oracle로 데이터 가져오기

Amazon RDS DB 인스턴스로 데이터를 가져오는 방법은 다음 사항에 따라 다릅니다.

  • 보유하고 있는 데이터의 양

  • 데이터베이스의 데이터베이스 객체 수

  • 데이터베이스의 데이터베이스 객체 다양성

예를 들어 다음 메커니즘을 사용합니다.

중요

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

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

다음 동영상은 Oracle 마이그레이션 기술에 대한 유용한 정보를 제공합니다.

Oracle SQL Developer를 사용한 가져오기

작은 데이터베이스의 경우 Oracle에서 무상으로 배포한 그래픽 Java 도구인 Oracle SQL Developer를 사용할 수 있습니다. 데스크톱 컴퓨터(Windows, Linux 또는 Mac) 또는 서버 중 하나에 이 도구를 설치할 수 있습니다. Oracle SQL Developer는 두 Oracle 데이터베이스 간의 데이터 마이그레이션이나 MySQL 등의 다른 데이터베이스에서 Oracle로 데이터 마이그레이션을 위한 옵션을 제공합니다. Oracle SQL Developer는 작은 데이터베이스를 마이그레이션하는 데 매우 적합합니다. 데이터 마이그레이션을 시작하기 전에 Oracle SQL Developer 제품을 읽는 것이 좋습니다.

SQL Developer를 설치한 후에는 SQL Developer를 사용하여 원본 및 대상 데이터베이스에 연결할 수 있습니다. Tools(도구) 메뉴의 Database Copy(데이터베이스 복사) 명령을 사용하여 데이터를 Amazon RDS 인스턴스에 복사합니다.

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

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

Oracle Data Pump를 사용한 가져오기

Oracle Data Pump는 Oracle 내보내기/가져오기 유틸리티를 장기적으로 대체합니다. Oracle Data Pump는 Oracle 설치에서 Amazon RDS DB 인스턴스로 대량의 데이터를 이동하는 기본적인 방법입니다. 다음과 같은 여러 시나리오에 대해 Oracle Data Pump를 사용할 수 있습니다.

  • Oracle 데이터베이스(온프레미스 또는 Amazon EC2 인스턴스 중 하나)에서 Amazon 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 Database 소프트웨어 다운로드를 참조하십시오.

Oracle 데이터베이스 버전 간에 마이그레이션할 때 호환성 고려 사항은 Oracle 설명서를 참조하십시오.

Oracle Data Pump를 사용하여 데이터를 가져올 때는 소스 데이터베이스의 데이터가 포함된 덤프 파일을 대상 데이터베이스로 전송해야 합니다. Amazon S3 버킷을 사용하거나 두 데이터베이스 간 데이터베이스 링크를 사용하여 덤프 파일을 전송할 수 있습니다.

Oracle Data Pump를 사용하여 데이터를 Oracle DB 인스턴스로 가져오는 경우 다음과 같은 모범 사례를 사용하는 것이 좋습니다.

  • 특정 스키마 및 객체를 가져오려면 schema 또는 table 모드로 가져오기를 수행하십시오.

  • 가져오는 스키마를 애플리케이션에 필요한 스키마로 제한하십시오.

  • full 모드에서 가져오지 않습니다.

    Amazon RDS for Oracle은 SYS 또는 SYSDBA 관리 사용자에 대한 액세스를 허용하지 않으므로 full 모드로 가져오거나 Oracle에서 관리하는 구성 요소에 대한 스키마를 가져오면 Oracle 데이터 사전을 손상시키고 데이터베이스의 안정성에 영향을 줄 수 있습니다.

  • 대량의 데이터를 로드할 경우 다음을 수행합니다.

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

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

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

    데이터베이스 구성 요소가 무효화된 경우 DB 인스턴스를 삭제하고 DB 스냅샷에서 다시 생성할 수 있습니다. 복원된 DB 인스턴스에는 DB 스냅샷을 가져왔을 때 DB 인스턴스에 준비된 모든 덤프 파일이 포함됩니다.

  • Oracle Data Pump 내보내기 파라미터 TRANSPORT_TABLESPACES, TRANSPORTABLE 또는 TRANSPORT_FULL_CHECK를 사용하여 생성된 덤프 파일을 가져오지 마세요. Amazon RDS for Oracle DB 인스턴스는 이러한 덤프 파일 가져오기를 지원하지 않습니다.

  • SYS, SYSTEM, RDSADMIN, RDSSECRDS_DATAGUARD에 Oracle 스케줄러 객체가 포함되어 있고 다음 범주에 속하는 덤프 파일은 가져오지 마세요.

    • 작업

    • 프로그램

    • Schedules

    • 체인

    • 규칙

    • 평가 컨텍스트

    • 규칙 세트

    Amazon RDS for Oracle DB 인스턴스는 이러한 덤프 파일 가져오기를 지원하지 않습니다.

참고

지원되지 않는 Scheduler 객체를 제외하려면 Data Pump 내보내기 중에 추가 지시문을 사용합니다. DBMS_DATAPUMP를 사용하는 경우 METADATA_FILTER 앞에 추가 DBMS_METADATA.START_JOB을 추가합니다.

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를 사용하는 경우 다음 예제에 표시된 제외 지시문이 포함된 파라미터 파일을 생성합니다. 그런 다음 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 데이터베이스로 가져오는 한 가지 방법을 보여 줍니다. 그러나 Oracle Data Pump는 여러 가지 방법으로 데이터를 가져올 수 있습니다. Oracle Data Pump에 대한 자세한 내용은 Oracle Database 설명서를 참조하세요.

이 부분의 예제에서는 DBMS_DATAPUMP 패키지를 사용합니다. Oracle Data Pump 명령줄 유틸리티 impdpexpdp를 사용하여 동일한 작업을 수행할 수 있습니다. Oracle 인스턴트 클라이언트를 포함하여 Oracle 클라이언트 설치의 일부로 원격 호스트에 이러한 유틸리티를 설치할 수 있습니다.

Oracle Data Pump와 Amazon S3 버킷으로 데이터 가져오기

다음 가져오기 프로세스에서는 Oracle Data Pump와 Amazon S3 버킷을 사용합니다. 이 프로세스는 Oracle DBMS_DATAPUMP 패키지를 사용하여 소스 데이터베이스에서 데이터를 내보내고, 덤프 파일을 Amazon S3 버킷에 넣습니다. 그런 다음 덤프 파일을 Amazon S3 버킷에서 대상 Amazon RDS for Oracle DB 인스턴스의 DATA_PUMP_DIR 디렉터리로 다운로드합니다. 마지막 단계에서는 DBMS_DATAPUMP 패키지를 사용하여 복사된 덤프 파일의 데이터를 Amazon RDS for Oracle DB 인스턴스로 가져옵니다.

이 프로세스를 수행하려면 다음 요구 사항이 충족되어야 합니다.

  • 파일 전송에 사용할 수 있는 Amazon S3 버킷이 있어야 하고 Amazon S3 버킷은 DB 인스턴스와 동일한 AWS 리전에 있어야 합니다. 지침을 보려면 Amazon Simple Storage Service 시작 안내서에서 버킷 생성을 참조하십시오.

  • Amazon S3 버킷에 업로드하는 객체는 5TB 이하여야 합니다. Amazon S3에서의 객체 작업에 대한 자세한 내용은 Amazon Simple Storage Service 개발자 가이드 단원을 참조하십시오.

    참고

    덤프 파일이 5TB를 초과하면 병렬 옵션을 사용하여 Oracle Data Pump 내보내기를 실행할 수 있습니다. 이 작업은 개별 파일에 대해 5TB 제한을 초과하지 않도록 데이터를 여러 덤프 파일로 분산합니다.

  • Amazon RDS for Oracle과 Amazon S3의 통합을 위한 사전 요구 사항의 지침에 따라 Amazon RDS 통합을 위한 Amazon S3 버킷을 준비해야 합니다.

  • 원본 인스턴스 및 대상 DB 인스턴스에 덤프 파일을 저장할 수 있는 충분한 스토리지 공간이 있는지 확인해야 합니다.

참고

이 프로세스는 덤프 파일을 모든 Oracle DB 인스턴스의 사전 구성된 디렉터리인 DATA_PUMP_DIR 디렉터리로 가져옵니다. 이 디렉터리는 데이터 파일과 동일한 스토리지 볼륨에 위치합니다. 덤프 파일을 가져올 때 기존 Oracle 데이터 파일은 더 많은 공간을 사용합니다. 따라서 DB 인스턴스가 공간의 추가 사용을 수용할 수 있는지 확인해야 합니다. 가져온 덤프 파일은 자동으로 삭제되거나 DATA_PUMP_DIR 디렉터리에서 제거됩니다. 가져온 덤프 파일을 제거하려면 Oracle 웹사이트에 있는 UTL_FILE.FREMOVE를 사용하십시오.

Oracle Data Pump 및 Amazon S3 버킷을 사용하는 가져오기 프로세스는 다음 단계로 이루어집니다.

1단계: Amazon RDS 대상 인스턴스의 사용자에게 권한 부여

RDS 대상 인스턴스에서 사용자에게 권한을 부여하려면 다음 단계를 수행하십시오.

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

  2. 데이터를 가져오려면 먼저 테이블 스페이스를 생성해야 합니다. 자세한 내용은 테이블스페이스 생성과 크기 조정 섹션을 참조하세요.

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

    예를 들어 다음은 새로운 사용자를 생성한 후 데이터를 해당 사용자의 스키마로 가져오기 위해 필요한 권한과 역할을 부여하는 명령입니다.

    CREATE USER schema_1 IDENTIFIED BY <password>; GRANT CREATE SESSION, RESOURCE TO schema_1; ALTER USER schema_1 QUOTA 100M ON users;

    위 예제에서는 새로운 사용자에게 CREATE SESSION 권한과 RESOURCE 역할을 부여합니다. 하지만 가져오는 데이터베이스 객체에 따라 권한과 역할이 추가로 필요할 수도 있습니다.

    참고

    다음 단계에서 schema_1을 이 단계의 스키마 이름으로 대체합니다.

2단계: DBMS_DATAPUMP를 사용하여 덤프 파일 생성

SQL Plus 또는 Oracle SQL Developer를 사용하여 관리 사용자 권한으로 원본 Oracle 인스턴스에 연결합니다. 소스 데이터베이스가 Amazon RDS for Oracle DB 인스턴스인 경우 Amazon RDS 마스터 사용자 권한으로 연결합니다. 그런 다음 Oracle Data Pump 유틸리티를 사용하여 덤프 파일을 생성합니다.

다음 스크립트는 DATA_PUMP_DIR 스키마가 포함된 SCHEMA_1 디렉터리에 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를 참조하십시오. rdsadmin.rds_file_util.read_text_file 절차를 사용하여 내보내기 로그의 내용을 볼 수 있습니다. 자세한 내용은 DB 인스턴스 디렉터리의 파일 목록 읽기 섹션을 참조하세요.

3단계: 덤프 파일을 Amazon S3 버킷에 업로드

덤프 파일을 Amazon S3 버킷에 업로드합니다.

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

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 'mys3bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

SELECT 문은 VARCHAR2 데이터 형식으로 작업 ID를 반환합니다.

자세한 내용은 Oracle DB 인스턴스에서 Amazon S3 버킷으로 파일 업로드 섹션을 참조하세요.

4단계: 내보낸 덤프 파일을 Amazon S3 버킷에서 대상 DB 인스턴스로 복사

SQL Plus 또는 Oracle SQL Developer를 사용하여 Amazon RDS 대상 Oracle DB 인스턴스에 연결합니다. 다음으로 Amazon RDS 프로시저 rdsadmin.rdsadmin_s3_tasks.download_from_s3를 사용하여 덤프 파일을 Amazon S3 버킷에서 대상 DB 인스턴스로 복사합니다. 다음 예제에서는 mys3bucket이라는 이름의 Amazon S3 버킷에서 모든 파일을 DATA_PUMP_DIR 디렉터리로 다운로드합니다.

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'mys3bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

SELECT 문은 VARCHAR2 데이터 형식으로 작업 ID를 반환합니다.

자세한 내용은 Amazon S3 버킷의 파일을 Oracle DB 인스턴스로 다운로드 섹션을 참조하세요.

5단계: DBMS_DATAPUMP를 사용하여 대상 DB 인스턴스의 데이터 파일 가져오기

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

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를 참조하십시오. rdsadmin.rds_file_util.read_text_file 절차를 사용하여 가져오기 로그의 내용을 볼 수 있습니다. 자세한 내용은 DB 인스턴스 디렉터리의 파일 목록 읽기 섹션을 참조하세요.

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

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

6단계: 정리

데이터를 가져온 후에는 유지하지 않을 파일을 삭제할 수 있습니다. 다음 명령을 사용하여 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 Data Pump 및 Oracle DBMS_FILE_TRANSFER 패키지를 사용합니다. 이 프로세스에서는 소스 Oracle 인스턴스(온프레미스 또는 Amazon EC2 인스턴스이거나 Amazon RDS Oracle DB 인스턴스일 수 있음)에 연결합니다. 그런 다음 프로세스가 DBMS_DATAPUMP 패키지를 사용하여 데이터를 내보냅니다. 다음으로, DBMS_FILE_TRANSFER.PUT_FILE 메서드를 사용하여 Oracle 인스턴스의 덤프 파일을 데이터베이스 링크를 통해 연결된 대상 Amazon RDS for Oracle DB 인스턴스의 DATA_PUMP_DIR 디렉터리로 복사합니다. 마지막 단계에서는 DBMS_DATAPUMP 패키지를 사용하여 복사된 덤프 파일의 데이터를 Amazon RDS for Oracle DB 인스턴스로 가져옵니다.

이 프로세스를 수행하려면 다음 요구 사항이 충족되어야 합니다.

  • DBMS_FILE_TRANSFERDBMS_DATAPUMP 패키지에 대한 실행 권한이 있어야 합니다.

  • 원본 DB 인스턴스의 DATA_PUMP_DIR 디렉터리에 대한 쓰기 권한이 있어야 합니다.

  • 원본 인스턴스 및 대상 DB 인스턴스에 덤프 파일을 저장할 수 있는 충분한 스토리지 공간이 있는지 확인해야 합니다.

참고

이 프로세스는 덤프 파일을 모든 Oracle DB 인스턴스의 사전 구성된 디렉터리인 DATA_PUMP_DIR 디렉터리로 가져옵니다. 이 디렉터리는 데이터 파일과 동일한 스토리지 볼륨에 위치합니다. 덤프 파일을 가져올 때 기존 Oracle 데이터 파일은 더 많은 공간을 사용합니다. 따라서 DB 인스턴스가 공간의 추가 사용을 수용할 수 있는지 확인해야 합니다. 가져온 덤프 파일은 자동으로 삭제되거나 DATA_PUMP_DIR 디렉터리에서 제거됩니다. 가져온 덤프 파일을 제거하려면 Oracle 웹사이트에 있는 UTL_FILE.FREMOVE를 사용하십시오.

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

1단계: Amazon RDS 대상 인스턴스의 사용자에게 권한 부여

RDS 대상 인스턴스에서 사용자에게 권한을 부여하려면 다음 단계를 수행하십시오.

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

  2. 데이터를 가져오려면 먼저 테이블 스페이스를 생성해야 합니다. 자세한 내용은 테이블스페이스 생성과 크기 조정 섹션을 참조하세요.

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

    예를 들어 다음은 새로운 사용자를 생성한 후 데이터를 해당 사용자의 스키마로 가져오기 위해 필요한 권한과 역할을 부여하는 명령입니다.

    CREATE USER schema_1 IDENTIFIED BY <password>; GRANT CREATE SESSION, RESOURCE TO schema_1; ALTER USER schema_1 QUOTA 100M ON users;

    위 예제에서는 새로운 사용자에게 CREATE SESSION 권한과 RESOURCE 역할을 부여합니다. 하지만 가져오는 데이터베이스 객체에 따라 권한과 역할이 추가로 필요할 수도 있습니다.

    참고

    다음 단계에서 schema_1을 이 단계의 스키마 이름으로 대체합니다.

2단계: 소스 데이터베이스에서 사용자에게 권한 부여

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

참고

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

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

CREATE USER export_user IDENTIFIED BY <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_DATAPUMP를 사용하여 덤프 파일 생성

SQL Plus 또는 Oracle SQL Developer를 사용하여 관리 사용자 권한으로, 또는 2단계에서 생성한 사용자 권한으로 원본 Oracle 인스턴스에 연결합니다. 소스 데이터베이스가 Amazon RDS for Oracle DB 인스턴스인 경우 Amazon RDS 마스터 사용자 권한으로 연결합니다. 그런 다음 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',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를 참조하십시오. rdsadmin.rds_file_util.read_text_file 절차를 사용하여 내보내기 로그의 내용을 볼 수 있습니다. 자세한 내용은 DB 인스턴스 디렉터리의 파일 목록 읽기 섹션을 참조하세요.

4단계: 대상 DB 인스턴스의 데이터베이스 링크 생성

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

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

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

다음 명령은 대상 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_FILE_TRANSFER를 사용하여 내보낸 덤프 파일을 대상 DB 인스턴스로 복사

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

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_DATAPUMP를 사용하여 대상 DB 인스턴스로 데이터 파일 가져오기

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

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를 참조하십시오. rdsadmin.rds_file_util.read_text_file 절차를 사용하여 가져오기 로그의 내용을 볼 수 있습니다. 자세한 내용은 DB 인스턴스 디렉터리의 파일 목록 읽기 섹션을 참조하세요.

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

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

7단계: 정리

데이터를 가져온 후에는 유지하지 않을 파일을 삭제할 수 있습니다. 다음 명령을 사용하여 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 Export/Import 유틸리티

Oracle Export/Import 유틸리티는 데이터 크기가 작고 이진 부동 소수점 수 및 실수 등의 데이터 형식이 필요하지 않은 마이그레이션에 적합합니다. 가져오기 프로세스는 스키마 객체를 생성하므로 스키마 객체를 생성하기 위해 먼저 스크립트를 실행할 필요가 없습니다. 따라서 이 프로세스는 작은 테이블을 포함하는 데이터베이스에 매우 적합합니다. 다음 예에서는 이러한 유틸리티를 사용하여 특정 테이블을 내보내고 가져오는 방법을 설명합니다.

Oracle 내보내기 및 가져오기 유틸리티를 다운로드하려면 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html로 이동하십시오.

아래 명령을 사용하여 원본 데이터베이스에서 테이블을 내보냅니다. 해당되는 경우 사용자 이름/암호를 대체합니다.

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

내보내기 프로세스에서는 지정된 테이블에 대한 스키마 및 데이터를 모두 포함하는 이진 덤프 파일을 생성합니다. 이제 다음 명령을 사용하여 이 스키마와 데이터를 대상 데이터베이스로 가져올 수 있습니다.

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

사용자의 필요에 맞는 다양한 Export 및 Import 명령 버전이 있습니다. 자세한 정보는 Oracle 설명서를 참조하십시오.

Oracle SQL*Loader

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

Oracle SQL*Loader를 다운로드하려면 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html로 이동하십시오.

  1. 아래 명령을 사용하여 샘플 원본 테이블을 생성합니다.

    CREATE TABLE customer_0 TABLESPACE users AS (SELECT ROWNUM id, o.* FROM ALL_OBJECTS o, ALL_OBJECTS x WHERE ROWNUM <= 1000000);
  2. 대상 Amazon RDS 인스턴스에서 데이터를 로드하는 데 사용되는 대상 테이블을 생성합니다. 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);
  3. 원본 데이터베이스의 데이터를 일반 파일(구분 기호 사용)로 내보냅니다. 이 예에서는 이를 위해 SQL*Plus를 사용합니다. 실제 데이터의 경우 대개 데이터베이스의 모든 객체에 대한 내보내기를 수행하는 스크립트를 생성해야 할 것입니다.

    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
  4. 데이터를 설명하는 제어 파일을 생성해야 합니다. 앞에서 말했듯이, 데이터에 따라 이 단계를 수행하는 스크립트를 빌드해야 합니다.

    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 인스턴스 등의 스테이징 영역으로 복사합니다.

  5. 마지막으로 대상 데이터베이스에 대한 적절한 사용자 이름 및 암호와 함께 SQL*Loader를 사용하여 데이터를 가져옵니다.

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

Oracle 구체화 보기

Oracle 구체화 보기 복제를 사용하여 최신 데이터 세트를 효율적으로 마이그레이션할 수 있습니다. 복제를 통해 대상 테이블을 지속적으로 원본과 동일한 상태로 유지할 수 있으므로 필요할 경우 나중에 Amazon RDS로 실제 전환을 수행할 수 있습니다. 복제는 Amazon RDS 인스턴스에서 원본 데이터베이스로 연결되는 데이터베이스 링크를 사용하여 설정됩니다.

구체화 보기의 한 가지 요구 사항은 대상 데이터베이스에서 원본 데이터베이스로의 액세스를 허용해야 한다는 점입니다. 다음 예시에서는 SQLNet을 통해 Amazon RDS 대상 데이터베이스가 원본에 연결할 수 있도록 원본 데이터베이스에서 액세스 규칙이 활성화되었습니다.

  1. 원본 및 Amazon RDS 대상 인스턴스 모두에서 동일한 암호로 인증할 수 있는 사용자 계정을 생성합니다.

    CREATE USER dblink_user IDENTIFIED BY <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;
  2. 새로 생성된 dblink_user를 사용하여 Amazon RDS 대상 인스턴스에서 원본 인스턴스로 연결되는 데이터베이스 링크를 생성합니다.

    CREATE DATABASE LINK remote_site CONNECT TO dblink_user IDENTIFIED BY <password> USING '(description=(address=(protocol=tcp) (host=<myhost>) (port=<listener port>)) (connect_data=(sid=<sourcedb sid>)))';
  3. 링크를 테스트합니다.

    SELECT * FROM V$INSTANCE@remote_site;
  4. 원본 인스턴스에서 주 키와 구체화 보기 로그를 사용하여 샘플 테이블을 생성합니다.

    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;
  5. 대상 Amazon RDS 인스턴스에서 구체화된 보기를 생성합니다.

    CREATE MATERIALIZED VIEW customer_0 BUILD IMMEDIATE REFRESH FAST AS (SELECT * FROM cust_dba.customer_0@remote_site);
  6. 대상 Amazon RDS 인스턴스에서 구체화된 보기를 새로 고칩니다.

    EXEC DBMS_MV.REFRESH('CUSTOMER_0', 'f');
  7. 구체화된 보기를 끊고 PRESERVE TABLE 절을 포함하여 구체화된 보기 컨테이너 테이블과 그 내용을 보관합니다.

    DROP MATERIALIZED VIEW customer_0 PRESERVE TABLE;

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