1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Autonomous Database】DBMS_DATAPUMPパッケージを使用したエクスポート/インポート

Last updated at Posted at 2023-04-28

はじめに

ADBで DBMS_DATAPUMPパッケージ を使用してエクスポート/インポートをやってみました。

検証環境イメージ図

検証環境イメージ図.png

前提

今回は、Autonomous Database に付属の Database Actionsの「SQL」を使用しSQL、PL/SQL を実行しています。

dbactions.png

主な流れ

  • 1)動的グループ、ポリシー、リソース・プリンシパルを設定
  • 2)テスト・ユーザーとテスト・データを作成
  • 3)ADB内のディレクトリ・オブジェクトにテスト・データをエクスポート
  • 4)ディレクトリ・オブジェクトから Object Storage バケットへダンプ・ファイルをコピー
  • 5)テスト・データとディレクトリ・オブジェクト上のダンプ・ファイルを削除
  • 6)Object Storage バケットからADBのディレクトリ・オブジェクトへダンプ・ファイルをコピー
  • 7)ADBにインポート

手順

1)動的グループ、ポリシー、リソース・プリンシパルを設定

動的グループの作成

アイデンティティとセキュリティ - 動的グループ動的グループの作成 から動的グループを作成(動的グループの詳細は「動的グループの管理」)

  • 設定例
    検証環境のためコンパートメント内のすべてのリソースを許可していますが、マニュアルを参照しながら必要なものを設定してください。
    動的グループ.png

動的グループにポリシーを付与

アイデンティティとセキュリティ - ポリシーポリシーの作成 から動的グループにポリシーを付与

  • 設定例
    先程作成した動的グループを指定し、Object Storage バケットとバケット内のオブジェクトを管理できるようにポリシーを付与しています。

ポリシー.png

Allow dynamic-group <先程作成した動的グループ名> to manage buckets in compartment <自身のコンパートメント>
Allow dynamic-group <先程作成した動的グループ名> to manage objects in compartment <自身のコンパートメント>

リソース・プリンシパルの有効化

ADMINユーザーで実行

EXEC DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL();

リソース・プリンシパルが有効化されたか確認

SELECT owner, credential_name, username ,enabled FROM dba_credentials;

出力例

OWNER CREDENTIAL_NAME        USERNAME                                             ENABLED
----- ---------------------- ---------------------------------------------------- -------
ADMIN OCI$RESOURCE_PRINCIPAL ADMIN                                                TRUE

ADBからObject Storageバケットを参照できるか確認(DBMS_CLOUD.LIST_OBJECTSファンクション

SELECT * FROM DBMS_CLOUD.LIST_OBJECTS('OCI$RESOURCE_PRINCIPAL', 'https://objectstorage.ap-osaka-1.oraclecloud.com/n/orasejapan/b/bucket-dump/o/');

出力例

OBJECT_NAME             BYTES CHECKSUM                 CREATED                  LAST_MODIFIED            
---------------------- ------ ------------------------ ------------------------ ------------------------ 
dumpfile/                   0 1B2M2Y8AsgTpgAmY7PhCfg== 2023-04-28T01:10:34.123Z 2023-04-28T01:10:34.123Z 
test.txt                    1 xMpCOKC5I4INzFCab3WEmw== 2023-04-28T00:43:43.053Z 2023-04-28T00:43:43.053Z 

2)テスト・ユーザーとテスト・データを作成

テスト・ユーザーとテスト・データを作成

  • Database Actionsデータベース・ユーザー「BENEE」を作成
    DBUser.png

  • BENEE にテスト・データを作成

create table emp(empno number(10), empname varchar2(10));
insert into emp(empno,empname) values(100,'TANAKA');
insert into emp(empno,empname) values(200,'SAITO');
insert into emp(empno,empname) values(300,'YOSHIDA');
commit;
select * from emp;

出力例

EMPNO EMPNAME
----- -------
  100 TANAKA
  200 SAITO
  300 YOSHIDA

3)ADB内のディレクトリ・オブジェクトにテスト・データをエクスポート

ディレクトリ・オブジェクトの確認

  • Database ActionsにADMINでログインし「SQL」にアクセスしディレクトリ・オブジェクトを確認
