[Oracle Cloud] OCIFS ユーティリティをつかってObject StorageからBase Database 23cに データインポート(impdp)してみた。(2024/04/29)

# はじめに
OCI Object Storageバケットをファイルシステムとしてマウントが可能なOCIFSユーティリティは、Oracle Linux 8以降の対応です。Base Databaseで Oracle Linux 8 が利用可能になったため、Base Database からOCIFSを使用してObject Storageバケットをマウントした後、そのバケット内にある dmp ファイルをインポートしてみました。

# 作業の前提

- Object Storageのバケットは事前に作成
- OCIFS ユーティリティ ( ocifs ) パッケージは、Oracle Linux 8 以降で使用可能
    - Oracle Linux8 で稼働するBase Databaseとして以下の環境を準備
        - DBシステム・バージョン: 23.3.0.23.09
        - データベースのバージョン:23.3.0.23.09


# OCIFSユーティリティをインストール

- ocifsパッケージをインストール (opcユーザ)

```
$ sudo dnf install ocifs
Repository ol8_baseos_latest is listed more than once in the configuration
Repository ol8_appstream is listed more than once in the configuration
Repository ol8_codeready_builder is listed more than once in the configuration
Repository ol8_addons is listed more than once in the configuration
Repository ol8_UEKR6 is listed more than once in the configuration
Repository ol8_UEKR6_RDMA is listed more than once in the configuration
Last metadata expiration check: 1:09:14 ago on Mon 29 Apr 2024 12:03:02 AM UTC.
Dependencies resolved.
================================================================================
 Package         Arch       Version                 Repository             Size
================================================================================
Installing:
 ocifs           x86_64     1.1.0-2.el8             ol8_oci_included       73 k
Installing dependencies:
 fuse            x86_64     2.9.7-17.0.1.el8        ol8_baseos_latest      82 k
 fuse-common     x86_64     3.3.0-17.0.1.el8        ol8_baseos_latest      21 k

Transaction Summary
================================================================================
Install  3 Packages

Total download size: 177 k
Installed size: 365 k
Is this ok [y/N]: y
Downloading Packages:
(1/3): ocifs-1.1.0-2.el8.x86_64.rpm             678 kB/s |  73 kB     00:00
(2/3): fuse-2.9.7-17.0.1.el8.x86_64.rpm         709 kB/s |  82 kB     00:00
(3/3): fuse-common-3.3.0-17.0.1.el8.x86_64.rpm  172 kB/s |  21 kB     00:00
--------------------------------------------------------------------------------
Total                                           1.3 MB/s | 177 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : fuse-common-3.3.0-17.0.1.el8.x86_64                    1/3
  Installing       : fuse-2.9.7-17.0.1.el8.x86_64                           2/3
  Installing       : ocifs-1.1.0-2.el8.x86_64                               3/3
  Running scriptlet: ocifs-1.1.0-2.el8.x86_64                               3/3
  Verifying        : fuse-2.9.7-17.0.1.el8.x86_64                           1/3
  Verifying        : fuse-common-3.3.0-17.0.1.el8.x86_64                    2/3
  Verifying        : ocifs-1.1.0-2.el8.x86_64                               3/3

Installed:
  fuse-2.9.7-17.0.1.el8.x86_64        fuse-common-3.3.0-17.0.1.el8.x86_64
  ocifs-1.1.0-2.el8.x86_64

Complete!
```

# OCI認証の設定

### APIキーベースの認証

Base Database でoracleユーザにスイッチし、CLI 構成ファイル ( ~/.oci/config) を準備します。
[DEFAULT]プロファイルに以下のエントリが必要です。
- user
- tenancy
- region
- key_file
- finderprint

構成ファイルの例
 
```~/.oci/config
[DEFAULT]user=ocid1.user.oc1..aaaaaaaaXXXXX
fingerprint=fa:56:8a:e9:42:c8:8a:07:49:73:XX:XX:XX:XX
tenancy=ocid1.tenancy.oc1..aaaaaaaaXXXXX
region=ap-tokyo-1
key_file=/home/opc/.ssh/private.pem
```

# OCIFSでのマウント

- マウントディレクトリの準備 (opcユーザ)

```
$ sudo mkdir /u01/mydir/
$ sudo chown oracle:oinstall /u01/mydir/
```

- マウント (oracleユーザ)
$ ocifs <バケット名> <ディレクトリ名>
ocifs_bucket バケットを /u01/mydir にマウントする例

```
$ ocifs ocifs_bucket /u01/mydir
```

OCI Webコンソールなどで Object Storage に dmpファイルをアップロードし、マウント後のファイルを確認

```
$ ls /u01/mydir/
/u01/mydir/products.dmp /u01/mydir/scott.log

$ oci os object list -ns <namespace> -bn ocifs_bucket

{
  "data": [
    {
      "archival-state": null,
      "etag": "461e60ef-ef80-4c8c-8b13-946a8590ad32",
      "md5": "Lcp+IILR2gHJc/gsdlkYBg==",
      "name": "products.dmp",
      "size": 192512,
      "storage-tier": "Standard",
      "time-created": "2024-04-28T00:00:00.298000+00:00",
      "time-modified": "2024-04-28T00:00:00.516000+00:00"
    },
    {
      "archival-state": null,
      "etag": "88634c45-2293-44a0-9a87-9e278a860542",
      "md5": "G6+vzswrSfei9OGp3chE0Q==",
      "name": "scott.log",
      "size": 1294,
      "storage-tier": "Standard",
      "time-created": "2024-04-28T00:00:00.169000+00:00",
      "time-modified": "2024-04-28T00:00:00.169000+00:00"
    }
  ],
  "prefixes": []
}
```

