Autonomous Database で Data Pump を使う

Data Pump は Oracle Database の論理バックアップやデータ移行ツールの標準として利用されます。Oracle Autonomous Database でも Data Pump を使ってエクスポート・インポート処理を行うことができます。Autonomous Database 環境ではオペレーティング・システムに直接sshによる接続を行うことができないのと、ディレクトリ・オブジェクトの動作がオンプレミス環境とは異なります。本記事では Autonomous Database 環境でData Pump の実行を確認します。

# 準備
Data Pump はデータベース・サーバ上に作成されたディレクトリ・オブジェクトに対して読み込み／書き込みを行います。下記の例では DBA_DIRECTORIES ビューを検索して既存のディレクトリを表示しています。この中で、DATA_PUMP_DIR が個別の Autonomous Database で標準利用できるディレクトリです。

```SQL:
SQL> SELECT directory_name, directory_path FROM dba_directories ORDER BY 1;

DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ----------------------------------------------------------------------
DATA_PUMP_DIR                  /u03/dbfs/D4FEE2A0F4F0E493E0532110000A32B4/data/dpdump
DBMS_OPTIM_ADMINDIR            /u02/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin
DBMS_OPTIM_LOGDIR              /u02/app/oracle/product/19.0.0.0/dbhome_1/cfgtoollogs
HO_CLIENT_WALLETS_DIR          /u02/nfsad1/gateway_nfs/customer_client_wallets
HO_GATEWAY_CONF_DIR            /u02/nfsad1/gateway_nfs/hs/admin/gateway_conf_files
HO_GATEWAY_DIR                 /u02/nfsad1/gateway_nfs
HO_GATEWAY_WALLETS_DIR         /u02/nfsad1/gateway_nfs/gateway_wallets/client/wallet
HO_ODBC_CONF_DIR               /u02/nfsad1/gateway_nfs/hs/admin/odbc_conf_files
HO_TEMPLATES_CONF_DIR          /u02/nfsad1/gateway_nfs/template_conf_files
JAVA$JOX$CUJS$DIRECTORY$       /u02/app/oracle/product/19.0.0.0/dbhome_1/javavm/admin/
OPATCH_INST_DIR                /u02/app/oracle/product/19.0.0.0/dbhome_1/OPatch
OPATCH_LOG_DIR                 /u02/app/oracle/product/19.0.0.0/dbhome_1/rdbms/log
OPATCH_SCRIPT_DIR              /QOpatch
ORACLE_BASE                    /u02/app/oracle
ORACLE_HOME                    /u02/app/oracle/product/19.0.0.0/dbhome_1
ORACLE_OCM_CONFIG_DIR          /u02/app/oracle/product/19.0.0.0/dbhome_1/ccr/state
ORACLE_OCM_CONFIG_DIR2         /u02/app/oracle/product/19.0.0.0/dbhome_1/ccr/state
ORA_ARTIFACTS                  /u02/artifacts
SDO_DIR_ADMIN                  /u02/app/oracle/product/19.0.0.0/dbhome_1/md/admin
SDO_DIR_WORK                   /scratch/aime/adestore/views/aime_adc00lrs/work
SQL_TCB_DIR                    /u03/dbfs/D4FEE2A0F4F0E493E0532110000A32B4/data/tcb_dir

21行が選択されました。
```

DATA_PUMP_DIR をそのまま利用しても良いのですが、ADMIN ユーザーの権限で CREATE DIRECOTRY 文を実行してディレクトリ・オブジェクトを作成してみます。ディレクトリ・パスに絶対パスを指定するとエラーになります。

```SQL:
SQL>  CREATE DIRECTORY dpdir1 AS '/u02/nfsad1/gateway_nfs';
 CREATE DIRECTORY dpdir1 AS '/u02/nfsad1/gateway_nfs'
*
行1でエラーが発生しました。:
ORA-65254: ディレクトリに無効なパスが指定されました
```
そこで、絶対パスを使用しないでディレクトリを作成します。すると、接続している Autonomous Database 専用のパスの下に自動的にディレクトリが作成されていることがわかります。

```SQL: Autonomous Database 上の DIRECTORY オブジェクト
SQL> CREATE DIRECTORY dpdir1 AS 'dpdir1';

ディレクトリが作成されました。

SQL> SELECT directory_name, directory_path FROM dba_directories WHERE directory_name='DPDIR1';

DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ----------------------------------------------------------------------
DPDIR1                         /u03/dbfs/D4FEE2A0F4F0E493E0532110000A32B4/data/dpdir1
```

