Autonomous Databaseでdata pumpを試す

# はじめに

Oracle DBのdata pumpを急に勉強しないといけなくなったため、OCI Free TierにAutonomous DB を立てて、data pump のexport/importするまでを試す。

Autonomous DBと、接続用のlinuxインスタンスの作成手順は以下。
ここでは、autonomous DBにADMINで初めてアクセスしたところから出発する。

https://qiita.com/alphajinsei/items/16d21866b53a189878df


専用に

* ~~表領域~~ autonomous DBでは作成できない？
* ユーザ・スキーマ
* 表
* ディレクトリオブジェクト

を作成したうえでデータをexpdp/impdpすることが目標。


Oracle DB自体ずぶの初心者のため、都度メモを書きながらになる点ご了承ください。

以下、明示的に記載していない場合はADMINでログインしています。

```shell
PS C:\Users\xxx\OneDrive\sandbox\OCI> ssh -i .\ssh-key.key opc@xxx.xxx.xxx.xxx -o ServerAliveInterval=60
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sat Oct 28 09:56:47 2023 from 106.131.228.9
[opc@my-instance ~]$ sqlplus ADMIN/"XXX"@myautonomousdb_medium

SQL*Plus: Release 19.0.0.0.0 - Production on 土 10月 28 09:59:59 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

最終正常ログイン時間: 土 10月 28 2023 09:33:41 +00:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0
に接続されました。
SQL>
```


# 表領域の作成(できず)

結論から言うとautonomous DBではADMIN権限であっても表領域を作成することはできないらしい。
この章は試行錯誤したメモです。

### ASMディスクの容量を確認

```sql
SQL> SELECT group_number, name, state, total_mb, free_mb, free_mb/total_mb*100 as free_pct FROM v$asm_diskgroup;

GROUP_NUMBER NAME                           STATE         TOTAL_MB    FREE_MB   FREE_PCT
------------ ------------------------------ ----------- ---------- ---------- ----------
           1 DATA                           CONNECTED    269033472  260329236 96.7646271
           2 RECO                           CONNECTED     67239936   65434188  97.314471
```

* `FREE_PCT` を見ると、余力は十分あることがわかる

* `DATA`領域
  * oracle データベースの実際のデータファイルを格納する領域。
  * ユーザーデータ・テーブル・インデックスなどがDATA領域に格納される。

* `RECO`領域
  * recovery領域の略。リカバリ・バックアップ・フラッシュバックに関連するファイルが格納される領域。

### 既存のデータファイルの一覧を確認

* 物理的なデータを意味する
* 一つの表領域（論理単位）に対して、一つ以上のデータファイル（物理データ）が対応する。
* データファイルの一覧は`dba_data_files`を参照。各列の意味は以下。
  * https://docs.oracle.com/cd/E16338_01/server.112/b56311/statviews_3143.htm


```sql
SQL> select * from dba_data_files;

FILE_NAME
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   FILE_ID TABLESPACE_NAME                     BYTES     BLOCKS STATUS    RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS ONLINE_ LOST_WR
---------- ------------------------------ ---------- ---------- --------- ------------ --- ---------- ---------- ------------ ---------- ----------- ------- -------
+DATA/FEPP1POD/07416308B33C6B60E0630618000AFF4D/DATAFILE/system.3244.1149741681
      5033 SYSTEM                         1227882496     149888 AVAILABLE         1024 YES 3.5184E+13 4294967293         1280 1226833920      149760 SYSTEM  OFF

+DATA/FEPP1POD/07416308B33C6B60E0630618000AFF4D/DATAFILE/sysaux.3653.1149741681
      5034 SYSAUX                         3657891840     446520 AVAILABLE         1024 YES 3.5184E+13 4294967293         1280 3651567616      445748 ONLINE  OFF

+DATA/FEPP1POD/07416308B33C6B60E0630618000AFF4D/DATAFILE/undotbs1.5314.1149741681
      5035 UNDOTBS1                       1101004800     134400 AVAILABLE         1024 YES 1101004800     134400       262144 1099956224      134272 ONLINE  OFF

+DATA/FEPP1POD/07416308B33C6B60E0630618000AFF4D/DATAFILE/data.5881.1149741681
      5036 DATA                           1178599424     143872 AVAILABLE         1024 YES 3.5184E+13 4294967293       262144 1172275200      143100 ONLINE  OFF

+DATA/FEPP1POD/07416308B33C6B60E0630618000AFF4D/DATAFILE/dbfs_data.5364.1149741681
      5037 DBFS_DATA                       104857600      12800 AVAILABLE         1024 YES 3.5184E+13 4294967293       262144   98533376       12028 ONLINE  OFF

+DATA/sampleschema_dbf
      5038 SAMPLESCHEMA                   2.1475E+11   26214400 AVAILABLE         1024 YES 3.5184E+13 4294967293      1310720 2.1468E+11    26205708 ONLINE  OFF

+DATA/FEPP1POD/07416308B33C6B60E0630618000AFF4D/DATAFILE/undo_8.5223.1150175949
      5217 UNDO_8                          100007936      12208 AVAILABLE         1024 YES 1101004800     134400       262144   98959360       12080 ONLINE  OFF


7 rows selected.

```

