본문 바로가기
Database/Amazon RDS for Oracle

S3 (Download/Upload) 를 이용한 RDS for Oracle DataPump

by DBTechBiz 2022. 8. 23.

▽ RDS for Oracle 은 다른 동일 DB 간 데이터 이관을 할 경우 DB Link 를 이용한 이관  또는 DBMS_FILE_TRANSFER 를 사용하여 Dump 파일을 대상 DB 인스턴스로 복사하여 이관이 가능하다. RDS 간은 위의 방식으로 작업이 가능하지만 타기관에서 Dump 파일을 받아 작업을 한다고 하면 S3 를 이용한 방식을 고려해야 할 것이다.

아래의 테스트는 S3 를 이용하여 RDS for Oracle DB 의 데이터를 Export 하고 Import 하는 작업이다.


AWS RDS for Oracle 환경

Engine Version : 19.0.0.0.ru-2021-07.rur-2021-07.r1
Instance Class : db.r5.xlarge

Test Case 시나리오

▽ 어떤 상황에서든 작업이 가능할 수 있도록 모든 Test Case 를 작성함

1. Directory 생성
2. Datapump 를 이용한 Export
3. Export 한 Dump 파일을 S3 에 Upload
4. S3 의 Dump 파일을 Local PC 로 Download
5. Local PC 의 Dump 파일을 S3 로 Upload
6. S3 의 Dump 파일을 Directory 로 Upload 하기 위해 Directory 의 기존 Dump 파일 삭제
7.  S3 의 Dump 파일을 Directory 로 Upload
8. Datapump 를 이용한 Import (Remap Schema, Remap Tablespace 사용)
9. 참고사항


1. Directory 생성

-- Directory 는 메인 데이터 스토리지 공간에 생성되어 일정 공간과 I/O 대역폭을 사용

-- Directory 생성
call rdsadmin.rdsadmin_util.create_directory(p_directory_name=>'DUMP_DIR');

-- Directory 생성 확인
select * from table(rdsadmin.rds_file_util.listdir('DUMP_DIR')) order by mtime;

 

2. Datapump 를 이용한 Export

-- Datapump 를 이용하여 Export (Scott 스키마의 emp, dept 테이블)
DECLARE
    hdnl NUMBER;
BEGIN
    hdnl := DBMS_DATAPUMP.OPEN(operation=>'EXPORT', job_mode=>'TABLE', job_name=>'expdp_scott');
    DBMS_DATAPUMP.ADD_FILE(handle=>hdnl, file_name=>'exp_scott_2ea.dmp', directory=>'DUMP_DIR', filetype=>dbms_datapump.ku$_file_type_dump_file);
    DBMS_DATAPUMP.ADD_FILE(handle=>hdnl, file_name=>'exp_scott_2ea.log', directory=>'DUMP_DIR', filetype=>dbms_datapump.ku$_file_type_log_file);
    DBMS_DATAPUMP.METADATA_FILTER(handle=>hdnl, name=> 'SCHEMA_EXPR', value=>'IN (''SCOTT'')');
    DBMS_DATAPUMP.METADATA_FILTER(handle=>hdnl, name=> 'NAME_EXPR', value=>'IN (''EMP'',''DEPT'')', object_type=>'TABLE');
    DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

-- Export 상태 확인
SELECT owner_name, job_name, operation, job_mode, degree, state 
  FROM dba_datapump_jobs 
 WHERE state = 'EXECUTING';

-- Export 완료 후 Directory 에서 Dump 파일 확인
SELECT *
 FROM TABLE(rdsadmin.rds_file_util.listdir('DUMP_DIR'))
ORDER BY mtime;

-- Export Log 확인
SELECT *
 FROM TABLE(rdsadmin.rds_file_util.read_text_file(p_directory=>'DUMP_DIR', p_filename=>'exp_scott_2ea.log'));

 

3. Export 한 Dump 파일을 S3 에 Upload

-- S3 Upload 버킷 경로 (oracle-dump-ap-northeast-2/scott/)
-- Directory Dump 파일을 S3에 Upload
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
    p_bucket_name=>'oracle-dump-ap-northeast-2',
    p_prefix=>'exp_scott_2ea.dmp',
    p_s3_prefix=>'scott/',
    p_directory_name=>'DUMP_DIR') AS TASK_ID
  FROM DUAL;

 

▽ S3 의 Dump 파일을 Local PC 로 Download/Upload 하는 작업은 AWS 콘솔(웹 화면) 화면에서 간단한 마우스 클릭 작업으로 가능하나 속도가 매우 느리며 Idle Session Timeout 으로 Download/Upload 작업 도중 취소될 수 있다. AWSCLI 툴을 이용한 작업을 추천한다. AWSCLI 를 이용할 경우 단일객체를 여러 부분의 집합으로 작업을 함으로 무조건 빠르다. 각 환경마다 다르겠지만 저자는 30GB 정도의 사이즈를 대략 5분 안으로 Download/Upload가 가능하다.
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/mpuoverview.html

 

