はじめに
ADBで DBMS_DATAPUMPパッケージ を使用してエクスポート/インポートをやってみました。
検証環境イメージ図
前提
今回は、Autonomous Database に付属の Database Actionsの「SQL」を使用しSQL、PL/SQL を実行しています。
主な流れ
- 1)動的グループ、ポリシー、リソース・プリンシパルを設定
- 2)テスト・ユーザーとテスト・データを作成
- 3)ADB内のディレクトリ・オブジェクトにテスト・データをエクスポート
- 4)ディレクトリ・オブジェクトから Object Storage バケットへダンプ・ファイルをコピー
- 5)テスト・データとディレクトリ・オブジェクト上のダンプ・ファイルを削除
- 6)Object Storage バケットからADBのディレクトリ・オブジェクトへダンプ・ファイルをコピー
- 7)ADBにインポート
手順
1)動的グループ、ポリシー、リソース・プリンシパルを設定
動的グループの作成
アイデンティティとセキュリティ
- 動的グループ
の 動的グループの作成
から動的グループを作成(動的グループの詳細は「動的グループの管理」)
動的グループにポリシーを付与
アイデンティティとセキュリティ
- ポリシー
の ポリシーの作成
から動的グループにポリシーを付与
- 設定例
先程作成した動的グループを指定し、Object Storage バケットとバケット内のオブジェクトを管理できるようにポリシーを付与しています。
Allow dynamic-group <先程作成した動的グループ名> to manage buckets in compartment <自身のコンパートメント>
Allow dynamic-group <先程作成した動的グループ名> to manage objects in compartment <自身のコンパートメント>
- 注意点
リソース・プリンシパル・トークンは2時間キャッシュされる。したがって、ポリシーまたは動的グループを変更した場合、変更の影響を確認するには2時間待つ必要がある。- 詳細はマニュアル「Autonomous Databaseでリソース・プリンシパルを使用するための前提条件の実行」を参照)
リソース・プリンシパルの有効化
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)テスト・ユーザーとテスト・データを作成
テスト・ユーザーとテスト・データを作成
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
を使用します
- ディレクトリ・オブジェクトの内容を確認(DBMS_CLOUD.LIST_FILESファンクション)
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;
/
- ディレクトリ・オブジェクトに出力されたか確認(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
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
インポートの確認ができました
参考情報
- Autonomous Database - Database Actions 機能概要
- Oracle Autonomous Database on Shared Exadata Infrastructureの使用(英語版)
- Oracle Database 19c
- PL/SQLパッケージおよびタイプ・リファレンス「49 DBMS_DATAPUMP」
- データベース・リファレンス「4.222 DBA_CREDENTIALS」
- Oracle Cloud Infrastructureドキュメントポリシーの仕組み
- Speakerdeck「OCI技術資料 : IDおよびアクセス管理 (IAM) 詳細」