* oracleがデフォルトで使用するSYSTEM表領域、SUSAUX表領域のデータファイルがあることがわかる。
* 加えて、SAMPLESHEMA なる表領域も用意されていることがわかる。
* data_fileの読み方だが、
  * `+DATA`：ASMディスクグループの名前。

```sql
# SAMPLESCHEMA表領域が持つデータファイルの一覧を取得する
SQL>  select * from dba_data_files where tablespace_name = 'SAMPLESCHEMA';

FILE_NAME                         FILE_ID TABLESPACE_NAME                     BYTES     BLOCKS STATUS    RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS ONLINE_ LOST_WR
------------------------------ ---------- ------------------------------ ---------- ---------- --------- ------------ --- ---------- ---------- ------------ ---------- ----------- ------- -------
+DATA/sampleschema_dbf               5038 SAMPLESCHEMA                   2.1475E+11   26214400 AVAILABLE         1024 YES 3.5184E+13 4294967293      1310720 2.1468E+11    26205708 ONLINE  OFF

```

* `USER_BITES`が、ユーザが利用可能な領域。2E+11 = 18GBぐらい。
* `AUT` : AUTOEXTENSIBLE が自動拡張有効化がなされているか、の意味。YESなので自動拡張される。

### 既存の表領域の一覧を確認

* データベースの中身（テーブルなど）が格納される場所。論理的な管理単位。
* 一つの表領域（論理単位）に対して、一つ以上のデータファイル（物理データ）が対応する。
  * 対応は前節の通り。

* バックアップ/リストア時の最小単位になるため、大きすぎないサイズで設計しておくとよい

```sql
SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
DATA
DBFS_DATA
SAMPLESCHEMA
TEMP
UNDO_8

8 rows selected.

```

* 表領域単位にいくつかオプションを設定可能。
  * ブロックサイズ
  * クオータ
  * オンライン/オフライン：ユーザに利用させるかどうかを制御できる




```sql
# 詳細を表示
SQL>   select tablespace_name,block_size,initial_extent,next_extent,min_extents,max_extents,max_size,pct_increase,min_extlen,status,contents from dba_tablespaces;

TABLESPACE_NAME      BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS   MAX_SIZE PCT_INCREASE MIN_EXTLEN STATUS                      CONTENTS
-------------------- ---------- -------------- ----------- ----------- ----------- ---------- ------------ ---------- --------------------------- ---------------------------------------------------------------
SYSTEM                     8192          65536                       1  2147483645 2147483645                   65536 ONLINE                      PERMANENT
SYSAUX                     8192          65536                       1  2147483645 2147483645                   65536 ONLINE                      PERMANENT
UNDOTBS1                   8192          65536                       1  2147483645 2147483645                   65536 ONLINE                      UNDO
DATA                       8192          65536                       1  2147483645 2147483645                   65536 ONLINE                      PERMANENT
DBFS_DATA                  8192          65536                       1  2147483645 2147483645                   65536 ONLINE                      PERMANENT
SAMPLESCHEMA               8192          65536                       1  2147483645 2147483645                   65536 READ ONLY                   PERMANENT
TEMP                       8192        1048576     1048576           1             2147483645            0    1048576 ONLINE                      TEMPORARY
UNDO_8                     8192          65536                       1  2147483645 2147483645                   65536 ONLINE                      UNDO

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

### 表領域を作成
```sql
SQL> create tablespace NEW_TABLESPACE datafile '+DATA' size 100m autoextend ON maxsize 500m logging extent management local segment space management auto;
create tablespace NEW_TABLESPACE datafile '+DATA' size 100m autoextend ON maxsize 500m logging extent management local segment space management auto
*
行1でエラーが発生しました。:
ORA-01031: 権限が不足しています
```

* どうもautonomoous DBでは表領域の作成ができないらしい。
  * `SELECT * FROM DBA_TAB_PRIVS WHERE PRIVILEGE = 'SELECT' AND TABLE_NAME = 'V$ASM_DISK';`しても何も表示されない。admin権限であってもなおasmディスクグループへの権限は渡されていない模様。

下記にも記載がある。

https://qiita.com/plusultra/items/9407adde20d918fad508

一応、意図した設定を記載。

* `LOGGING` or `NOLOGING`
  * `LOGGING`の場合、REDOログ(INSERT,DELETE, UPDATEなど)を保存するようになる。せっかくRECO領域があるなら使う。
  * `NOLOGGING`の場合、REDOログを保存しない。動作は早くなる可能性があるものの・・・普通は指定しない。
* `EXTENT MANAGEMENT `
  * `LOCAL`
    * 表領域の各セグメント（テーブル・インデックスなど）ごとに拡張を管理。各セグメントが競合しづらい。
  * `DICTIONARY`
    * 各セグメントの拡張情報はデータディクショナリで一括管理される。
* `SEGMENT SPACE MANAGEMENT`
  * `AUTO`
    * セグメントの空きスペースを自動で管理。ガベージコレクション的な感じか。
  * `MANUAL`
    * を手でやる。むずそう。
  * ちなみに・・・
    * `EXTENT MANAGEMENT`が`DICTIONARY`の場合は、`SEGMENT SPACE MANAGEMENT`を`AUTO `は選択できない。
  * そもそも・・・
    * データブロック：データベース内の基本的なI/O単位。2KB-32KBで最初に選択できる。
    * エクステント：データベースのストレージ管理の単位。データブロックの定数倍で選択する。



# スキーマの作成

### スキーマの作成

表領域はあきらめてスキーマの作成に移る。

```sql
create user alphajinsei identified by xxx default tablespace DATA temporary tablespace TEMP;
```

* デフォルト表領域はもとから存在するDATAを選択。本当は別個に作りたかったところだが・・・
* 一時表領域ももとから存在するTEMPを選択。こちらは違和感なし。

```sql
SQL> select username from dba_users where username = 'ALPHAJINSEI';

