[OCI]Autonomous DatabaseにアタッチしたNFS共有上にあるファイルからデータをロードしたり外部表を作ったりしてみた

# はじめに
先日のAutonomous Databaseの機能アップデートで、ディレクトリ・オブジェクトにアタッチしたNFS共有にあるファイルからのデータロード（DBMS_CLOUD.COPY_DATA）や、ディレクトリ・オブジェクトにアタッチしたNFS共有にあるファイルを元にした外部表の作成（DBMS_CLOUD.CREATE_EXTERNAL_TABLE）が可能になったので、早速試してみました。

今回は、プライベート・エンドポイントでデプロイされたAutonomous Databaseと同じサブネット上に、NFS共有としてOCI File Storageを作成して検証しました。

**＜OCI File Storageの情報＞**
![スクリーンショット 2023-03-14 10.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a4ff23cb-0dab-5772-9006-751143b0f402.png)
![スクリーンショット 2023-03-14 10.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/c0827db2-2710-93c2-4351-743e841f0754.png)
![スクリーンショット 2023-03-14 10.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bc79a893-c563-6af6-a201-81048529d4f2.png)
![スクリーンショット 2023-03-14 10.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a9caa907-a369-5971-a70a-3a32cd4d8eb6.png)
**＜Autonomous Databaseのネットワーク情報＞**
![スクリーンショット 2023-03-14 13.39.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/136fe502-3cca-5ba7-f783-bc7b7706e5a5.png)

# 1.事前準備

まずは、ComputeインスタンスでOCI File Storageをマウントして、内容を確認します。
マウントポイントを作成します。
```
[opc@testvm ~]$ sudo mkdir -p /mnt/MyFileSystem
```
mountコマンドで作成したマウントポイントにOCI File Storageをマウントします。
```
[opc@testvm ~]$ sudo mount myfss.myprivatesubnet.myvcn.oraclevcn.com:/MyFileSystem /mnt/MyFileSystem
```
lsコマンドで、マウントしたOCI File Storageの内容を確認します。
```
[opc@testvm ~]$ ls /mnt/MyFileSystem/
dept.csv  test.txt
```
catコマンドで、OCI File Storage内にあるdept.csvファイルの内容を確認します
```
[opc@testvm ~]$ cat /mnt/MyFileSystem/dept.csv
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON
```
umaountコマンドでOCI File Storageをアンマウントします。
```
[opc@testvm ~]$ sudo umount /mnt//MyFileSystemu[opc@testvm ~]$ 
```

# 2. Autonomous DatabaseへのNFS共有のアタッチ
SQL*PlusでadminユーザとしてAutonomous Databaseに接続します。
```
[opc@testvm ~]$ sqlplus admin/Demo#1Demo#1@(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=myadw.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=jym1f5owgdmcult_myadw_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=no)))

SQL*Plus: Release 21.0.0.0.0 - Production on Tue Mar 14 04:32:44 2023
Version 21.9.0.0.0

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

Last Successful login time: Tue Mar 14 2023 04:32:30 +00:00

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

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

Directory created.

SQL> 
```
ファイルシステム名を「MYFSS」として、作成したディレクトリ・オブジェクト「MY_FSS_DIR」にNFS共有（OCI File Storage）をアタッチします。
```sql
SQL> BEGIN
  2  	 DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEM(
  3  	  file_system_name	    => 'MYFSS',
  4  	  file_system_location	=> 'myfss.myprivatesubnet.myvcn.oraclevcn.com:/MyFileSystem',
  5  	  directory_name	    => 'MY_FSS_DIR',
  6  	  description		    => 'Mounting MyFileSystem'
  7  	 );
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL> 
```
DBMS_CLOUD.LIST_FILESファンクションを使用して、ディレクトリ「MY_FSS_DIR」内のファイルを確認します。
```sql
SQL> SELECT object_name FROM DBMS_CLOUD.LIST_FILES('MY_FSS_DIR');

OBJECT_NAME
--------------------------------------------------------------------------------
test.txt
dept.csv

SQL> 
```
OCI File Storageがディレクトリ・オブジェクトにアタッチされ、NFS共有（OCI File Storage）にあるファイルがディレクトリ「MY_FSS_DIR」から参照できることが確認できました。

