マウント・ポイントを経由して、Oracle Base DBからオブジェクト・ストレージへデータをエクスポートする手順

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
OCI上の「Oracle Base Database サービス」から<strong>オブジェクト・ストレージ</strong>にバックアップを出したい場合、さまざまな方法があります。以下に示す方法は一般的です。

- Base DBサービスの<strong>自動</strong>バックアップ機能を利用する。
- バックアップ・モジュールをインストールし、<strong>RMAN</strong>で手動バックアップを実施する。
- <strong>DBMS_CLOUD</strong>プロシージャを利用し、DBから直接にデータ・ポンプ・ファイルをオブジェクト・ストレージにエクスポートする。(※[関連記事](https://qiita.com/liu-wei/items/61f9df69b1b2a58c87c9))
- データ・ポンプ・ファイルを一時に<strong>ローカル</strong>にエクスポートしてから、[OCI-CLI](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm)か[Rlone](https://rclone.org/)などのツールで、オブジェクト・ストレージに転送する。

上記の各方法には、それぞれの利点と制限事項があります。今回はもう一つ選択肢を提供したいと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9447e632-0002-ebcf-0fe0-964425c0c763.png", width="400">

この前の[記事](https://qiita.com/liu-wei/items/c97c56c3037c91b78145)で紹介したように、オブジェクト・ストレージをローカルのファイル・システムにマウントできます。この方法は、OCI上のBase DBインスタンスにも適用されます。それにより、マウント・ポイントを経由し、データ・ポンプ・ファイルをオブジェクト・ストレージにエクスポートするのが可能です。

__この方法の利点__
✅ 自動バックアップ機能と違って、バケットに出力されたファイルを<strong>表示・管理できる</strong>。
✅ 直接にオブジェクト・ストレージにエクスポートするため、<strong>ローカルへの一時保存は不要</strong>。
✅ DBのバージョンに依存せず、<strong>DBMS_CLOUD</strong>プロシージャの<strong>インストールは不要</strong>。（Base DBにDBMS_CLOUDをインストールする際に、DBバージョンの制限がある）

※、この方法はBase DBサービスだけではなく、IaaS DBにも適用されます。

これから、ステップ・バイ・ステップで設定方法を説明します。

__検証環境__
- DBバージョン：Base DB 19c (VM) Standard Edition (on OL7)
- ツール：[s3fs-fuse](https://github.com/s3fs-fuse/s3fs-fuse)

__ステップ__
- [1. 事前準備](#1-事前準備)
  - [1-1. クレデンシャルの生成](#1-1-クレデンシャルの生成)
  - [1-2 ネームスペースの確認](#1-2-ネームスペースの確認)
- [2. Base DBインスタンスへのマウント](#2-base-dbインスタンスへのマウント)
  - [2-1. s3fs-fuseをインストール](#2-1-s3fs-fuseをインストール)
  - [2-2. クレデンシャルの設定](#2-2-クレデンシャルの設定)
  - [2-3. バケットをマウント](#2-3-バケットをマウント)
- [3. エクスポートの実施](#3-エクスポートの実施)


# 1. 事前準備
### 1-1. クレデンシャルの生成
プロファイル・アイコン(右上) → マイ・プロファイル → 顧客秘密キー → 秘密キーの生成
二度と表示しないので、メモしておいてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b7b0fc0e-4460-359e-38e7-4c2e4f8cd595.png", width="450">

マウスを「アクセス・キー」に移動し、キーをコピーします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7df44dbb-20ee-5c86-d371-912830340b82.png", width="500">

### 1-2 ネームスペースの確認
プロファイル・アイコン(右上) → テナンシ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/93885ae5-9758-1351-3a66-498b3955983c.png", width="500">

:::note
- 一部の古いテナンシでは、ネームスペースとテナンシ名は同じですけど、そもそも別物なので、間違いようにご注意ください。
- OCI-CLIを利用する場合、`oci os ns get`で簡単に取得できます。
:::

# 2. Base DBインスタンスへのマウント
### 2-1. s3fs-fuseをインストール
s3fs-fuseをインストールする前に、Oracle EPELリポジトリをまず有効にしてください。そうしないと、次のようなメッセージが表示されます。
```bash
[opc@db19cse ~]$ sudo yum install s3fs-fuse
Loaded plugins: versionlock
There are no enabled repos.
 Run "yum repolist all" to see the repos you have.
 To enable custom repositories:
     yum-config-manager --enable <repo>
[opc@db19cse ~]$ sudo yum repolist all
Loaded plugins: versionlock
repolist: 0
[opc@db19cse ~]$
```

__Oracle EPEL レポジトリを用意する__
リポジトリ・ファイルをダウンロードします。
コマンド：
`cd /etc/yum.repos.d`
`sudo wget http://yum.oracle.com/public-yum-ol7.repo`

__s3fs-fuseをインストール__
コマンド： `sudo yum install s3fs-fuse --enablerepo=ol7_developer_EPEL  -y`

### 2-2. クレデンシャルの設定
__パスワード・ファイルを作成__
[STEP 1-1](#1-1-クレデンシャルの生成)で作成したアクセス・キー(ACCESS_KEY)と秘密キー(SECRET_KEY)を利用し、パスワード・ファイルを作成します。その真ん中に、<font color=blue>半角のコロン</font>で結合されます。

パスとファイル名： `~/.passwd-s3fs`
コマンド例：
```bash
[opc@db19cse ~]$ sudo su -
Last login: <中略> on pts/0
[root@db19cse ~]# echo ACCESS_KEY:SECRET_KEY > ~/.passwd-s3fs
[root@db19cse ~]# chmod 600 ~/.passwd-s3fs
```

### 2-3. バケットをマウント
__マウント・ポイントを作成__:
```bash
[root@db19cse ~]# mkdir /u01/app/oracle/dmp
```

__バケットをマウント__:
`s3fs <bucket_Name> <mount_point> -o url=https://<namespace_name>.compat.objectstorage.<region>.oraclecloud.com -o nomultipart -o use_path_request_style -o endpoint=<region>,allow_other`

- <font color=blue>\<namespace_name></font>: ネームスペースに置き換えてください （[STEP 1-2](#1-2-ネームスペースの確認)で取得）。
- <font color=blue>\<region></font>: リージョン識別子に置き換えてください（例：ap-tokyo-1, ap-osaka-1）。分からない場合は[こちら](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/regions.htm)をご参照ください。

コマンド例：
```bash
[root@db19cse ~]# s3fs MyBucket /u01/app/oracle/dmp -o url=https://<namespace_name>.compat.objectstorage.ap-tokyo-1.oraclecloud.com -o nomultipart -o use_path_request_style -o endpoint=ap-tokyo-1,allow_other
[root@db19cse ~]# df -h /u01/app/oracle/dmp
Filesystem      Size  Used Avail Use% Mounted on
s3fs             16E     0   16E   0% /u01/app/oracle/dmp
[root@db19cse ~]#
```

バケットをアンマウントしたい場合、以下のコマンドを実施してください。
`fusermount -u <mount_point>`、或いは `umount <mount_point>`

# 3. エクスポートの実施
__ディレクトリの作成__
事前にディレクトリを作成する必要があります。パスは、マウント・ポイントと同じです。

次のように、管理者ユーザーでPDBに接続し、ディレクトリの作成と権限の割り当てを実施します。
```sql
sudo su - oracle
sqlplus system/<password>@<hostname_or_IP>:1521/<PDB_Service_Name>

SQL> show user;
USER is "SYSTEM"
SQL> CREATE OR REPLACE DIRECTORY MOUNT_DIR AS '/u01/app/oracle/dmp/';

Directory created.

SQL> GRANT READ, WRITE ON DIRECTORY MOUNT_DIR TO USER01;

Grant succeeded.
```

__ディレクトリの確認__
```sql
SQL> col DIRECTORY_NAME for a20
SQL> col DIRECTORY_PATH for a30
SQL> l
  1  SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM DBA_DIRECTORIES
  2* WHERE DIRECTORY_NAME = 'MOUNT_DIR'
SQL> /

DIRECTORY_NAME       DIRECTORY_PATH
-------------------- ------------------------------
MOUNT_DIR            /u01/app/oracle/dmp/
```

__エクスポートの実施__
コマンド例：`expdp <User_Name>/<Password>@<Host_Name_or_IP>:<Port>/<Service_Name> tables=<Table_Name> directory=<Directory_Name> dumpfile=<Data_Pump_File_Name> logfile=<Export_Log_File_Name>`

```bash
[oracle@db19cse ~]$ expdp USER01/********@10.0.0.54:1521/db19cse_pdb1.publicsubnet1.vcn1.oraclevcn.com tables=CUSTOMERS directory=MOUNT_DIR dumpfile=customers.dmp logfile=expdp_customers.log

Export: Release 19.0.0.0.0 - Production on Sat Jun 11 11:13:36 2022
Version 19.15.0.0.0

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

Connected to: Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Starting "USER01"."SYS_EXPORT_TABLE_01":  USER01/********@10.0.0.54:1521/db19cse_pdb1.publicsubnet1.vcn1.oraclevcn.com tables=CUSTOMERS directory=MOUNT_DIR dumpfile=customers.dmp logfile=expdp_customers.log
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/IDENTITY_COLUMN
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
. . exported "USER01"."CUSTOMERS"                        32.26 KB     319 rows
ORA-39173: Encrypted data has been stored unencrypted in dump file set.
Master table "USER01"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for USER01.SYS_EXPORT_TABLE_01 is:
  /u01/app/oracle/dmp/customers.dmp
Job "USER01"."SYS_EXPORT_TABLE_01" successfully completed at Sat Jun 11 11:13:57 2022 elapsed 0 00:00:19

[oracle@db19cse ~]$ ls -l /u01/app/oracle/dmp
total 230
-rw-r----- 1 oracle asmadmin 233472 Jun 11 11:13 customers.dmp
-rw-r--r-- 1 oracle asmadmin   1385 Jun 11 11:13 expdp_customers.log
[oracle@db19cse ~]$
```

バックアップ後、バケットの中身を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/26c50e1b-5617-d73b-cf34-b36cd110e0db.png)

:::note
注意
DBインスタンス再起動後、マウント・ポイントが切れないように再マウントするか、`/etc/fstab`を編集してください。
:::

以上

__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCI Object StorageのバケットをLinux/Windowsのローカルにマウントする](https://qiita.com/liu-wei/items/c97c56c3037c91b78145)
[Oracle DBからOCIオブジェクト・ストレージへデータをエクスポートする手順](https://qiita.com/liu-wei/items/61f9df69b1b2a58c87c9)