[OCI]Autonomous Databasae：File Storage  ServiceのファイルシステムをAutonomous Databaseにアタッチしてみた

# はじめに
プライベート・エンドポイントで構成されているAutonomous DatabaseにNFSファイルシステムをアタッチ（マウント）できるようになったので早速試してみました。

オンプレミス環境とOCIをIPSec VPNやFastConnectで接続している場合、FSSのファイルシステムをオンプレミスのサーバでマウントすることも可能なので、
・オンプレミス側のDBサーバでFSSファイルシステムをマウント
・オンプレミスのDBでFSSファイルシステムに対するディレクトリ・オブジェクト作成
・expdpでオンプレミスのDBの内容をディレクトリ・オブジェクトにエクスポート
・Autonomous DatabaseにFSSファイルシステムをアタッチ
・impdpでFSSファイルシステム内のダンプファイルをAutonomous Databaseにインポート
といったことも可能になりますね。
![スクリーンショット 2022-11-16 13.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d063b9f9-1432-1348-1ecd-ad111176c944.png)

# 1. File Storage Serviceのファイルシステムの作成

Autonomous Databaseにアタッチするためのファイルシステムを作成します。
コンソールメニューから「ファイル・ストレージ」に移動します。
![スクリーンショット 2022-11-16 10.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/48fe4a26-5669-a67a-0143-0b8997893ad7.png)
「ファイルシステムの作成」をクリックします。
![スクリーンショット 2022-11-16 10.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0c3d6220-b7e0-0de9-f739-688257d86298.png)
ファイルシステムの作成ウィザードが表示されます。
![スクリーンショット 2022-11-16 10.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d213832c-0a7d-a612-2e6e-3164340f1c15.png)
「ファイル・システム情報」セクションの「詳細の編集」をクリックします。
![スクリーンショット 2022-11-16 10.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/50d98db7-0cf9-f321-89a6-9c92dfbbf685.png)
名前を変更します。今回はファイルシステム名を「MYFSS」としました。
![スクリーンショット 2022-11-16 13.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ef87c288-eb5f-4852-0ab0-a9848fa7ecea.png)
「マウント・ターゲット情報」セクションの「詳細の編集」をクリックします。
![スクリーンショット 2022-11-16 13.19.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/3440ac67-695d-c180-7d26-9cfbfe7e254c.png)
マウント・ターゲット名を変更します。今回はマウント・ターゲット名「MYFSSTARGET」としました。
「拡張オプションの表示」をクリックします。
![スクリーンショット 2022-11-16 13.21.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/4e8f3431-c02c-2d1e-f884-0ae421902d34.png)
ホスト名を入力します。今回はホスト名をmyfssとしました。
入力が完了したら「作成」をクリックします。

![スクリーンショット 2022-11-16 13.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/459bef9d-01e5-4583-5b72-d6b782169758.png)
なお、File Storage ServiceのファイルシステムをAutonomous Databaseにアタッチする際に、IPアドレスは使用できません。ホスト名（FQDN）を使用する必要があります。

ファイルシステム「MYFSS」が作成できました。
![スクリーンショット 2022-11-16 13.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/da695594-fbcb-ce79-18a6-4775c21220ac.png)


# 2. File Storage ServiceのファイルシステムをComputeインスタンスにマウント
Autonomous Databaseにファイルシステムをアタッチするのに必須ではありませんが、ファイルシステム内にファイルを作成するために、Oracle LinuxのComputeインスタンスにFile Storage Serviceのファイルシステムをマウントします。
マウントするためのコマンドはファイルシステムの詳細画面からエクスポートパスの詳細画面に移動し、「マウントコマンド」をクリックすると確認できます。
![スクリーンショット 2022-11-16 12.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/fa53111d-e6d9-8c53-9a92-c263b11d15b5.png)

マウントポイントとなるディレクトリ/mnt/MYFSSを作成し、パーミッションを変更します。
mountコマンドで/mnt/MYFSSにFile Storage Serviceのファイルシステムをマウントします。
```
[opc@tools ~]$ sudo mkdir -p /mnt/MYFSS
[opc@tools ~]$ sudo chmod 777 /mnt/MYFSS
[opc@tools ~]$ sudo mount myfsstarget.privatesubnet.vcn1.oraclevcn.com:/MYFSS /mnt/MYFSS
[opc@tools ~]$ 
```
Autonomous Databaseからファイルシステムへのアクセスをテストするためのファイルtest_data.txtを作成します。
```
[opc@tools ~]$ cat <<'EOL' >>/mnt/MYFSS/test_data.txt
> 1,RUN
> 2,DMC
> 3,Jam Master Jay
> EOL
[opc@tools ~]$ ls -l /mnt/MYFSS/test_data.txt
-rw-rw-r--. 1 opc opc 29 Nov 16 03:26 /mnt/MYFSS/test_data.txt
[opc@tools ~]$ 
[opc@tools ~]$ cat /mnt/MYFSS/test_data.txt
1,RUN
2,DMC
3,Jam Master Jay
[opc@tools ~]$
```