USERNAME
--------------------------------------------------------------------------------
ALPHAJINSEI
```
ちゃんと作成されている。

### 権限の付与

`create user`しただけでは以下のようにログインすらできない。

```sql
[opc@my-instance ~]$ sqlplus alphajinsei/xxx@myautonomousdb_medium

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Oct 22 18:46:59 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

ERROR:
ORA-01045: user ALPHAJINSEI lacks CREATE SESSION privilege; logon denied
```

権限を付与する。
```sql
SQL> grant connect to alphajinsei;

権限付与が成功しました。

SQL> grant resource to alphajinsei;

権限付与が成功しました。
```

これで接続できる。
```bash
[opc@my-instance ~]$ sqlplus alphajinsei/xxx@myautonomousdb_medium

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Oct 22 18:52:52 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0

SQL> select * from user_tables;

no rows selected
```

# 表の作成

以下を参考にさせていただいた。

https://qiita.com/dingtianhongjie/items/312fc4159dde23b7be90

先ほど作成したユーザーalphajiseni で接続する。

```sql
[opc@my-instance ~]$ sqlplus alphajinsei/xxx@myautonomousdb_medium

SQL*Plus: Release 19.0.0.0.0 - Production on 土 10月 28 10:24:28 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

最終正常ログイン時間: 土 10月 28 2023 09:33:27 +00:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0
に接続されました。
SQL>
```

最初に表が存在しないことを確認。

```sql
select table_name from user_tables; 
```

### テーブルの作成

```sql
create table emp
(
emp_id number(3) primary key, 
name varchar2(10 char) not null, 
hire_date date not null,
salary number(10) not null, 
dept_id number(2)
);
```

以下の通り作成できた。

```sql
SQL> select table_name from user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
EMP
```


describe emp でサマリが表示される

```sql
SQL> desc emp
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMP_ID                                    NOT NULL NUMBER(3)
 NAME                                      NOT NULL VARCHAR2(10 CHAR)
 HIRE_DATE                                 NOT NULL DATE
 SALARY                                    NOT NULL NUMBER(10)
 DEPT_ID                                            NUMBER(2)
 
```


### データの流しこみ

事前にデータが存在しないことを確認。
```sql
SQL> select * from emp;

no rows selected
```

いくつか事前準備が必要。

#### 1.権限追加
　・ADMINでログインしてEMP表へのinsertと、tablespcaeの権限を付与する。

```sql
SQL> grant insert on alphajinsei.EMP to alphajinsei;

Grant succeeded.

SQL> grant unlimited tablespace to alphajinsei ;

Grant succeeded.
```

#### 2.日付の形式を変更

デフォルトだと以下の設定になっているので、

```sql
SQL> select * from v$nls_parameters where parameter='NLS_DATE_FORMAT';

PARAMETER
----------------------------------------------------------------
VALUE                                                                CON_ID
---------------------------------------------------------------- ----------
NLS_DATE_FORMAT
DD-MON-RR                                                                92
```

使いやすい形式に変更する。
```sql
SQL> alter session set NLS_DATE_FORMAT='RR-MM-DD';

Session altered.
```
※永続化したい場合は`alter session set NLS_DATE_FORMAT='RR-MM-DD' scope=SPFILE;`を指定する必要あり。？このままでは毎回上記を打つことになり若干面倒・・・




#### 3.ロケールの設定

ロケールを日本語に設定する。クライアントのインスタンスの環境変数に設定する。

```bash
[opc@my-instance ~]$ tail  -n 4 .bashrc
export ORACLE_BASE=/usr/lib/oracle/
export ORACLE_HOME=/usr/lib/oracle/19.20
export TNS_ADMIN=/usr/lib/oracle/19.20/client64/lib/network/wallet/
export NLS_LANG=japanese_japan.UTF8　　　★これを設定
```

### データの流し込み

insertできた。

```sql
SQL> insert into emp values('100','佐藤','00-04-01','500000','50');

1行が作成されました。

SQL> select * from emp;

    EMP_ID NAME                           HIRE_DAT     SALARY    DEPT_ID
---------- ------------------------------ -------- ---------- ----------
       100 佐藤                           00-04-01     500000         50