同じ SQL 文をオンプレミス環境で実行すると、ディレクトリのパスが決定されないことがわかります。

```SQL: オンプレミス環境の DIRECTORY オブジェクト
SQL> CREATE DIRECTORY dpdir1 AS 'dpdir1';

ディレクトリが作成されました。

SQL> SELECT directory_name, directory_path FROM dba_directories WHERE directory_name='DPDIR1';

DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ----------------------------------------------------------------------
DPDIR1                         dpdir1
```

# Export
Export 方法はオンプレミス環境と同じです。以下の例では ADMIN ユーザーの全データをエクスポートしています。

```SHELL:
$ expdp userid=ADMIN/パスワード@db*******_high DIRECTORY=dpdir1 LOGFILE=admin.log SCHEMAS=ADMIN

Export: Release 19.0.0.0.0 - Production on 日 4月 10 13:14:26 2022
Version 19.12.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
"ADMIN"."SYS_EXPORT_SCHEMA_01"を起動しています: userid=ADMIN/********@db*******_high DIRECTORY=dpdir1 LOGFILE=admin.log SCHEMAS=ADMIN
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
オブジェクト型SCHEMA_EXPORT/USERの処理中です
オブジェクト型SCHEMA_EXPORT/SYSTEM_GRANTの処理中です
オブジェクト型SCHEMA_EXPORT/ROLE_GRANTの処理中です
オブジェクト型SCHEMA_EXPORT/DEFAULT_ROLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLESPACE_QUOTAの処理中です
オブジェクト型SCHEMA_EXPORT/PASSWORD_HISTORYの処理中です
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/SEQUENCE/SEQUENCEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型SCHEMA_EXPORT/FUNCTION/FUNCTIONの処理中です
オブジェクト型SCHEMA_EXPORT/PROCEDURE/PROCEDUREの処理中です
オブジェクト型SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTIONの処理中です
オブジェクト型SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDUREの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/MATERIALIZED_VIEWの処理中です
オブジェクト型SCHEMA_EXPORT/POST_SCHEMA/PROCOBJの処理中です
オブジェクト型SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMAの処理中です
. . "ADMIN"."SALES"                             29.62 MB  918843行がエクスポートされました
. . "ADMIN"."SALES_M"                           29.62 MB  918843行がエクスポートされました
. . "ADMIN"."DATA1"                             14.29 MB  999998行がエクスポートされました
. . "ADMIN"."ADP\\$ERR\\$DATA1"                      7.75 KB       1行がエクスポートされました
. . "ADMIN"."SCHEDULER$_JOB_ARG"                7.546 KB       2行がエクスポートされました
ORA-39173: 暗号化データがダンプ・ファイル・セットに暗号化されずに格納されました。
マスター表"ADMIN"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
ADMIN.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
  /u03/dbfs/D4FEE2A0F4F0E493E0532110000A32B4/data/dpdir1/expdat.dmp
ジョブ"ADMIN"."SYS_EXPORT_SCHEMA_01"が日 4月 10 04:16:01 2022 elapsed 0 00:01:29で正常に完了しました
```

# Import
インポートも違いはありません。以下の例では ADMIN ユーザーの DATA1 テーブルのみインポートしています。

```SHELL:
$  impdp userid=ADMIN/パスワード@db********_high DIRECTORY=dpdir1 LOGFILE=admin.log TABLES=data1

Import: Release 19.0.0.0.0 - Production on 日 4月 10 21:01:53 2022
Version 19.12.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"ADMIN"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
"ADMIN"."SYS_IMPORT_TABLE_01"を起動しています: userid=ADMIN/********@db*********_high DIRECTORY=dpdir1 LOGFILE=admin.log TABLES=data1
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
. . "ADMIN"."DATA1"                             14.29 MB  999998行がインポートされました
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
ジョブ"ADMIN"."SYS_IMPORT_TABLE_01"が日 4月 10 12:02:06 2022 elapsed 0 00:00:08で正常に完了しました
```

ログファイルは直接確認できないため、DBMS_CLOUDパッケージを使ってオブジェクト・ストレージにコピーして確認します。