# 3. Autonomous DatabaseにFile Storage Serviceのファイルシステムをアタッチ

SQL*PlusからAutonomous Databaseに接続します。

ディレクトリオブジェクトを作成します。
```
SQL> CREATE DIRECTORY FSS_DIR AS 'FSS';

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

SQL>
```

DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEMプロシージャを使用して、ファイルシステムをAutonomous Databaseにアタッチします。

指定する各パラメータは以下の通りです。
|パラメータ|値|
|---|---|
|file_system_name|作成するファイルアタッチの名前|
|file_system_location|ファイルシステムのパス
|directory_name|ファイルシステムをマウントするディレクトリオブジェクト名|
|description|説明|

なお、ファイルシステムの名前に"-"が含まれる場合は、'"xxx-xxx"'のようにダブルクウォートで囲んだ上でシングルクウォートで囲む必要があります。

では、実際にアタッチしてみます。
```
SQL> BEGIN
  2     DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEM(
  3      file_system_name      => 'MYFSS',
  4      file_system_location  => 'myfsstarget.privatesubnet.vcn1.oraclevcn.com:/MYFSS',
  5      directory_name        => 'FSS_DIR',
  6      description           => 'Mounting a NFS'
  7     );
  8  END;
  9  /

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

SQL>
```
正常に完了しましたので、登録内容を確認してみます。
ファイルシステムのアタッチに関する情報は、dba_cloud_file_systemsビューで確認できます。

```
SQL> desc dba_cloud_file_systems
 名前                                       NULL?    型
 ----------------------------------------- -------- ----------------------------
 FILE_SYSTEM_NAME				                    VARCHAR2(128)
 FILE_SYSTEM_LOCATION				                VARCHAR2(4000)
 DIRECTORY_NAME 				                    VARCHAR2(128)
 DIRECTORY_PATH 				                    VARCHAR2(4000)
 DESCRIPTION					                    VARCHAR2(4000)
 CREATION_TIME					                    TIMESTAMP(6) WITH TIME ZONE
 UPDATE_TIME					                    TIMESTAMP(6) WITH TIME ZONE

SQL>
```
実際に確認してみます。
```
SQL> SELECT 
  2  	file_system_name, 
  3  	file_system_location,
  4  	directory_path
  5  FROM dba_cloud_file_systems;

FILE_SYSTEM_NAME
--------------------------------------------------------------------------------
FILE_SYSTEM_LOCATION
--------------------------------------------------------------------------------
DIRECTORY_PATH
--------------------------------------------------------------------------------
MYFSS
myfsstarget.privatesubnet.vcn1.oraclevcn.com:/MYFSS
/u03/dbfs/ED8B6F380F7E39D2E0532114000AD95F/data/FSS/


SQL>
```

正しく登録されていることが確認できたので、DBMS_CLOUD.LIST_FILESファンクションを使用して、ディレクトリ内（＝ファイルシステム内）にあるファイルの一覧を取得してみます。

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

OBJECT_NAME
--------------------------------------------------------------------------------
test_data.txt

SQL>
```
ディレクトリ内（＝ファイルシステム内）に先ほどComputeインスタンスから作成したtest_data.txtがあることが、Autonomous Databaseから確認できました。

ファイルの存在が確認できたので、UTL_FILEパッケージを使用して、ファイルの中身を確認してみます。
```
SQL> set serveroutput on
SQL> DECLARE
  2    l_file         UTL_FILE.FILE_TYPE;
  3    l_location     VARCHAR2(100) := 'FSS_DIR';
  4    l_filename     VARCHAR2(100) := 'test_data.txt';
  5    l_text         VARCHAR2(32767);
  6  BEGIN
  7    l_file := UTL_FILE.FOPEN(l_location, l_filename, 'r');
  8    LOOP
  9      BEGIN
 10        UTL_FILE.GET_LINE(l_file, l_text, 32767);
 11        DBMS_OUTPUT.PUT_LINE(l_text);
 12        EXCEPTION
 13          WHEN NO_DATA_FOUND THEN EXIT;
 14      END;
 15    END LOOP;
 16    UTL_FILE.FCLOSE(l_file);
 17  END;
 18  /
1,RUN
2,DMC
3,Jam Master Jay

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

SQL>
```
アタッチしたファイルシステム内にあるファイルtest_data.txtの内容が確認できました。

# 参考資料
・[Access Network File System from Autonomous Database](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/load-oci-file-storage.html#GUID-B9A7E58E-E1C0-4859-B16B-EF88942704BF)
・[How to Attach a File System to your Autonomous Database](https://blogs.oracle.com/datawarehousing/post/attach-file-system-autonomous-database)
・[UTL_FILE](https://docs.oracle.com/cd/F19136_01/arpls/UTL_FILE.html)