```



# ディレクトリオブジェクトの作成

### ディレクトリオブジェクトの作成

表ができたところで早速expdpしたいところだが、expdpするにはまず入出力先のディレクトリオブジェクトが必要。早速作成する。以下はADMINユーザで実施。

```sql
SQL> create directory dpdir1 as 'dpdir1';

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

SQL> select directory_name, directory_path from dba_directories;

DIRECTORY_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DIRECTORY_PATH
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DPDIR1
/u03/dbfs/07416308B33C6B60E0630618000AFF4D/data/dpdir1

DATA_PUMP_DIR
/u03/dbfs/07416308B33C6B60E0630618000AFF4D/data/dpdump
...
```

* 普通はディレクトリ名には実パスを指定するところだが、autonomous DBはSaaS特有の事情により、ディレクトリ名(dpdir1)だけ与えると自動でディレクトリ(`/u03/dbfs/07416308B33C6B60E0630618000AFF4D/data/dpdir1`)が勝手に与えられるようになっている。
* デフォルトでもdatapump用に`DATA_PUMP_DIR`というディレクトリオブジェクトがあり、こちらも利用可能。今回は自分で作成。

### 権限付与

すぐこの後にALPHAJINSEIユーザでdatapumpすることを見越して、あらかじめディレクトリオブジェクトの読み書き権限を付与しておく。

```sql
SQL> grant read,write on directory DPDIR1 to ALPHAJINSEI;

権限付与が成功しました。
```

### 補足
ディレクトリオブジェクトに何が格納されているかは以下のコマンドで確認できる。
ただ、ファイルの中身を見ることはできず、中身を見たい場合はオブジェクトストレージにいちいち転送する必要がある。手順は後述。

https://docs.oracle.com/ja-jp/iaas/autonomous-database/doc/store-files.html

```sql
SQL> SELECT * FROM DBMS_CLOUD.LIST_FILES('DPDIR1');

OBJECT_NAME
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     BYTES
----------
CHECKSUM
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATED                                                                     LAST_MODIFIED
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
alphajinsei_exp.log
      1243

23-10-23 16:25:07.000000 +00:00                                             23-10-28 13:30:24.000000 +00:00
```

# Data Pump 

ようやく本題。作成したスキーマ`alphajinsei`、表`emp`、ディレクトリオブジェクト`dpdir1`を用いて、表のexport/importを行う。

### export 

スキーマ単位でexportする。問題なくexportできた。

```bash
[opc@my-instance ~]$ expdp alphajinsei/xxx@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log SCHEMAS=ALPHAJINSEI;