SELECT directory_name, directory_path FROM dba_directories WHERE directory_name = 'DATA_PUMP_DIR';

出力例

DIRECTORY_NAME DIRECTORY_PATH
-------------- ------------------------------------------------------
DATA_PUMP_DIR  /u03/dbfs/F8C*********/data/dpdump

※今回は、DATA_PUMP_DIR を使用します

SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');

出力例

OBJECT_NAME                        BYTES CHECKSUM CREATED              LAST_MODIFIED
------------------------------- -------- -------- -------------------- --------------------
load_OML4PY_82.log                   358          2023-04-10T00:25:20Z 2023-04-10T00:25:20Z
automl_metamodels.dmp           10297344          2023-04-10T00:25:20Z 2023-04-10T00:25:20Z
OML4PY_IMPORT_84.log                7516          2023-04-10T00:25:27Z 2023-04-10T00:26:00Z
OUT_TRAN_1000MAN02$2_dflt.log          0          2023-04-10T01:26:51Z 2023-04-10T01:26:51Z
OUT_TRAN_1000MAN02$2_dflt.bad          0          2023-04-10T01:26:51Z 2023-04-10T01:26:51Z
OUT_TRAN_1000MAN02$2_198479.log     1649          2023-04-10T01:26:52Z 2023-04-10T01:27:50Z

デフォルトでいくつかファイルが入っています

エクスポート(DBMS_DATAPUMPパッケージ

  • スキーマ単位でエクスポートをします

サンプルPL/SQL

DECLARE
  hdnl NUMBER;
    BEGIN
      hdnl := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'SCHEMA', job_name => null, version => 'COMPATIBLE');
      DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'exp_benee.dmp', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE);
      DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'exp_benee.log', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
      DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''BENEE'')');
      DBMS_DATAPUMP.START_JOB(hdnl);
END;
/
SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR') WHERE object_name like 'exp%';

出力例

OBJECT_NAME    BYTES CHECKSUM CREATED              LAST_MODIFIED
------------- ------ -------- -------------------- --------------------
exp_benee.dmp 360448          2023-04-28T01:02:05Z 2023-04-28T01:02:32Z
exp_benee.log   1517          2023-04-28T01:02:06Z 2023-04-28T01:03:37Z

4)ディレクトリ・オブジェクトから Object Storage バケットへダンプ・ファイルをコピー

DBMS_CLOUD.PUT_OBJECTを用い、ADBのディレクトリ・オブジェクトからObject Storageバケットにダンプ・ファイルをコピーします

BEGIN
    DBMS_CLOUD.PUT_OBJECT(
      credential_name =>  'OCI$RESOURCE_PRINCIPAL',
      object_uri      =>  'https://objectstorage.ap-osaka-1.oraclecloud.com/n/****/b/bucket-dump/o/dumpfile/exp_benee.dmp',
      directory_name  =>  'DATA_PUMP_DIR',
      file_name       =>  'exp_benee.dmp'
    );
END;
/

Object Storageにコピーされたか確認します(DBMS_CLOUD.LIST_OBJECTSファンクション

SELECT * FROM DBMS_CLOUD.LIST_OBJECTS('OCI$RESOURCE_PRINCIPAL', 'https://objectstorage.ap-osaka-1.oraclecloud.com/n/o****/b/bucket-dump/o/dumpfile/') WHERE object_name = 'exp_benee.dmp';

出力例

OBJECT_NAME    BYTES CHECKSUM                 CREATED                  LAST_MODIFIED
------------- ------ ------------------------ ------------------------ ------------------------
exp_benee.dmp 360448 gHmV3IfAC0H78rLivi98Lg== 2023-04-28T01:43:21.376Z 2023-04-28T01:43:21.376Z
  • 補足
    Cloud Object Storageに応じて、転送するオブジェクトのサイズは次のように制限されます(詳細は「DBMS_CLOUD.PUT_OBJECT」)
Cloud Object Storageサービス オブジェクト転送サイズの制限
Oracle Cloud Infrastructure Object Storage 50GB
Amazon S3 5GB
Azure Blob Storage 256MB
Amazon S3互換 オブジェクト・ストア・プロバイダによって設定される。 詳細は、プロバイダ提供の資料を参照。

5)テスト・データとディレクトリ・オブジェクト上のダンプ・ファイルを削除

