RDS에서 EFS로 데이터를 전송하고 싶을 때 어떻게 해야 할까?

RDS에서 EFS로 데이터를 전송하고 싶을 때 어떻게 해야 하는지를 정리해 봤습니다.
2023.11.17

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 RDS에서 EFS로 데이터를 전송하고 싶을 때 어떻게 해야 하는지를 정리해 봤습니다.

사전 준비

EC2 인스턴스를 구축하고, EFS를 마운트하는 작업까지 진행합니다.

EC2 인스턴스 구축 및 마운트 작업은 아래 블로그를 참고해 주세요.

EC2 인스턴스가 RHEL일 경우 아래 블로그를 참고해 주세요.

[ec2-user@ip-10-0-143-119 /]$ df -h /mnt/efs/p
Filesystem Size Used Avail Use% Mounted on
127.0.0.1:/ 8.0E 0 8.0E 0% /mnt/efs/p

상기 블로그를 통해 EFS 마운트까지 끝난 상황이라면 df -h 명령어로 파일 시스템이 제대로 마운트된 상태인지 확인합니다.

전송 중인 데이터 암호화를 사용하면 NFS 클라이언트 설정이 변경됩니다.

활성으로 마운트된 파일 시스템을 검사하면 다음 예와 같이 localhost 또는 127.0.0.1에 마운트된 것으로 표시됩니다.

여기서 EFS 파일시스템이「127.0.0.1」로 표시되는데, EFS 가이드를 살펴보면, 다음과 같이 기술하고 있습니다.

[ec2-user@ip-10-0-143-119 p]$ sudo mkdir datapump
[ec2-user@ip-10-0-143-119 p]$ cd ..
[ec2-user@ip-10-0-143-119 efs]$ sudo chmod -R 777 p

이어서 datapump 라는 이름의 디렉토리를 만들고, 777 권한을 할당합니다.

※ RDS에서 파일 시스템에 데이터를 전송하기 위해서는 쓰기 권한을 할당할 필요가 있습니다. 상황에 맞게 부여할 권한을 할당합니다.

RDS 설정

2023년 4월부터 Amazon RDS for Oracle과 EFS의 데이터 전송(통합)을 지원하기 시작했습니다.

현재 Amazon RDS for Oracle의 최신 버전까지 EFS와의 데이터 전송(통합)이 가능합니다.

  • Oracle 19.0.0.0.ru-2023-10.rur-2023-10.r1

참고로「19.0.0.0.ru-2022-07.rur-2022-07.r1」이상에서만 지원되기 때문에 하위 버전의 경우 RDS와 EFS의 데이터 전송(통합)이 이루어지지 않을 수 있습니다.

에디션의 경우 EE, SE2 둘 다 EFS와의 데이터 전송(통합)을 지원하고 있습니다.

※ 본인 환경에 맞추어 RDS를 생성합니다.

이어서 RDS의 옵션 그룹에서 옵션을 추가합니다.

  • 옵션은「EFS_INTEGRATION」를 선택합니다.
  • EFS ID를 입력합니다.

default로 생성된 옵션 그룹의 경우 옵션을 추가할 수 없으므로, 새로운 옵션 그룹을 생성해 기존 옵션 그룹과 교체를 하거나, 미리 옵션 그룹을 생성해서 RDS를 생성할 때 선택하면 됩니다.

마지막으로 EFS의 보안 그룹에 RDS의 액세스를 허용합니다.

RDS에서 데이터 전송

sudo sqlplus64 admin@database-1.cidxydtubgwl.ap-northeast-3.rds.amazonaws.com:1521/testdb

먼저 EC2 인스턴스에서 RDS로 접속을 시도합니다.

RDS에 접속하는 패턴은 아래 블로그를 참고해 주세요.

SQL> exec rdsadmin.rdsadmin_util.create_directory_efs('DPDIR_EFS','/rdsefs-fs-xxxx/datapump');
SQL> select * from dba_directories;
SYS
DPDIR_EFS
/rdsefs-fs-xxxxxxxx/datapump

RDS에 Oracle 디렉토리를 생성합니다.

※ fs-xxxx에는 EFS ID를 입력합니다.

여기서 디렉토리 명은「DPDIR_EFS」가 되며, 마운트한 EFS의 /datapump 경로에 데이터가 저장됩니다.

select문을 통해 확인해 보면, 디렉토리가 생성된 것을 확인할 수 있습니다.

DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'TABLE', job_name=>null);
  DBMS_DATAPUMP.ADD_FILE(
    handle    => v_hdnl,
    filename  => 'exp-efs-01.dmp',
    directory => 'DPDIR_EFS',
    filetype  => dbms_datapump.ku$_file_type_dump_file);
  DBMS_DATAPUMP.ADD_FILE(
    handle    => v_hdnl,
    filename  => 'exp-efs-01.log',
    directory => 'DPDIR_EFS',
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''TESTUSR'')');
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'NAME_EXPR','IN(''TESTTBL'')');
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/

마지막으로 DBMS_DATAPUMP를 사용하여, 로그 및 테이블을 내보냅니다.

TESTUSER 스키마 테이블을 내보내게 되며, EC2 인스턴스에 마운트된 /datapump 경로에 파일이 저장됩니다.

DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'TABLE', job_name=>null);
  DBMS_DATAPUMP.ADD_FILE(
    handle    => v_hdnl,
    filename  => 'exp-efs-01.dmp',
    directory => 'DPDIR_EFS',
    filetype  => dbms_datapump.ku$_file_type_dump_file);
  DBMS_DATAPUMP.ADD_FILE(
    handle    => v_hdnl,
    filename  => 'exp-efs-01.log',
    directory => 'DPDIR_EFS',
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'NAME_EXPR','IN(''TESTTBL'')');
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/

스키마 혹은 덤프 파일이 아닌 로그 파일만을 EFS로 내보내고 싶은 경우 상기 명령어를 사용합니다.

[ec2-user@ip-10-0-143-119 datapump]$ ls
exp-efs-01.log

이후 EC2 인스턴스에서 파일 시스템을 확인해 보면, 로그 파일이 생성된 것을 확인할 수 있습니다.

마무리

결과적으로 본다면, RDS에서 EFS로 직접 데이터를 전송한다기 보다는, EC2 인스턴스에 EFS를 마운트한 다음, 해당 마운트 지점을 활용해서 데이터를 전송하는 모습이 아닌가 생각합니다.

전체적인 흐름을 정리해 보자면 다음과 같습니다.

  • EC2 인스턴스 생성
  • EFS 생성
  • EC2 인스턴스에 EFS 마운트
  • RDS 생성
    • RDS에 EFS_INTEGRATION 옵션 그룹 추가
  • Oracle 디렉토리 생성
    • 데이터를 전송할 EFS의 디렉토리가 지정
  • DBMS_DATAPUMP를 통해 데이터를 전송

본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 kis2702@naver.com로 보내주시면 감사하겠습니다.