4. S3 의 Dump 파일을 Local PC 로 Download
▽ 모든 파일을 Upload/Download 할때는 --recursive 옵션을 추가한다.

-- AWS Profile 세팅 : dev, Local PC 경로 : D:\Download
-- S3 의 Dump 파일 확인
aws --profile dev s3 ls oracle-dump-ap-northeast-2/scott/
-- S3 의 Dump 파일을 Local PC 로 Download
aws --profile dev s3 cp s3://oracle-dump-ap-northeast-2/scott/exp_scott_2ea.dmp D:\Download

 

5. Local PC 의 Dump 파일을 S3 로 Upload

-- 기존의 S3의 Dump 파일을 삭제한다.

-- AWS Profile 세팅 : dev, Local PC 경로 : D:\Download
-- S3 의 버킷 확인
aws --profile dev s3 ls oracle-dump-ap-northeast-2/scott/
-- Local PC 의 Dump 파일(D:\Download 에서 작업)을 S3 로 Upload
aws --profile dev s3 cp exp_scott_2ea.dmp s3://oracle-dump-ap-northeast-2/scott/

 

6. S3 의 Dump 파일을 Directory 로 Upload 하기 위해 Directory 의 기존 Dump 파일 삭제

-- Direcotry Dump 파일 삭제
exec util_file.fremove('DUMP_DIR','exp_scott_2ea.dmp');

 

7. S3 의 Dump 파일을 Directory 로 Upload

-- S3 Dump 파일을 Directory 로 Upload
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
    p_bucket_name=>'oracle-dump-ap-northeast-2',
    p_s3_prefix=>'scott/exp_scott_2ea.dmp',
    p_directory_name=>'DUMP_DIR') AS TASK_ID
  FROM DUAL;
  
 -- Directory Dump 파일 확인
 SELECT *
   FROM TABLE(rdsadmin.rds_file_util.listdir('DUMP_DIR'))
  ORDER BY mtime;

 

8. Datapump 를 이용한 Import (Remap Schema, Remap Tablespace 사용)

-- Datapump 를 이용하여 Import 
-- (Remap Schema: SCOTT -> EMPL, Remap Tablespace: USERS1IDX -> USERS)
DECLARE
    hdnl NUMBER;
BEGIN
    hdnl := DBMS_DATAPUMP.OPEN(operation=>'IMPORT', job_mode=>'TABLE', job_name=>'impdp_scott');
    DBMS_DATAPUMP.ADD_FILE(handle=>hdnl, file_name=>'exp_scott_2ea.dmp', directory=>'DUMP_DIR', filetype=>dbms_datapump.ku$_file_type_dump_file);
    DBMS_DATAPUMP.ADD_FILE(handle=>hdnl, file_name=>'imp_scott_2ea.log', directory=>'DUMP_DIR', filetype=>dbms_datapump.ku$_file_type_log_file);
    DBMS_DATAPUMP.METADATA_FILTER(handle=>hdnl, name=> 'SCHEMA_EXPR', value=>'IN (''SCOTT'')');
    DBMS_DATAPUMP.METADATA_FILTER(handle=>hdnl, name=> 'NAME_EXPR', value=>'IN (''EMP'',''DEPT'')', object_type=>'TABLE');
    DBMS_DATAPUMP.METADATA_REMAP(handle=>hdnl, name=> 'REMAP_SCHEMA', old_value=>'SCOTT', value=>'EMPL');
    DBMS_DATAPUMP.METADATA_REMAP(handle=>hdnl, name=> 'REMAP_TABLESPACE', old_value=>'USERS1IDX', value=>'USERS');
    DBMS_DATAPUMP.SET_PARAMETER(hdnl,'TABLE_EXISTS_ACTION','TRUNCATE');
    DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

-- Import 상태 확인
SELECT owner_name, job_name, operation, job_mode, degree, state 
  FROM dba_datapump_jobs 
 WHERE state = 'EXECUTING';

-- Import Log 확인
SELECT *
 FROM TABLE(rdsadmin.rds_file_util.read_text_file(p_directory=>'DUMP_DIR', p_filename=>'imp_scott_2ea.log'));

 


9. 참고사항

  • S3 버킷에 Upload, Download 를 하기 위해서는 IAM 에 정책 설정 필요
IAM-POLICY-PL-ORACLE-ACCESS-TO-S3
{
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:ReEncryptTo",
                "kms:GenerateDateKey",
                "kms:DescribeKey",
                "s3:ListBucket",
                "kms:ReEncryptFrom"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:kms:*:xxxxxxxxxx:key/*",    -> xx~ 는 계정(숫자)이 들어간다.
                "arn:aws:s3:::oracle-dump-ap-northeast-2",
                "arn:aws:s3:::oracle-dump-ap-northeast-2/*",
            ],
            "Sid": "VisualEditor0"
       }
    ],
    "Versino": "2012-10-17"
}

 

반응형

댓글