▽ 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"
}
- Oracle DBMS_DATAPUMP Manual
https://docs.oracle.com/database/121/ARPLS/d_datpmp.htm#ARPLS356
댓글