# 3.ディレクトリ・オブジェクトにアタッチしたNFS共有からのデータロード

データのロード先となる表「dept」を作成します。
```sql
SQL> CREATE TABLE dept
  2   (DEPTNO NUMBER(2),
  3   DNAME VARCHAR2(14),
  4   LOC VARCHAR2(13)
  5  );

Table created.

SQL> 
```
DBMS_CLOUD.COPY_DATAプロシージャを使用して、NFS共有（OCI File Storage）をアタッチしたディレクトリ「MY_FSS_DIR」内にあるdept.csvファイルの内容を表deptにロードします。
file_uri_listは「ディレクトリ名:ファイル名」の形式で指定します。
```sql
SQL> BEGIN
  2    DBMS_CLOUD.COPY_DATA(
  3  	  table_name => 'DEPT',
  4  	  file_uri_list => 'MY_FSS_DIR:dept.csv',
  5  	  format => JSON_OBJECT('type' value 'csv')  );
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> 
```
表deptの内容を確認します。
```sql
SQL> SELECT * FROM dept;

    DEPTNO DNAME	      LOC
---------- -------------- -------------
	    10 ACCOUNTING	  NEW YORK
	    20 RESEARCH	      DALLAS
	    30 SALES	      CHICAGO
	    40 OPERATIONS	  BOSTON

SQL> 
```
NFS共有（OCI File Storage）をアタッチしたディレクトリ「MY_FSS_DIR」内にあるdept.csvファイルの内容が、表deptにロードできました。

# 4.ディレクトリ・オブジェクトにアタッチしたNFS共有にあるファイルを元にした外部表の作成

次に、DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャを使用して、NFS共有（OCI File Storage）をアタッチしたディレクトリ「MY_FSS_DIR」内にあるdept.csvファイルを元にした外部表「dept_ext」を作成します。
file_uri_listは「ディレクトリ名:ファイル名」の形式で指定します。
```sql
SQL> BEGIN
  2  	DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
  3  	   table_name    => 'DEPT_EXT',
  4  	   file_uri_list => 'MY_FSS_DIR:dept.csv',
  5  	   format        => json_object('type' value 'csv', 'skipheaders' value '0'),
  6  	   field_list    => 'DEPTNO,
  7  			             DNAME,
  8  			             LOC',
  9  	   column_list   => 'DEPTNO NUMBER,
 10  			             DNAME  VARCHAR2(14),
 11  			             LOC    VARCHAR2(13)'
 12     );
 13  END;
 14  /

PL/SQL procedure successfully completed.

SQL> 
```
表dept_extの内容を確認します。
```sql
SQL> SELECT * FROM dept_ext;

    DEPTNO DNAME	      LOC
---------- -------------- -------------
	    10 ACCOUNTING	  NEW YORK
	    20 RESEARCH	      DALLAS
	    30 SALES	      CHICAGO
	    40 OPERATIONS	  BOSTON

SQL> 
```
OCI File Storageをアタッチしたディレクトリ「MY_FSS_DIR」内にあるdept.csvファイルを元にした外部表「dept_ext」が作成できました。

# まとめ
Autonomous Databaseで、NFS共有（OCI File Storage）にあるファイルからのデータのロード、NFS共有（OCI File Storage）にあるファイルを元にした外部表の作成が可能であることが確認できました。

# 参考資料
・[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)
・[Load Data from Directories in Autonomous Database](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-directory.html#GUID-C551FA1C-8A96-4C50-9A7A-F0B67F05758A)
・[SQL言語リファレンス CREATE DIRECTORY](https://docs.oracle.com/cd/F19136_01/sqlrf/CREATE-DIRECTORY.html)
・[DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEM](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-admin.html#GUID-1C562DE9-066C-4D8B-B058-53F30E9061C3)
・[DBMS_CLOUD.COPY_DATA](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-subprograms.html#GUID-9428EA51-5DDD-43C2-B1F5-CD348C156122)
・[DBMS_CLOUD.CREATE_EXTERNAL_TABLE](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-subprograms.html#GUID-2AFBEFA4-992E-4F53-96DB-F560084C7DA9)