テスト・データを削除

ADMINユーザーでテスト・データを削除

DROP TABLE benee.emp CASCADE CONSTRAINTS PURGE;

削除されたか確認

SELECT object_name FROM DBA_OBJECTS WHERE OWNER = 'BENEE';

ディレクトリ・オブジェクト上のダンプ・ファイルを削除

ディレクトリ・オブジェクトの内容をリスト(DBMS_CLOUD.LIST_FILESファンクション

SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR') WHERE object_name like 'exp%';

出力例

OBJECT_NAME    BYTES CHECKSUM CREATED              LAST_MODIFIED
------------- ------ -------- -------------------- --------------------
exp_benee.dmp 360448          2023-04-28T01:02:05Z 2023-04-28T01:02:32Z
exp_benee.log   1517          2023-04-28T01:02:06Z 2023-04-28T01:03:37Z

ディレクトリ・オブジェクト内のファイルを削除(DBMS_CLOUD.DELETE_FILEプロシージャ

BEGIN
  DBMS_CLOUD.DELETE_FILE(
    directory_name  =>  'DATA_PUMP_DIR',
    file_name       => 'exp_benee.dmp'
  );
END;
/

ディレクトリ・オブジェクトの内容をリスト(DBMS_CLOUD.LIST_FILESファンクション

SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR') WHERE object_name like 'exp%';

6)Object Storage バケットからADBのディレクトリ・オブジェクトへダンプ・ファイルをコピー

Object Storageのダンプ・ファイル確認(DBMS_CLOUD.LIST_OBJECTSファンクション

SELECT * FROM DBMS_CLOUD.LIST_OBJECTS('OCI$RESOURCE_PRINCIPAL', 'https://objectstorage.ap-osaka-1.oraclecloud.com/n/orasejapan/b/bucket-dump/o/dumpfile/') WHERE object_name = 'exp_benee.dmp';

出力例

OBJECT_NAME    BYTES CHECKSUM                 CREATED                  LAST_MODIFIED
------------- ------ ------------------------ ------------------------ ------------------------
exp_benee.dmp 360448 gHmV3IfAC0H78rLivi98Lg== 2023-04-28T01:43:21.376Z 2023-04-28T01:43:21.376Z

Object StorageバケットからADBのディレクトリ・オブジェクトへダンプ・ファイルをコピー(DBMS_CLOUD.GET_OBJECTプロシージャおよびファンクション

BEGIN
  DBMS_CLOUD.GET_OBJECT(
    credential_name => 'OCI$RESOURCE_PRINCIPAL',
    object_uri      => 'https://objectstorage.ap-osaka-1.oraclecloud.com/n/****/b/bucket-dump/o/dumpfile/exp_benee.dmp',
    directory_name  => 'DATA_PUMP_DIR',
    file_name       => 'exp_benee.dmp'
  );
END;
/

ディレクトリ・オブジェクトにコピーされたことを確認(DBMS_CLOUD.LIST_FILESファンクション

SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR') WHERE object_name like 'exp%';

出力例

OBJECT_NAME    BYTES CHECKSUM CREATED              LAST_MODIFIED
------------- ------ -------- -------------------- --------------------
exp_benee.dmp 360448          2023-04-28T02:03:30Z 2023-04-28T02:03:31Z

7)ADBにインポート(DBMS_DATAPUMPパッケージ

スキーマ単位でインポート

DECLARE
  hdnl NUMBER;
    BEGIN
      hdnl := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', job_name => null, version => 'COMPATIBLE');
      DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'exp_benee.dmp', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE);
      DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'imp_benee.log', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
      DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''BENEE'')');
      DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

テスト・データの確認

SELECT * FROM benee.emp;

出力例

EMPNO EMPNAME
----- -------
  100 TANAKA
  200 SAITO
  300 YOSHIDA

インポートの確認ができました

参考情報

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?