# インポートの実施

- データ・ポンプを使用するデータベース・ユーザの準備
- マウントした領域へディレクトリオブジェクトの作成とREAD/WRITE権限付与

```sql
SQL> create directory dpump_dir as '/u01/mydir';
SQL> grant read, write on directory dpump_dir to test;
```

- impdpの実行

```
$ impdp test/<Password>#Welcome1#@pdb1 directory=dpump_dir full=y ignore=y dumpfile=products.dmp logfile=import.log

Import: Release 23.0.0.0.0 - Production on Sun Apr 28 00:00:00 2024
Version 23.3.0.23.09

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

Connected to: Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Legacy Mode Active due to the following parameters:
Legacy Mode Parameter: "ignore=TRUE" Location: Command Line, Replaced with: "table_exists_action=append"
Master table "SCOTT"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SCOTT"."SYS_IMPORT_FULL_01":  test/********@pdb1 directory=dpump_dir full=y table_exists_action=append dumpfile=products.dmp logfile=import.log
Processing object type TABLE_EXPORT/TABLE/TABLE
Table "SCOTT"."PRODUCTS" exists. Data will be appended to existing table but all dependent metadata will be skipped due to table_exists_action of append
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."PRODUCTS"                          6.093 KB       3 rows
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Job "SCOTT"."SYS_IMPORT_FULL_01" successfully completed at Sun Apr 28 00:00:00 2024 elapsed 0 00:00:09
```

# OCIFS のアンマウント
fusermount コマンドで アンマウントします。

```
fusermount -u /u01/mydir
```



# 留意点

- OCIFS は共有ファイル システムではありません。
- オブジェクト・データの破損を避けるため、OCIFSを使用して同じオブジェクト・ストレージ・バケット(または重複するバケットのサブフォルダ)を同時にマウントしないでください。
- Oracle Database 19c の Base Databaseでは、記事投稿時点では、同様の操作でエラーが発生し、完了しませんでした。

# 補足

- ocifsパッケージを含むoci_includedリポジトリを有効化
    - 有効になっていなかった場合以下の作業を実施
        - Base Database にopcユーザでログイン
            - /etc/yum.repos.d/ol8.repo に以下を追記
    
    ```
    $ sudo vi /etc/yum.repos.d/ol8.repo
    ```

    ```
    [ol8_oci_included]
    name=Oracle Software for OCI users on Oracle Linux $releasever ($basearch)
    baseurl=https://yum$ociregion.$ocidomain/repo/OracleLinux/OL8/oci/included/$basearch/
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
    gpgcheck=1
    enabled=1
    ```
    
- ocifsパッケージを含むoci_includedリポジトリを有効化 (opcユーザ)

  ```
    $ sudo dnf install oci-included-release-el8
    
    $ sudo dnf install oci-included-release-el8
    Oracle Linux 8 Addons (x86_64)                  145 kB/s | 3.0 kB     00:00
    Latest Unbreakable Enterprise Kernel Release 6  112 kB/s | 3.0 kB     00:00
    Oracle Linux 8 BaseOS Latest (x86_64)           153 kB/s | 3.6 kB     00:00
    Oracle Linux 8 Application Stream (x86_64)      129 kB/s | 3.9 kB     00:00
    Oracle Linux 8 CodeReady Builder (x86_64) - Uns 169 kB/s | 3.3 kB     00:00
    Oracle Software for OCI users on Oracle Linux 8  92 MB/s | 127 MB     00:01
    Package oci-included-release-el8-1.0-4.el8.x86_64 is already installed.
    Dependencies resolved.
    Nothing to do.
    Complete!
    
    $ sudo dnf config-manager --enable ol8_oci_included
    ```




# おわりに

OCIFS経由で Object Storage 上のファイルをimportすることができました。

# 参考情報

- [OCIFS ユーティリティをつかってObject Storageのバケットをマウントしてみた。(2023/08/02)](https://qiita.com/kenwatan/items/e7ee8c50b4e70cf012a2)
- [OCIFSユーティリティ](https://docs.oracle.com/ja-jp/iaas/oracle-linux/ocifs/index.htm)
- [ソフトウェアのインストール](https://docs.oracle.com/ja-jp/iaas/oracle-linux/getting-started/index.htm#install-software-on-instance)
- [Introducing OCIFS](https://blogs.oracle.com/linux/post/introducing-ocifs)
- [Oracle APEXの環境作成(8)](http://apexugj.blogspot.com/2022/11/building-oracle-apex-environment-08-compute.html)
- [Oracle Cloud(OCI)のoci cli設定ファイルの使い方をまとめてみた](https://qiita.com/feifo/items/29d842da0102379cf527)