본문 바로가기
5. 개발 플랫폼 Low Code

APEX 서비스에서 오브젝트 스토리지로의 데이터 펌프 익스포트

by MY잭슨 2022. 2. 8.

SQL*Net 서비스가 제약인 APEX 서비스는 자율주행데이터 기반으로 되어 있어서 DBMS_CLOUD를 활용하면 데이터 내려받기가 가능합니다.

 

1. 우선 데이터베이스를 연결하고

(APEX SQL Workshop 또는 OCI Console >> ADB service console >> Data Action)

 

2. DBMS_CLOUD.CREATE_CREDENTIAL 를 통해 오브젝트 스토리지 사용 자격 증명을 등록합니다.

* 주의 : username 은 OCI 로그인 사용자명, password는 OCI에서의 auth token 정보

 

 

샘플 : username =>> local user/IDCS user 모두 가능 ('oracleidentitycloudservice/xxx@a.com' 형식 가능)

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'DEF_CRED_NAME',
    username => 'adb_user@example.com',
    password => 'password'
  );
END;
/

 

ADMIN으로 접속하여 APEXSVC 유저에게 실행 권한을 부여한 후 Credential 재생성

GRANT EXECUTE ON DBMS_CLOUD to APEXSVC;

 

 

3. 데이터를 다운받기 전에 저장된 인증이 잘 작동되는지 먼저 확인 합니다. 

오브젝트 스토리지에 샘플 파일을 올려 놓고 조회 해 보면 됩니다.

 

select *
  from dbms_cloud.list_objects(
       credential_name => 'DEF_CRED_NAME',
       location_uri    => 'https://objectstorage.ap-seoul-1.oraclecloud.com/n/xxxxxxxxxx/b/xxxxxxxxxx/o/');

 

4. 자율주행 데이터베이스에서 오브젝트 스토리지로 데이터를 다운받습니다. 

샘플

BEGIN
 DBMS_CLOUD.EXPORT_DATA(
    credential_name =>'DEF_CRED_NAME',
    file_uri_list =>'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/o/export1.txt',
    format => json_object('type' value 'datapump'),
    query => 'SELECT warehouse_id, quantity FROM inventories'
 );
END;
/

 

datapump 방식을 사용하기 위해서는 내부적으로 사용이 되는 DATA_PUMP_DIR에 대한 권한 획득이 필요합니다.

GRANT READ, WRITE ON directory DATA_PUMP_DIR TO APEXSVC;

 

왜 _aaaaa 파일로 나뉘어졌을까 내용을 찾아보니 빠른 업로드를 위해서 파일을 잘게 쪼개어 놓았다는 설명이 있네요.

Oracle Data Pump divides each dump file part into smaller chunks for faster uploads. The Oracle Cloud Infrastructure Object Storage console shows multiple files for each dump file part that you export. The size of the actual dump files will be displayed as zero (0) and its related file chunks as 10mb or less.

 

하지만, (APEX 서비스여서) 안타까운 점 

1) DBMS_CLOUD가 schema 단위의 전체 백업이 아닌 테이블 단위 밖에 안 되기 때문에 PL/SQL 로 테이블 목록을 읽어서 각각 파일을 만들어 내는 방식으로 진행이 필요하고

2) (datapump 옵션) EXPORT_DATA 로 내린 데이터는 데이터 펌프 impdp 로 임포트할 수 없습니다.

 

임포트는 이렇게.

 

BEGIN
  DBMS_CLOUD.copy_data(
    table_name      => 'CD_MST',
    credential_name => 'DEF_CRED_NAME',
    file_uri_list   => 'https://objectstorage.ap-seoul-1.oraclecloud.com/n/xxxxx/b/xxxxx/o/export1.txt',
    format          => json_object('type' value 'datapump')
 );
END;
/

 

 

참고

https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/export-data-select.html#GUID-7DAB00F6-65B8-4678-B222-7939001A3469

https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_CLOUD.html#GUID-6CCC322D-26A9-47E7-8FF5-5FF23807C968

https://antognini.ch/2018/07/dbms_cloud-package-a-reference-guide/

https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/export-data-object-store-dp-new.html#GUID-7EE2B6BF-5DF3-43E7-8CA3-1FE5DC13FA1D

https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-subprograms.html#GUID-F8A70BE2-6060-48A7-9667-0A6B39198071

댓글