Export: Release 19.0.0.0.0 - Production on 土 10月 28 12:35:23 2023
Version 19.20.0.0.0

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

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
"ALPHAJINSEI"."SYS_EXPORT_SCHEMA_01"を起動しています: alphajinsei/********@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log SCHEMAS=ALPHAJINSEI

オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMAの処理中です
. . "ALPHAJINSEI"."EMP"                         6.914 KB       1行がエクスポートされました
ORA-39173: 暗号化データがダンプ・ファイル・セットに暗号化されずに格納されました。
マスター表"ALPHAJINSEI"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
ALPHAJINSEI.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
  /u03/dbfs/07416308B33C6B60E0630618000AFF4D/data/dpdir1/expdat_emp.dmp
ジョブ"ALPHAJINSEI"."SYS_EXPORT_SCHEMA_01"が土 10月 28 12:36:00 2023 elapsed 0 00:00:34で正常に完了しました

[opc@my-instance ~]$
```

### EMPテーブル削除

empテーブルがロストした想定で、いったんEMPテーブルを削除する。

（この後、先ほどexportしたデータをそのままimportして復活させる）

```sql
SQL> select * from emp
  2  ;

    EMP_ID NAME                           HIRE_DAT     SALARY    DEPT_ID
---------- ------------------------------ -------- ---------- ----------
       100 佐藤                           00-04-01     500000         50

SQL> DROP TABLE emp PURGE;

表が削除されました。

SQL> commit;

コミットが完了しました。

SQL> select * from emp;
select * from emp
              *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。

```


### import 

先ほどはalphajinseiスキーマ単位でexport したが、
importはempテーブル単位で実施する。

無事にインポートできた。

```bash
[opc@my-instance ~]$  impdp alphajinsei/xxx@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log TABLES=emp

Import: Release 19.0.0.0.0 - Production on 土 10月 28 12:37:55 2023
Version 19.20.0.0.0

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

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"を起動しています: alphajinsei/********@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log TABLES=emp
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
. . "ALPHAJINSEI"."EMP"                         6.914 KB       1行がインポートされました
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
ジョブ"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"が土 10月 28 12:38:05 2023 elapsed 0 00:00:08で正常に完了しました

[opc@my-instance ~]$
```

無事empテーブルを復活させることができた。

```sql
SQL> select table_name from user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
EMP

SQL> select * from emp;

    EMP_ID NAME                           HIRE_DAT     SALARY    DEPT_ID
---------- ------------------------------ -------- ---------- ----------
       100 佐藤                           00-04-01     500000         50
```

# datapumpの挙動を確認

せっかくなので、datapumpの挙動を調べてみる。
適当言っている可能性が高いので遠目に見てください。。

情報は古いが以下のスライドがわかりやすい
https://www.oracle.com/jp/a/tech/docs/technical-resources/20100908-expimp-beginner.pdf

## 別名のemp2 表にインポートする

過去のデータを別名でDBにインポートして、現在のデータを見比べる・・・などのユースケースを想定する。

### 事前状態確認
```sql
SQL> select table_name from user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
EMP
```


### 別名でimport 

`REMAP_TABLE=emp:emp2` を指定してimportする。
事前にemp2を作っておく必要はない。
※emp2を事前に作っておいてもimportできる。ただし`TABLE_EXISTS_ACTION` のオプションが必要。

```bash
[opc@my-instance ~]$ impdp alphajinsei/xxx@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log REMAP_TABLE=emp:emp2

Import: Release 19.0.0.0.0 - Production on 土 10月 28 12:48:04 2023
Version 19.20.0.0.0

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

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"ALPHAJINSEI"."SYS_IMPORT_FULL_01"は正常にロード/アンロードされました
"ALPHAJINSEI"."SYS_IMPORT_FULL_01"を起動しています: alphajinsei/********@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log REMAP_TABLE=emp:emp2
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
. . "ALPHAJINSEI"."EMP2"                        6.914 KB       1行がインポートされました
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
オブジェクト型SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMAの処理中です
ジョブ"ALPHAJINSEI"."SYS_IMPORT_FULL_01"が土 10月 28 12:48:14 2023 elapsed 0 00:00:07で正常に完了しました

```

emp2として表が作成され、データもimportされていることがわかる。

```sql
SQL> select table_name from user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
EMP2
EMP

SQL> select * from emp2;

    EMP_ID NAME                           HIRE_DAT     SALARY    DEPT_ID
---------- ------------------------------ -------- ---------- ----------
       100 佐藤                           00-04-01     500000         50
```



## emp表を上書きする

`TABLE_EXISTS_ACTION=REPLACE`のオプションを指定すると、既存の同名の表が存在した場合でも内容を上書きしてimportできる。データのリストアを行う手段の一つとして使えるか。

### 事前準備

事前準備として、既存の表に更新が入ったていで修正を加えておく。

```sql 
SQL> select * from emp;

    EMP_ID NAME                           HIRE_DAT     SALARY    DEPT_ID
---------- ------------------------------ -------- ---------- ----------
       100 佐藤                           00-04-01     500000         50

SQL> update emp set NAME='田中' where EMP_ID=100;

1行が更新されました。

SQL> insert into emp values('200','加藤','00-05-01','600000','60');

1行が作成されました。

SQL>  select * from emp order by emp_id;

    EMP_ID NAME                           HIRE_DAT     SALARY    DEPT_ID
---------- ------------------------------ -------- ---------- ----------
       100 田中                           00-04-01     500000         50
       200 加藤                           00-05-01     600000         60

SQL> commit;

コミットが完了しました。
```

### リストア

`TABLE_EXISTS_ACTION=REPLACE` オプションをつけてテーブルをimpdpする。

```bash
[opc@my-instance ~]$ impdp alphajinsei/xxx@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log TABLES=emp TABLE_EXISTS_ACTION=REPLACE

Import: Release 19.0.0.0.0 - Production on 土 10月 28 12:41:03 2023
Version 19.20.0.0.0

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

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"を起動しています: alphajinsei/********@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log TABLES=emp TABLE_EXISTS_ACTION=REPLACE
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
. . "ALPHAJINSEI"."EMP"                         6.914 KB       1行がインポートされました
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
ジョブ"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"が土 10月 28 12:41:12 2023 elapsed 0 00:00:06で正常に完了しました
```


emp表の中身がもとに戻っていることがわかる。
```sql
[opc@my-instance ~]$ sqlplus alphajinsei/xxx@myautonomousdb_medium

SQL*Plus: Release 19.0.0.0.0 - Production on 土 10月 28 12:41:18 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

最終正常ログイン時間: 土 10月 28 2023 12:41:03 +00:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0
に接続されました。
SQL> select * from emp order by emp_id;

    EMP_ID NAME                           HIRE_DAT     SALARY    DEPT_ID
---------- ------------------------------ -------- ---------- ----------
       100 佐藤                           00-04-01     500000         50

SQL>
```

### 補足

ちなみに、`TABLE_EXISTS_ACTION`オプションを指定せずに普通に実行するとエラーになる。

```bash
SQL>  select * from emp;

    EMP_ID NAME                           HIRE_DAT     SALARY    DEPT_ID
---------- ------------------------------ -------- ---------- ----------
       100 佐藤                           00-04-01     500000         50

SQL>
SQL>
SQL> quit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0との接続が切断されました。
[opc@my-instance ~]$ impdp alphajinsei/xxx@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log TABLES=emp

Import: Release 19.0.0.0.0 - Production on 土 10月 28 12:42:40 2023
Version 19.20.0.0.0

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

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"を起動しています: alphajinsei/********@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log TABLES=emp
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
ORA-39151: 表"ALPHAJINSEI"."EMP"が存在します。スキップのtable_exists_actionのため、すべての依存メタデータおよびデータはスキップされます

オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
ジョブ"ALPHAJINSEI"."SYS_IMPORT_TABLE_01"が完了しましたが、1エラーが土 10月 28 12:42:48 2023 elapsed 0 00:00:06で発生しています

[opc@my-instance ~]$
```




## ドライラン 

### expdpのドライラン(出力ファイルサイズの見積もり

実際にダンプファイルを出力することはせず、出力ダンプファイルのサイズを見積もる。

* `ESTIMATE_ONLY=YES`をつけて実行する。見積の手法として追加でオプションを指定でき、
    * `ESTIMATE=BLOCKS` ：ブロックサイズ * オブジェクトのブロックサイズで見積もる。精度は高くない
    * `ESTIMATE=STATISTICS`：統計情報をもとに見積もる。

※出力がないので当然だが、`DUMPFILE=expdat_emp.dmp`は指定しようとしてもエラーになる。



#### `ESTIMATE_ONLY=YES ESTIMATE=BLOCKS` を指定した場合

どう考えても1件しかデータの入っていないEMP表が64 KBなはずがないのだが、データブロックだかエクステントだかの単位で見積もられているものと思われる。

```bash
[opc@my-instance ~]$ expdp alphajinsei/xxx@myautonomousdb_medium DIRECTORY=dpdir1 LOGFILE=alphajinsei_exp.log SCHEMAS=ALPHAJINSEI ESTIMATE_ONLY=YES ESTIMATE=BLOCKS;

Export: Release 19.0.0.0.0 - Production on 土 10月 28 13:15:21 2023
Version 19.20.0.0.0

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

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
"ALPHAJINSEI"."SYS_EXPORT_SCHEMA_01"を起動しています: alphajinsei/********@myautonomousdb_medium DIRECTORY=dpdir1 LOGFILE=alphajinsei_exp.log SCHEMAS=ALPHAJINSEI ESTIMATE_ONLY=YES ESTIMATE=BLOCKS
BLOCKSメソッドを使用して見積り中です...
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
.  見積"ALPHAJINSEI"."EMP"                            64 KB
.  見積"ALPHAJINSEI"."EMP2"                           64 KB
BLOCKSメソッドを使用した見積り合計: 128 KB
ジョブ"ALPHAJINSEI"."SYS_EXPORT_SCHEMA_01"が土 10月 28 13:15:30 2023 elapsed 0 00:00:07で正常に完了しました
```


#### `ESTIMATE_ONLY=YES ESTIMATE=STATISTICS` を指定した場合

こちらのほうが精度よく見積もってくれる。

```bash
[opc@my-instance ~]$ expdp alphajinsei/xxx@myautonomousdb_medium DIRECTORY=dpdir1 LOGFILE=alphajinsei_exp.log SCHEMAS=ALPHAJINSEI ESTIMATE_ONLY=YES ESTIMATE=STATISTICS;

Export: Release 19.0.0.0.0 - Production on 土 10月 28 13:15:42 2023
Version 19.20.0.0.0

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

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
"ALPHAJINSEI"."SYS_EXPORT_SCHEMA_01"を起動しています: alphajinsei/********@myautonomousdb_medium DIRECTORY=dpdir1 LOGFILE=alphajinsei_exp.log SCHEMAS=ALPHAJINSEI ESTIMATE_ONLY=YES ESTIMATE=STATISTICS
STATISTICSメソッドを使用して見積り中です...
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
.  見積"ALPHAJINSEI"."EMP"                         6.582 KB
.  見積"ALPHAJINSEI"."EMP2"                        6.582 KB
STATISTICSメソッドを使用した見積り合計: 13.16 KB
ジョブ"ALPHAJINSEI"."SYS_EXPORT_SCHEMA_01"が土 10月 28 13:15:51 2023 elapsed 0 00:00:07で正常に完了しました

[opc@my-instance ~]$
```



### impdpのドライラン(実行予定SQLの表示)

実際にデータをimportすることはせず、実行される予定のSQLを表示するだけにとどめる。
`SQLFILE=DPDIR1:emp.sql`のように出力先SQLファイルを指定する。

```bash
[opc@my-instance ~]$ impdp alphajinsei/xxx@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log SQLFILE=DPDIR1:emp.sql

Import: Release 19.0.0.0.0 - Production on 土 10月 28 13:30:17 2023
Version 19.20.0.0.0

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

接続先: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
マスター表"ALPHAJINSEI"."SYS_SQL_FILE_FULL_01"は正常にロード/アンロードされました
"ALPHAJINSEI"."SYS_SQL_FILE_FULL_01"を起動しています: alphajinsei/********@myautonomousdb_medium DIRECTORY=dpdir1 DUMPFILE=expdat_emp.dmp LOGFILE=alphajinsei_exp.log SQLFILE=DPDIR1:emp.sql
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
オブジェクト型SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMAの処理中です
ジョブ"ALPHAJINSEI"."SYS_SQL_FILE_FULL_01"が土 10月 28 13:30:23 2023 elapsed 0 00:00:04で正常に完了しました

[opc@my-instance ~]$
```


確かに問題なくSQL生成はできており、ディレクトリオブジェクト`DPDIR1`に格納されていることはわかる・・・が、簡単に読み出す手段がないのが面倒・・・。
中身を見ようと思うと前述の通りオブジェクトストレージに移す必要がある。

```sql
SQL>  SELECT * FROM DBMS_CLOUD.LIST_FILES('DPDIR1') where object_name='emp.sql';

OBJECT_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     BYTES
----------
CHECKSUM
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATED                                                                     LAST_MODIFIED
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
emp.sql
      2137

23-10-28 13:28:59.000000 +00:00                                             23-10-28 13:30:22.000000 +00:00


SQL>
```

# ディレクトリオブジェクトに格納したデータを確認する

この際なので、上記の`emp.sql`ふくめ、ディレクトリオブジェクトに格納したデータをオブジェクトストレージに移して確認するところまでやる。


https://qiita.com/kenwatan/items/9bb537ae237e8417e87c


### バケットの準備

新規にalphajinsei-bucketを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/c230dddc-a263-227a-f6ff-4122c5d8c9cb.png)



正規のURIを確認する意図で、試しにテストデータをアップロードしてみる。
テストファイルのURIは`https://nrliaoyraehn.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/nrliaoyraehn/b/alphajinsei-bucket/o/testupload.txt`だった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/e2d5aefb-b5a8-1919-2112-8734d39d32ec.png)


### ユーザーの準備

既存のユーザdeca meronにAdministrator権限を付与（本来は厳密に設計すべきだが~~よくわからないので~~割愛）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/e7171608-13d3-c0f9-7bed-d13a3cf16a99.png)

認証トークンを生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/0276649a-7e6f-0314-a393-f1e7d4235db3.png)

### credentialの作成

ADMINでログインして以下SQLを叩く。

```sql
SQL> BEGIN
  2    DBMS_CLOUD.CREATE_CREDENTIAL(
  3      credential_name => 'decameron_credential',
  4      username => 'decameron0107@gmail.com',
  5      password => 'xxx'
  6    );
  7  END;
  8  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

デフォルトのクレデンシャルを変更しておく。（不要かも？）
```sql
SQL> ALTER DATABASE PROPERTY SET DEFAULT_CREDENTIAL = 'ADMIN.decameron_credential';

データベースが変更されました。

SQL>
```

### Autonomous DB -> object storageへのデータのコピー

ADMINでログイン。ディレクトリオブジェクト`DPDIR1`に格納されているファイルのうち、前節「impdpのドライラン(実行予定SQLの表示)」で生成した`emp.sql`をobject storageにコピーしたい。

```sql
SQL> SELECT object_name FROM DBMS_CLOUD.LIST_FILES('DPDIR1') ;

OBJECT_NAME
--------------------------------------------------------------------------------
alphajinsei_exp.log
expdat.dmp
expdat2.dmp
expdat_emp.dmp
BLOCKS.sql
expdat_emp2.dmp
emp.sql

7行が選択されました。

```


早速`DBMS_CLOUD.PUT_OBJECT`で、`emp.sql`をobject storageに移す。


※コマンドの詳細は以下。

https://docs.oracle.com/cd/F19136_01/arpls/DBMS_CLOUD.html#GUID-716F0DE7-C669-477E-8AB8-EA42E41ACB12

叩いてみた結果が以下。問題なく通っている。

```sql
SQL> BEGIN
  2    DBMS_CLOUD.PUT_OBJECT(
  3      credential_name => 'decameron_credential',
  4      object_uri => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrliaoyraehn/b/alphajinsei-bucket/o/emp.sql',
  5      directory_name => 'DPDIR1',
  6      file_name => 'emp.sql'
  7    );
  8  END;
  9  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

object storageにも確かに`emp.sql`が配置されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/761b54ca-cab2-cae1-b997-3562c8a2e095.png)

### `emp.sql`の中身を確認

ここまでしてようやく`emp.sql`の中身を確認できる。
ダウンロードして確認した結果が以下。
* 大きくわけて、`CREATE TABLE`の処理と、制約の追加の2つのSQLが投入される。
* emp表の一行分のデータも入っているはずなので、INSERT 文も記載されていることを期待したが、ここには表れないようだ。DDLしか記載されないのだろうか？

まあとりあえず見れたのでよしとする。

```sql:emp.sql
-- CONNECT ALPHAJINSEI
ALTER SESSION SET EVENTS '10150 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10904 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '25475 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10407 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10851 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '22830 TRACE NAME CONTEXT FOREVER, LEVEL 192 ';
-- new object type path: SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

BEGIN 
sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRENT_SCHEMA'), export_db_name=>'GE65A5B90992C2A_MYAUTONOMOUSDB', inst_scn=>'40068001910627');
COMMIT; 
END; 
/ 
-- new object type path: SCHEMA_EXPORT/TABLE/TABLE
CREATE TABLE "ALPHAJINSEI"."EMP" 
   (	"EMP_ID" NUMBER(3,0), 
	"NAME" VARCHAR2(10 CHAR) COLLATE "USING_NLS_COMP" NOT NULL ENABLE, 
	"HIRE_DATE" DATE NOT NULL ENABLE, 
	"SALARY" NUMBER(10,0) NOT NULL ENABLE, 
	"DEPT_ID" NUMBER(2,0)
   )  DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 10 MAXTRANS 255 
 COLUMN STORE COMPRESS FOR QUERY HIGH ROW LEVEL LOCKING LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA" ;
-- new object type path: SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
ALTER TABLE "ALPHAJINSEI"."EMP" ADD PRIMARY KEY ("EMP_ID")
  USING INDEX PCTFREE 10 INITRANS 20 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA"  ENABLE;
-- new object type path: SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
-- new object type path: SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
-- new object type path: SCHEMA_EXPORT/STATISTICS/MARKER
-- new object type path: SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMA

BEGIN 
 
COMMIT; 
END; 
/ 
-- fixup virtual columns... 
-- done fixup virtual columns 
```


同様の方法で、ディレクトリオブジェクトに格納していたダンプファイルなり、datapumpのログなりを取得してくることができる。

### 蛇足：object storageに直接export / import する

蛇足だが・・・直前に「ディレクトリオブジェクトに格納していたダンプファイルを取得してくる」と書いたが、
そもそもディレクトリオブジェクトを経由せずとも、直接object storageにダンプファイルをexportすることもできる。

### object storageに直接export 

```bash
[opc@my-instance ~]$ expdp ADMIN/"xxx"@myautonomousdb_medium credential=decameron_credential DIRECTORY=dpdir1 DUMPFILE=https://nrliaoyraehn.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/nrliaoyraehn/b/alphajinsei-bucket/o/expdat_emp_os.dmp LOGFILE=alphajinsei_exp.log SCHEMAS=ALPHAJINSEI;

Export: Release 19.0.0.0.0 - Production on 土 10月 28 18:28:39 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2023, 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"を起動しています: ADMIN/********@myautonomousdb_medium credential=decameron_credential DIRECTORY=dpdir1 DUMPFILE=https://nrliaoyraehn.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/nrliaoyraehn/b/alphajinsei-bucket/o/expdat_emp_os.dmp LOGFILE=alphajinsei_exp.log SCHEMAS=ALPHAJINSEI
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/USERの処理中です
オブジェクト型SCHEMA_EXPORT/SYSTEM_GRANTの処理中です
オブジェクト型SCHEMA_EXPORT/ROLE_GRANTの処理中です
オブジェクト型SCHEMA_EXPORT/DEFAULT_ROLEの処理中です
オブジェクト型SCHEMA_EXPORT/PASSWORD_HISTORYの処理中です
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMAの処理中です
. . "ALPHAJINSEI"."EMP"                         6.937 KB       2行がエクスポートされました
. . "ALPHAJINSEI"."EMP2"                        6.914 KB       1行がエクスポートされました
ORA-39173: 暗号化データがダンプ・ファイル・セットに暗号化されずに格納されました。
マスター表"ADMIN"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
ADMIN.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
  https://nrliaoyraehn.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/nrliaoyraehn/b/alphajinsei-bucket/o/expdat_emp_os.dmp
ジョブ"ADMIN"."SYS_EXPORT_SCHEMA_01"が土 10月 28 18:29:16 2023 elapsed 0 00:00:35で正常に完了しました

[opc@my-instance ~]$
```

バケット上では以下のファイルが生成される。謎に2ファイルできる・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/27476f11-cb6f-970f-a6af-8d75581aa5c5.png)


### object storageから直接import

同様にimportもできる。
※ADMINユーザーを利用しているめ、importしたいテーブル名は`alphajinsei.emp`とユーザー名を明示している点に注意。

```bash
[opc@my-instance ~]$ impdp ADMIN/"xxx"@myautonomousdb_medium credential=decameron_credential DUMPFILE=https://nrliaoyraehn.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/nrliaoyraehn/b/alphajinsei-bucket/o/expdat_emp_os.dmp LOGFILE=alphajinsei_exp.log TABLES=alphajinsei.emp TABLE_EXISTS_ACTION=REPLACE

Import: Release 19.0.0.0.0 - Production on 土 10月 28 20:31:10 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2023, 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"を起動しています: ADMIN/********@myautonomousdb_medium credential=decameron_credential DUMPFILE=https://nrliaoyraehn.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/nrliaoyraehn/b/alphajinsei-bucket/o/expdat_emp_os.dmp LOGFILE=alphajinsei_exp.log TABLES=alphajinsei.emp TABLE_EXISTS_ACTION=REPLACE
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
. . "ALPHAJINSEI"."EMP"                         6.914 KB       1行がインポートされました
オブジェクト型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"が土 10月 28 20:31:22 2023 elapsed 0 00:00:10で正常に完了しました

```


# 感想

autonomous DB、起動するのも管理も簡単だが、
出力ファイルをいちいちobject storageを介さないと見れない点についてはやはり面倒くさい・・・