18.4 DBFSファイル・システムへのアクセス

この項では、DBFSファイル・システムへのアクセスに使用できる様々なインタフェースについて説明します。

18.4.1 DBFSクライアントの前提条件

DBFSファイル・システム・クライアント側アプリケーション(dbfs_clientという名前)は、DBFSにアクセスする各システムで実行されます。

DBFSファイル・システム・クライアントdbfs_clientの前提条件は、次のとおりです。

  • dbfs_clientホストに、Oracleクライアント・ライブラリがインストールされている必要があります。

  • dbfs_clientは、DBFSコマンド・インタフェースを使用して、直接のRDBMSクライアントとしてLinux、Linux.X64、Solaris、Solaris64、AIX、HPUXおよびWindowsプラットフォームで使用できます。

  • dbfs_clientは、マウント・クライアントとしてLinux、Linux.X64およびSolaris 11プラットフォームでのみ使用できます。dbfs_clientホストには、FUSE LinuxパッケージまたはSolaris libfuseパッケージがインストールされている必要があります。

    関連項目:

    詳細は、「DBFSマウント・インタフェース(LinuxおよびSolarisのみ)」を参照してください。

DBFSクライアント・コマンドライン・インタフェースを使用すると、ネットワーク上のホストからDBFSファイルシステムにファイルをコピーしたりDBFSファイルシステムからホストにファイルをコピーするコマンドなど、事前定義された多くのコマンドを実行できます。

コマンドライン・インタフェースのパフォーマンスは、DBFSクライアント・マウント・インタフェースよりも少し上回ります。これは、ファイル・システムにマウントせずに、ユーザー・スペースのファイル・システムを迂回するためです。ただし、これはアプリケーションに対して透過的ではありません。

DBFSクライアント・マウント・インタフェースを使用すると、ファイル・システム・マウント・ポイントを介してDBFSをマウントできるため、一般的なファイル・システム操作により、DBFSに格納されているファイルに透過的にアクセスできます。

DBFSコマンドを実行するには、DBFSクライアントに対して--commandを指定します。

18.4.2 DBFSクライアント上の複数のマウント・ポイント

Oracle Databaseリリース21c以降、単一のデータベース・ファイル・システム(DBFS)クライアント・インスタンスは、異なるデータベース・インスタンス間で異なるデータベース・ユーザーが所有する複数のDBFSをマウントできます。

複数のデータベース・ユーザーへのアクセスを有効にするには、DBFSクライアントで複数のマウント・ポイントを管理する必要があります。各マウント・ポイントを使用すると、1人のデータベース・ユーザーがDBFSにアクセスできます。

DBFSクライアントが単一のマウント・ポイントを介して単一のデータベース・ユーザーにアクセスできる場合、単一ユーザー・マウント・バージョン(SUMV)モードと呼ばれ、DBFSクライアントが複数のマウント・ポイントを介して複数のデータベース・ユーザーにアクセスできる場合、マルチ・ユーザー・マウント・バージョン(MUMV)モードと呼ばれます。

DBFSクライアントは、次のいずれかのモードで起動できます。ただし、いずれかのモードでクライアントを起動した後は、クライアントを再起動せずに他のモードに切り替えることはできません。DBFSクライアントがMUMVモードで起動されると、クライアントはOSユーザーとDBFSクライアントの間のインタフェースとして機能するManager File System (MFS)という疑似ファイル・システムを作成します。

MUMVモードは、複数のコンテナ・データベースにDBFSをマウントできる変数、または単一のコンテナ・データベースの異なるプラガブル・データベースに属するDBFSのみをマウントできる変数の2つで起動できます。複数のデータベースからDBFSをマウントするMUMV変数は、クロスデータベース変数と呼ばれ、単一のコンテナ・データベースの複数のPDBのDBFSをCDB変数としてマウントするMUMV変数と呼ばれます。両方の変数は、起動時にMFSマウント・ポイントのみを指定することで開始されます。DBFSマウントを追加するには、MFSマウント・ポイントに拡張属性を設定します。

18.4.2.1 CDB変数のMUMV

マルチ・ユーザー・マウント・バージョン(MUMV)モードのCDB変数は、単一コンテナ・データベース(CDB)の異なるプラガブル・データベース(PDB)に属するデータベース・ファイル・システム(DBFS)のマウント・ポイントを管理します。

MUMVモードのCDB変数を操作する場合は、次の点に注意してください。

  • 単一コンテナの複数のDBFSマウント・ポイントを管理するDBFSクライアントには、CDB$ROOTのCDBの共通ユーザーに接続するための資格証明を指定する必要があります。マウントするDBFSは、PDBのこの共通ユーザーに作成またはエクスポートする必要があります。
  • 指定されたコンテナ内のすべてのPDBのDBFSにマウント・ポイントを指定する必要があります。DBFSクライアントは、共通ユーザー資格証明を使用してCDB$ROOTに接続し、必要なPDBに切り替えて、指定されたマウント・ポイントを介してDBFSにアクセスします。

18.4.2.2 クロス・データベース変数のMUMV

マルチユーザー・マウント・バージョン(MUMV)モードのクロスデータベース変数は、複数のデータベースのデータベース・ファイル・システム(DBFS)のマウント・ポイントを管理します。

MUMVモードのクロスデータベース変数を使用する場合は、次の点に注意してください。

  • DBFSクライアントには、各DBFSマウント・ポイントを管理する各データベースのデータベース・ユーザーの資格証明が必要です。
  • DBFSマウント・ポイントはデータベース・ユーザーごとに指定する必要があり、DBFSはそれぞれのスキーマに作成する必要があります。

18.4.3 Manager File System

Manager File Systemは、OSユーザーとDBFSクライアント間のインタフェースです。OSユーザーは、制限されたファイル・システム・コマンドを使用してクライアントと通信できます。

Manager File System (MFS)は、マルチユーザー・マウント・バージョン(MUMV)モードでのみ有効です。DBFSクライアントによって管理される様々なマウント・ポイントをファイルとして扱います。MFSは、OSユーザーが複数のマウント・ポイントを管理するための簡単なインタフェースを提供します。

MFSはディスク上にファイルを作成または格納しません。MFSマウント・ポイントでは、限定されたファイル・システム操作のみが許可されます。

OSユーザーはMFSの下にファイルまたはディレクトリを作成できません。

18.4.3.1 DBFSマウント・ポイントの追加

DBFSマウント・ポイントを追加するには、MFSマウント・ポイントに拡張属性を指定します。

ノート:

MUMVモードは、-o walletオプションを指定しない場合でもウォレット・モードでのみ機能します。DBFSコマンドライン・インタフェースでパスワードを指定する方法はないため、DBFSクライアントに必要なすべての資格証明をウォレットに追加する必要があります。

MUMVモードのCDB変数を使用している場合は、/mnt/mfsディレクトリで拡張属性を設定して、CDB内の各PDBのマウント・ポイントを追加します。ここで、/mnt/mfsはMFSマウント・ポイントです。

CDB変数でのマウント・ポイントの定義

MUMVモードのCDB変数でマウント・ポイントを定義するには、次のステップを実行します。

  1. DBFSクライアントを起動してCDB$ROOTの共通ユーザーに接続し、MFSマウント・ポイントとウォレット別名を起動時に指定します。
    % dbfs_client -o mfs_mount=/mnt/mfs -o cdb=inst_cdb

    ここで、/mnt/mfsはMFSマウント・ポイントです。任意の空のディレクトリを指定できます。inst_cdbは、CDB$ROOTの共通ユーザーに接続できるウォレットに挿入される別名です。

  2. 次のように拡張属性を設定してDBFSマウント・ポイントを追加します。
    % setfattr -n mount_pdb -v " pdb1 /mnt/mp1" /mnt/mfs/

    説明:

    • mount_pdbは、DBFSマウント・ポイントをCDB変数にマウントするための拡張属性の名前です
    • pdb1は、inst_cdbが指す特定のCDB内のPDBの名前です。
    • /mnt/mp1は、PDB pdb1の共通ユーザーに存在するDBFSをマウントするマウント・ディレクトリです。
    • /mnt/mfsは、dbfs_clientコマンドの起動時に使用されたMFSマウント・ディレクトリです。
  3. (オプション)次のように異なる引数を使用して同じ拡張属性を設定し、DBFSマウント・ポイントを追加します。
    
       % setfattr -n mount_pdb  -v " pdb2 /mnt/mp2" /mnt/mfs 
       % setfattr -n mount_pdb  -v " pdb3 /mnt/mp3" /mnt/mfs 
    

    ここで、pdb2およびpdb3はコンテナ内のPDBの実際の名前です。

クロスデータベース変数でのマウント・ポイントの定義

MUMVモードのクロスデータベース変数でマウント・ポイントを定義するには、次のステップを実行します。

  1. 次の方法で起動時にMFSマウント・ポイントを指定して、MUMVクロスデータベース変数でDBFSクライアントを起動します。
    % dbfs_client -o mfs_mount=/mnt/mfs

    ここで、/mnt/mfsはMFSマウント・ポイントです。任意の空のディレクトリを選択できます。

  2. 次のように拡張属性を設定してDBFSマウント・ポイントを追加します。
    % setfattr -n mount -v " inst1 /mnt/mp1" /mnt/mfs/

    説明

    • mountは、DBFSマウントをクロス・データベース変数にマウントするための拡張属性の名前です
    • inst1は、DBFSをマウントする必要があるDBユーザーに接続するウォレット別名です。
    • /mnt/mp1は、DBFSをマウントするマウント・ディレクトリです。
    • /mnt/mfsは、dbfs_clientコマンドの起動時に使用されたMFSマウント・ディレクトリです。
  3. (オプション)次のように異なる引数を使用して同じ拡張属性を設定し、DBFSマウント・ポイントを追加します。
    % setfattr -n mount -v "inst2 /mnt/mp2" /mnt/mfs/
    % setfattr -n mount -v "inst3 /mnt/mp3" /mnt/mfs/

    ここで、inst2およびinst3はウォレットに存在する必要がある別名です。DBFSクライアントは、データベース内のユーザーに接続するための資格証明を持っている必要があり、スキーマ内に少なくとも1つのDBFSが作成されている必要があります。

18.4.3.2 DBFSマウント・ポイントのリスト

各DBFSマウント・ポイントには、MFSディレクトリ/mnt/mfsの下に対応するファイルがあります。そのため、標準のLinuxコマンドlsを使用してDBFSマウント・ポイントをリストできます。

次のコード・スニペットは、すべてのDBFSマウント・ポイントのリスト方法を示しています。
% ls  -l  /mnt/mfs

/mnt/mfsディレクトリの下の各ファイルの内容には、対応するマウント・ポイントで使用されるパラメータの詳細が表示されます。

MFSは読取り専用ファイル・システムです。DBFSクライアント以外のアプリケーションを使用して、ファイルまたはディレクトリを作成することはできません。MFSの下にファイルまたはディレクトリとして表示されるものはすべてDBFSクライアントによって定義されます。

18.4.3.3 DBFSマウント・ポイントのアンマウント

DBFSマウント・ポイントをアンマウントする手順は、MUMVモードのCDB変数とクロスデータベース変数の両方で同じです。

FUSE実行可能ファイルfusermountを使用してマウント・ポイントをアンマウントする必要があります。DBFSマウント・ポイントを削除する方法を次のコード・スニペットに示します。

% fusermount –u /mnt/mp1

18.4.3.4 DBFSクライアントの構成パラメータ

シングル・ユーザー・マウント・バージョン(SUMV)モードのDBFSクライアントのすべての構成パラメータは、起動時にマルチ・ユーザー・マウント・バージョン(MUMV)モードのDBFSクライアントでも使用できます。

MUMVモードでDBFSクライアントに渡されるすべてのコマンドライン・オプションは、後で追加できるすべてのDBFSマウント・ポイントによって継承されます。たとえば、次のdbfs_clientコマンドの場合、/mnt/mp1マウント・ポイントにマウントされているDBFSは、spool_max値を32として、max_threads valueを16として自動的に継承します。

% dbfs_client -o mfs_mount=/mnt/mfs -o spool_max=32 -o max_threads=16
% setfattr -n mount -v "inst1 /mnt/mp1" /mnt/mfs

DBFSクライアントとは異なる方法でマウント・ポイントを構成する場合は、次のようにsetfattrコマンドを使用します。

% sefattr -n mount -v "inst2 /mnt/mp2 -o trace_file=/tmp/clnt.trc,trace_level=1" /mnt/mfs

前述のコマンドでは、/mnt/mp2マウント・ポイントでDBFSクライアントのトレースのみが有効になりますが、起動時に指定されたspool_maxおよびmax_threads引数は継承されません。setfattrコマンドで指定された値は、起動時に指定された値を上書きします。

18.4.3.5 DBFSクライアントの診断機能

Oracle Databaseリリース21c以降、DBFSクライアントは、構成された自動診断リポジトリ(ADR)ベースのクライアント・トレース・ディレクトリにアラート・ファイルを書き込みます。

アラート・ファイルはDBFSクライアントのすべてのインスタンスに対して生成され、ADRベースのclients/DBFS/DBFS/traceディレクトリにあります。ファイル名の形式は、dbfs_alert_<client_pid>.trcです。

アラート・ファイルがトレース・ファイルと異なります。常に有効で、DBFSクライアントの重要なアクティビティのみがアラート・ファイルに書き込まれます。

ノート:

diagnostic_dest初期化パラメータは、自動診断リポジトリの場所を設定します。依存性サイクルが生成され、システムがハングアップする可能性があるため、dbfs_clientまたはOracle File Server (OFS)をファイル・システム・サーバーとして使用する場合は、このパラメータがdbfs_clientまたはOFS内のディレクトリを指していないことを確認してください。

18.4.4 DBFSクライアント・コマンドライン・インタフェースの操作

DBFSクライアント・コマンドライン・インタフェースを使用すると、DBFSに格納されているファイルに直接アクセスできます。

18.4.4.1 DBFSクライアント・コマンドライン・インタフェースについて

DBFSクライアント・コマンドライン・インタフェースを使用すると、ネットワーク上のホストからDBFSファイルシステムにファイルをコピーしたりDBFSファイルシステムからホストにファイルをコピーするコマンドなど、事前定義された多くのコマンドを実行できます。

コマンドライン・インタフェースのパフォーマンスは、DBFSクライアント・マウント・インタフェースよりも少し上回ります。これは、ファイル・システムにマウントせずに、ユーザー・スペースのファイル・システムを迂回するためです。ただし、これはアプリケーションに対して透過的ではありません。

DBFSクライアント・マウント・インタフェースを使用すると、ファイル・システム・マウント・ポイントを介してDBFSをマウントできるため、一般的なファイル・システム操作により、DBFSに格納されているファイルに透過的にアクセスできます。

DBFSコマンドを実行するには、DBFSクライアントに対して--commandを指定します。

コマンドライン・インタフェースのすべてのDBFSコンテンツ・ストア・パスの前には、dbfs:を付ける必要があります。dbfs:/staging_area/file1がその例です。指定するすべてのデータベース・パス名は、絶対パスである必要があります。

dbfs_client db_user@db_server--command command [switches] [arguments]

説明:

  • commandは、ls、cp、mkdirrmなどの実行可能なコマンドです。
  • switchesは、コマンドごとに固有です。
  • argumentsは、ファイル名またはディレクトリ名で、コマンドごとに固有です。

dbfs_clientは、失敗するとゼロ以外の値を戻します。

18.4.4.2 ディレクトリのリスト

lsコマンドを使用して、ディレクトリのコンテンツをリストできます。

次の構文を使用します。

dbfs_client db_user@db_server --command ls [switches] target

ここで

  • targetは、リストされたディレクトリです。

  • switchesは、次の組合せのいずれかになります。

    • -aは、すべてのファイル('.'や'..'を含む)を示します。

    • -lは、長いリスト形式(各ファイルの名前、ファイル・タイプ、権限およびサイズ)を示します。

    • -Rは、サブディレクトリを再帰的にリストします。

たとえば:

$ dbfs_client ETLUser@DBConnectString --command  ls dbfs:/staging_area/dir1

または

$ dbfs_client ETLUser@DBConnectString --command  ls -l -a -R dbfs:/staging_area/dir1 

18.4.4.3 ファイルおよびディレクトリのコピー

cpコマンドを使用して、ファイルまたはディレクトリをソースの場所から宛先の場所にコピーできます。

cpコマンドは、ディレクトリの再帰的コピーもサポートしています。

dbfs_client db_user@db_server --command cp [switches] source destination

説明:

  • sourceは、ソースの場所です。

  • destinationは、宛先の場所です。

  • switches-Rまたは-rのいずれかで、これらは、すべてのソース・コンテンツを宛先ディレクトリに再帰的にコピーするためのオプションです。

次の例では、ローカル・ディレクトリ01-01-10-dumpのコンテンツをDBFS内のディレクトリに再帰的にコピーします。

$ dbfs_client ETLUser@DBConnectString --command cp -R  01-01-10-dump dbfs:/staging_area/

次の例では、ファイルhello.txtをDBFSからローカル・ファイルHi.txtにコピーします。

$ dbfs_client ETLUser@DBConnectString --command cp dbfs:/staging_area/hello.txt Hi.txt

18.4.4.4 ファイルおよびディレクトリの削除

コマンドrmを使用して、ファイルまたはディレクトリを削除できます。

rmコマンドは、ディレクトリの再帰的削除もサポートしています。

dbfs_client db_user@db_server --command rm [switches] target

説明:

  • targetは、リストされたディレクトリです。

  • switches-Rまたは-rのいずれかで、これらは、すべてのコンテンツを再帰的に削除するためのオプションです。

たとえば:

$ dbfs_client ETLUser@DBConnectString --command rm  dbfs:/staging_area/srcdir/hello.txt

または

$ dbfs_client ETLUser@DBConnectString --command rm -R  dbfs:/staging_area/dir1

18.4.5 DBFSマウント・インタフェース(LinuxおよびSolarisのみ)

dbfs_clientを使用してDBFSをマウントできるのは、LinuxおよびSolarisの場合のみです。

LinuxプラットフォームとSolarisプラットフォームでは要件が異なります。

18.4.5.1 Solaris 11 SRU7以降でのFUSEのインストール

FUSEをインストールする場合、Solaris 11 SRU7以降ではdbfs_clientをマウント・クライアントとして使用できます

Solaris 11 SRU7以降でdbfs_clientをマウント・クライアントとして使用するには、FUSEをインストールします。

  • 次のパッケージをrootとして実行します。

    pkg install libfuse

18.4.5.2 Solaris固有の権限

Solarisの場合、DBFSファイルシステムでマウントおよびアンマウント操作を実行するには、Solarisの権限PRIV_SYS_MOUNTが必要です。

ユーザーのSolarisの権限PRIV_SYS_MOUNTを付与します。

  1. /etc/user_attrを編集します。

  2. 次のようにユーザー・エントリを追加または変更します(ユーザーがOracleであることを前提としています)。

    oracle::::type=normal;project=group.dba;defaultpriv=basic,priv_sys_mount;;auth s=solaris.smf.*
    

18.4.5.3 SolarisおよびLinux用のマウント・コマンドについて

SolarisおよびLinux用のdbfs_clientマウント・コマンドでは、特定の構文を使用します。

構文:

dbfs_client db_user@db_server [-o option_1 -o option_2 ...] mount_point

必須のパラメータは次のとおりです。

  • db_userは、DBFSコンテンツ・ストア・ファイル・システムを所有するデータベース・ユーザーの名前です。

  • db_serverは、hrdb_host:1521/hrservicetnsnames.oraで指定された別名など、Oracle Databaseサーバーへの有効な接続文字列です。

  • mount_pointは、データベース・ファイル・システムがマウントされるパスです。データベース・ユーザーによって所有されるすべてのファイル・システムはマウント・ポイントで表示されることに注意してください。

オプションは次のとおりです。

  • direct_io: OSページ・キャッシュを使用しないため、大きいファイルの場合にパフォーマンスが向上します。このオプションでは、ファイル・システムのプログラムを実行できません。DBFSがETLステージング領域として使用される場合は、このオプションをお薦めします。

  • wallet: DBFSクライアントをバックグラウンドで実行します。証明書を取得できるようにウォレットを設定する必要があります。

  • failover: データを損失せずに残存のデータベース・インスタンスにDBFSクライアントをフェイルオーバーします。小さいファイルでは特に、書込みでパフォーマンスのコストが予想されます。

  • allow_root: rootユーザーによるファイルシステムへのアクセスを許可します。/etc/fuse.conf構成ファイルにuser_allow_otherパラメータを設定する必要があります。

  • allow_other: 他のユーザーによるファイルシステムへのアクセスを許可します。/etc/fuse.conf構成ファイルにuser_allow_otherパラメータを設定する必要があります。

  • rw: 読取り/書込みとしてファイルシステムをマウントします。これがデフォルトの設定です。

  • ro: 読取り専用としてファイルシステムをマウントします。ファイルを変更することはできません。

  • trace_level=nでは、トレース・レベルを設します。トレース・レベルは次のとおりです。

    • 1 DEBUG

    • 2 INFO

    • 3 WARNING

    • 4 ERROR: デフォルトのトレース・レベルです。エラーが発生した場合のみ診断情報を出力します。このトレース・レベルは常に有効にすることをお薦めします。

    • 5 CRITICAL

  • trace_file=STR: トレース・ログ・ファイルを指定します。STRfile_namesyslogのどちらでもかまいません。

  • trace_size=trcfile_size: トレース・ファイルのサイズをMB単位で指定します。デフォルトでは、dbfs_clientでは、2つの10MBファイル間でトレース出力をローテーションします。trace_size=に対して0を指定すると、トレース・ファイルの最大サイズが無制限に設定されます。

18.4.5.4 ウォレットを使用したファイル・システムのマウント

様々な環境変数を構成した後、ウォレットを使用してファイル・システムをマウントできます。

ウォレットを使用してファイル・システムをマウントする前に、最初にLD_LIBRARY_PATHORACLE_HOME環境変数およびsqlnet.oraを正しく構成する必要があります。

  1. 管理ユーザーとしてログインします。
  2. DBFSストアをマウントします。(このステップはrootユーザーとして実行しないことをお薦めします。)
    % dbfs_client @/dbfsdb -o wallet,rw,user,direct_io /mnt/dbfs
    
  3. (オプション)前述のステップが成功したかどうかをテストするには、管理ユーザーとして、dbfsディレクトリを表示します。
    $ ls /mnt/tdbfs

    walletオプションを使用すると、dbfs_clientがバックグラウンドで実行されます。

18.4.5.5 コマンド・プロンプトでパスワードを使用したファイル・システムのマウント

dbfs_clientを使用してファイル・システムをマウントするには、コマンド・プロンプトでパスワードを入力する必要があります。

  • コマンド・プロンプトで次のコマンドを実行し、パスワードを入力します。

    $ dbfs_client ETLUser@DBConnectString /mnt/dbfs
      password: xxxxxxx

    コマンド・プロンプトでパスワードを指定すると、dbfs_clientがフォアグラウンドで実行されます。

18.4.5.6 ファイル・システムのアンマウント

Linuxの場合、fusermountを実行して、ファイル・システムをアンマウントできます。

fusermountをLinuxで実行するには、次を実行します。

  • 次のコマンドを実行します。

     $ fusermount -u <mount point>
    

Solarisの場合、umountを実行して、ファイル・システムをアンマウントできます。

  • 次のコマンドを実行します。

     $ umount -u <mount point>

18.4.5.7 Linux用のfstabユーティリティを使用したDBFSのマウント

Linuxの場合、fstabユーティリティを構成し、dbfs_clientを使用してDBFSファイルシステムをマウントします。

/etc/fstabでDBFSをマウントするには、Oracle Walletを認証に使用する必要があります。

  1. rootユーザーとしてログインします。
  2. ユーザーをユーザーrootに変更し、dbfs_clientのグループをグループfuseに変更します。
    # chown root.fuse $ORACLE_HOME/bin/dbfs_client
    
  3. dbfs_clientsetuidビットを設定し、このユーザーとグループのみにexecute権限を制限します。
    # chmod u+rwxs,g+rx-w,o-rwx dbfs_client
    
  4. dbfs_clientのシンボリック・リンクをmount.dbfsとして/sbinに作成します。
    $ ln -s $ORACLE_HOME/bin/dbfs_client /sbin/mount.dbfs
    
  5. fuseという名前の新しいLinuxグループを作成します。
  6. DBFSクライアントを実行しているLinuxユーザーをfuseグループに追加します。
  7. 次の行を/etc/fstabに追加します。
    /sbin/mount.dbfs#db_user@db_server mount_point fuse rw,user,noauto 0 0
    

    たとえば:

    /sbin/mount.dbfs#/@DBConnectString /mnt/dbfs fuse rw,user,noauto 0 0
    
  8. Linuxユーザーは、Linuxの標準のmountコマンドを使用して、DBFSファイル・システムをマウントできます。たとえば:
    $ mount /mnt/dbfs
    

    現在、FUSEautomountをサポートしていません。

18.4.5.8 Solaris用のvfstabユーティリティを使用したDBFSのマウント

Solarisでは一般に、ファイル・システムは、vfstabユーティリティを使用して構成されます。

  1. dbfs_clientを起動するために使用するマウント・シェル・スクリプトmount_dbfs.shを作成します。Oracle RDBMSに必要な環境変数をすべてエクスポートする必要があります。これらの環境変数には、TNS_ADMINORACLE_HOMEおよびLD_LIBRARY_PATHが含まれます。たとえば:
    #!/bin/ksh
    export TNS_ADMIN=/export/home/oracle/dbfs/tnsadmin
    export ORACLE_HOME=/export/home/oracle/11.2.0/dbhome_1
    export DBFS_USER=dbfs_user
    export DBFS_PASSWD=/tmp/passwd.f
    export DBFS_DB_CONN=dbfs_db
    export O=$ORACLE_HOME
    export LD_LIBRARY_PATH=$O/lib:$O/rdbms/lib:/usr/lib:/lib:$LD_LIBRARY_PATH
    export NOHUP_LOG=/tmp/dbfs.nohup
    
    (nohup $ORACLE_HOME/bin/dbfs_client $DBFS_USER@$DBFS_DB_CONN < $DBFS_PASSWD
             2>&1 & ) &
  2. DBFSのエントリを/etc/vfstabに追加します。device_to_mountに対してmount_dbfs.shスクリプトを指定します。FS_typeに対してuvfsを指定します。formount_at_bootは指定しません。必要に応じて、マウント・オプションを指定します。たとえば:
    /usr/local/bin/mount_dbfs.sh - /mnt/dbfs uvfs - no rw,allow_other
    
  3. ユーザーは標準のSolarisマウント・コマンドを使用して、DBFSファイル・システムをマウントできます。たとえば:
    $ mount /mnt/dbfs
    
  4. ユーザーは標準のSolarisのumountコマンドを使用して、DBFSファイル・システムをアンマウントできます。たとえば:
    $ umount /mnt/dbfs
    

18.4.5.9 マウントされたファイル・システムの制限事項

DBFSでは、一部を例外としてほとんどのファイル・システム操作をサポートしています。

例外は次のとおりです。

  • ioctl

  • 範囲ロック(ファイル・ロックがサポートされています)

  • libaioを使用した非同期I/O

  • O_DIRECTファイル・オープン

  • ハード・リンク

  • その他の特定のファイル・モード

メモリー・マップ・ファイルは、共有書込み可能モードを除いてサポートされます。パフォーマンス上の理由から、DBFSでは、ファイル・データまたはファイル・データ属性の読取りのたびにファイル・アクセス時間を更新することはありません。

ノート:

direct_ioオプションでマウントされたDBFSマウント・ファイル・システムからプログラムを実行しないでください。

Oracleでは、NFSまたはSambaを使用したDBFSファイル・システムのエクスポートはサポートしていません。

18.4.5.10 DBFSマウント・ポイントで格納されるファイルのタイプに関する制限事項

DBFSファイルに対するファイル操作の結果、DBFSにライトバックされるデータが増える可能性があるシナリオでは、DBFSを回避する必要があります。

次のシナリオは網羅したものではありませんが、DBFSとデータベースを相互に依存させる可能性があり、そのために回避する必要がある運用の例を示しています。

  • サンプル・シナリオ1: DBFSは、DBFSをホストしている同じデータベースによって生成されたトレース・ファイルの宛先です。

    たとえば、DBFSにトレース・ファイルを書き込む操作では、DBFSにライトバックされるトレース・データをさらに生成できます。

  • サンプル・シナリオ2: データベース・レプリケーションの証跡ファイルはDBFS内にあり、DBFSはレプリケートされるSAMEデータベース内にあります。

    たとえば: レプリケーション・プロセスによって証跡に書き込む操作では、REDOが生成されます。このREDOはレプリケーションにフィードバックされる可能性があります。

  • サンプル・シナリオ3: DBFSは、同じデータベースのデータベース・ファイルの宛先です。

    たとえば、データファイル、制御ファイル、REDOログ・ファイルはDBFSとデータベースを相互に依存させる可能性があります。

18.4.6 ファイル・システム・セキュリティ・モデル

データベースでは、DBFSでセキュリティを管理します。オペレーティング・システムのセキュリティ・モデルは使用しません。

18.4.6.1 ファイル・システムのセキュリティ・モデルについて

DBFSは、ユーザーによって作成されたすべてのファイル・システムが、デフォルトでそのユーザー固有になるセキュリティ・モデルで機能します。

このモデルを変更しないことをお薦めします。オペレーティング・システム・ユーザーとOracle Databaseユーザーは異なるため、複数のオペレーティング・システム・ユーザーを単一のDBFSファイルシステムにマウントすることはできません。これらのマウントは、マウント・ポイントおよび権限が異なる場合があります。たとえば、OS user1はDBFSファイルシステムをREAD ONLYとしてマウントでき、OS user2READ WRITEとしてマウントできます。ただし、どちらのユーザーも同じデータベース・ユーザーとしてファイルシステムにアクセスするため、Oracle Databaseでは、両方のユーザーを同じ権限を持つユーザーとして認識します。

データベース・ファイル・システムにアクセスするには、ファイル・システムの基礎となっている表の権限を持つデータベース・ユーザーとしてデータベースにログインする必要があります。データベース管理者は、ファイル・システムへのアクセス権をデータベース・ユーザーに付与します。データベース・ユーザーごとに、ファイル・システムに対して異なるREAD権限またはUPDATE権限を持つことができます。データベース管理者は、DBFSファイル・システムに格納されているすべてのファイルにアクセスできます。

各クライアント・コンピュータでは、DBFSマウント・ポイントへのアクセスは、ファイル・システムをマウントするオペレーティング・システム・ユーザーに制限されています。ただし、多数のユーザーが同一のDBFSファイル・システムを別々にマウントできるため、これによってDBFSファイル・システムにアクセス可能なユーザーの数が制限されることはありません。

DBFSでは、データベースの権限チェックのみが実行されます。Linuxでは、DBFSがファイル・システムがマウントされた場合に、オペレーティング・システムのファイル・レベルの権限チェックが実行されます。コマンド・インタフェースを使用した場合、またはPL/SQLインタフェースを直接使用した場合は、DBFSでこのチェックは実行されません。

18.4.6.2 共有ルート・アクセスの有効化

ファイル・システムをマウントしているオペレーティング・システム・ユーザーとしては、allow_rootオプションを指定することで、ファイル・システムへのrootアクセスを許可できます。

このオプションでは、例18-1に示されているように、/etc/fuse.confファイルにuser_allow_otherフィールドを含める必要があります。

例18-1 他のユーザーのルート・アクセスの有効化

# Allow users to specify the 'allow_root' mount option.
user_allow_other

18.4.6.3 複数データベース・ユーザーのDBFSアクセスについて

DBFSでは、複数のユーザーがファイルシステムの状態のサブセットを共有できます。

単一のファイルシステムに複数のデータベース・ユーザーがアクセスできます。たとえば、ファイルシステムを所有するデータベース・ユーザーが権限を付与されたユーザーで、そのユーザーの証明書を共有すると、セキュリティのリスクにさらされる危険があるとします。これを回避するために、DBFSでは、複数のデータベース・ユーザーがファイルシステムの状態のサブセットを共有できるようになっています。

DBFSコンテンツAPIによるDBFSの登録およびマウントは各ユーザー固有ですが、各ユーザーが利用する基礎となるファイルシステムおよび表はユーザー間で共有できます。これにより、個々のファイルシステムを個別にマウントでき、SQL/PLSQLまたはdbfs_clientのいずれかを使用して、異なるデータベース・ユーザーで使用できます。

18.4.6.4 複数のデータベース・ユーザー間でのDBFSアクセスの共有の確立

この項では、DBFSのアクセス権を複数のデータベース・ユーザーに共有する方法について学習します。

次の例では、ユーザーuser1はファイルシステムを変更できますが、user2はこれらの変更を参照することしかできません。user1は、ファイルシステムを作成するデータベース・ユーザーで、user2は、最終的にdbfs_clientを使用してファイルシステムのマウントとアクセスを行うデータベース・ユーザーです。user1user2は、どちらもDBFS_ROLE権限を持ちます。

  1. ファイルシステムを作成するユーザーとして接続します。
    sys@tank as sysdba> connect user1
    Connected.
    
  2. ファイルシステムuser1_FSを作成してストアを登録し、user1_mtとしてマウントします。
    user1@tank> exec dbms_dbfs_sfs.createFilesystem('user1_FS');
    user1@tank> exec dbms_dbfs_content.registerStore('user1_FS', 'posix', 'DBMS_DBFS_SFS');
    user1@tank> exec dbms_dbfs_content.mountStore('user1_FS', 'user1_mnt');
    user1@tank> commit;
    
  3. (オプション)すべてのマウントを表示することにより、前述のステップが正常に実行されたかどうかを確認できます。
    user1@tank> select * from table(dbms_dbfs_content.listMounts);
    
    STORE_NAME           |   STORE_ID|PROVIDER_NAME
    ---------------------|- ---------|------------------------------------------
    PROVIDER_PKG         |PROVIDER_ID|PROVIDER_VERSION     |STORE_FEATURES
    ---------------------|-----------|---------------------|--------------------
    STORE_GUID
    ----------
    STORE_MOUNT
    ----------------------------------------------------------------------------
    CREATED
    ----------------------------------------------------------------------------
    MOUNT_PROPERTIES(PROPNAME, PROPVALUE, TYPECODE)
    ----------------------------------------------------------------------------
    user1_FS             | 1362968596|posix
    "DBMS_DBFS_SFS"      | 3350646887|0.5.0                | 12714135  141867344
    user1_mnt
    01-FEB-10 09.44.25.357858 PM
    DBMS_DBFS_CONTENT_PROPERTIES_T(
      DBMS_DBFS_CONTENT_PROPERTY_T('principal', (null), 9),
      DBMS_DBFS_CONTENT_PROPERTY_T('owner', (null), 9), 
      DBMS_DBFS_CONTENT_PROPERTY_T('acl', (null), 9), 
      DBMS_DBFS_CONTENT_PROPERTY_T('asof', (null), 187),
      DBMS_DBFS_CONTENT_PROPERTY_T('read_only', '0', 2))

  4. (オプション)dbfs_clientを使用するユーザーとして接続します。
    user1@tank> connect user2
    Connected.
    
  5. [オプション] user2は、user2にマウントがないため、user1のDBFSの状態を確認できません。
    user2@tank> select * from table(dbms_dbfs_content.listMounts);
    
  6. user1として接続している間に、DBFS_ROLE権限を持つユーザーがアクセスできるように、ファイルシステムuser1_FSをエクスポートします。
    user1@tank> exec dbms_dbfs_sfs.exportFilesystem('user1_FS');
    user1@tank> commit;
    
  7. dbfs_clientを使用するユーザーとして接続します。
    user1@tank> connect user2
    Connected.
    
  8. user2として、使用可能なすべての表を確認します。
    user2@tank> select * from table(dbms_dbfs_sfs.listTables);
    
    SCHEMA_NAME                |TABLE_NAME                 |PTABLE_NAME
    ---------------------------|---------------------------|-------------------
    VERSION#
    --------------------------------CREATED
    ---------------------------------------------------------------------------
    FORMATTED
    ---------------------------------------------------------------------------
    PROPERTIES(PROPNAME, PROPVALUE, TYPECODE)
    ---------------------------------------------------------------------------
    user1                        |SFS$_FST_11                |SFS$_FSTP_11
    0.5.0
    01-FEB-10 09.43.53.497856 PM
    01-FEB-10 09.43.53.497856 PM
    (null)
    
  9. user2として、ストアを登録およびマウントします。ただし、user1_FSファイルシステムは再作成しないでください。
    user2@tank> exec dbms_dbfs_sfs.registerFilesystem(
       'user2_FS', 'user1', 'SFS$_FST_11');
    user2@tank> exec dbms_dbfs_content.registerStore(
       'user2_FS', 'posix', 'DBMS_DBFS_SFS');
    user2@tank> exec dbms_dbfs_content.mountStore(
       'user2_FS', 'user2_mnt');
    user2@tank> commit;
    
  10. (オプション)すべてのマウントを表示することにより、user2として、前述のステップが正常に実行されたかどうかを確認できます。
    user2@tank> select * from table(dbms_dbfs_content.listMounts);
    
    STORE_NAME           |   STORE_ID|PROVIDER_NAME
    ---------------------|- ---------|------------------------------------------
    PROVIDER_PKG         |PROVIDER_ID|PROVIDER_VERSION     |STORE_FEATURES
    ---------------------|-----------|---------------------|--------------------
    STORE_GUID
    ----------
    STORE_MOUNT
    ----------------------------------------------------------------------------
    CREATED
    ----------------------------------------------------------------------------
    MOUNT_PROPERTIES(PROPNAME, PROPVALUE, TYPECODE)
    ----------------------------------------------------------------------------
    user2_FS             | 1362968596|posix
    "DBMS_DBFS_SFS"      | 3350646887|0.5.0                | 12714135  141867344
    user1_mnt
    01-FEB-10 09.46.16.013046 PM
    DBMS_DBFS_CONTENT_PROPERTIES_T(
      DBMS_DBFS_CONTENT_PROPERTY_T('principal', (null), 9),
      DBMS_DBFS_CONTENT_PROPERTY_T('owner', (null), 9), 
      DBMS_DBFS_CONTENT_PROPERTY_T('acl', (null), 9), 
      DBMS_DBFS_CONTENT_PROPERTY_T('asof', (null), 187),
      DBMS_DBFS_CONTENT_PROPERTY_T('read_only', '0', 2))

  11. (オプション) user2およびuser1のパス名をリストします。ストアuser2_FS用の別のマウントであるuser2_mnt,は、user2で使用できます。ただし、基礎となるファイルシステム・データは、user2user1で同じです。
    user2@tank> select pathname from dbfs_content;
     
    PATHNAME
    -------------------------------------------------------------------------------
    /user2_mnt
    /user2_mnt/.sfs/tools
    /user2_mnt/.sfs/snapshots
    /user2_mnt/.sfs/content
    /user2_mnt/.sfs/attributes
    /user2_mnt/.sfs/RECYCLE
    /user2_mnt/.sfs
    
    user2@tank> connect user1
    Connected.
    
    user1@tank> select pathname from dbfs_content;
     
    PATHNAME
    ---------------------
    /user1_mnt
    /user1_mnt/.sfs/tools
    /user1_mnt/.sfs/snapshots
    /user1_mnt/.sfs/content
    /user1_mnt/.sfs/attributes
    /user1_mnt/.sfs/RECYCLE
    /user1_mnt/.sfs
    
  12. ファイルシステムuser1_FSでは、user1がファイルxxxを作成します。
    user1@tank> declare
                    data blob;
                    properties dbms_dbfs_content.properties_t;
                begin
                    properties('posix:mode') := dbms_dbfs_content.propNumber(33188);
                    dbms_dbfs_content.createFile('/user1_mnt/xxx', properties => properties, content => data);
                end;
                /
  13. (オプション)前述のステップで作成したファイルxxxに書き込みます。
    user1@tank> var buf varchar2(100);
    user1@tank> exec :buf := 'hello world';
    user1@tank> exec dbms_lob.writeappend(:data, length(:buf), utl_raw.cast_to_raw(:buf));
    user1@tank> commit;
     
  14. (オプション)xxxファイルが存在し、追加されたデータが含まれていることを表示します。
    user1@tank> select pathname, utl_raw.cast_to_varchar2(filedata) 
      from dbfs_content where filedata is not null;
     
    PATHNAME
    -------------------------------------------------------------------------------
    UTL_RAW.CAST_TO_VARCHAR2(FILEDATA)
    -------------------------------------------------------------------------------
    /user1_mnt/xxx
    hello world
    
  15. ユーザーuser2には、自身のDBFS固有のパス名およびマウントの接頭辞に同じファイルが表示されます。
    user1@tank> connect user2
    Connected.
     
    user2@tank> select pathname, utl_raw.cast_to_varchar2(filedata) from
      dbfs_content where filedata is not null;
     
    PATHNAME
    -------------------------------------------------------------------------------
    UTL_RAW.CAST_TO_VARCHAR2(FILEDATA)
    -------------------------------------------------------------------------------
    /user2_mnt/xxx
    hello world
    

エクスポートと登録の組合せが完了した後、基礎となる表の使用に関しては両ユーザーは対等に動作します。exportFilesystem()プロシージャは、スキーマ間で共有される同じデータへのアクセスに必要な権限の付与を管理します。user1exportFilesystem()をコールした後、ファイルシステムのアクセス権をDBFS_ROLEを持つすべてのユーザーに付与できます。別のロールをexportFilesystemに指定できることに注意してください。

続いて、dbms_dbfs_sfs.registerFilesystem()dbms_dbfs_sfs.registerStore()およびdmbs_dbfs_sfs.mountStore()プロシージャ・コールを呼び出すことにより、基礎となる同じ記憶域を共有する新しいDBFSファイルシステムをuser2user1_FSファイルシステムとして作成できます。

複数のデータベース・ユーザーがファイルシステムを共有している場合は、所有者(ここではuser1)がファイルシステムを削除する前に、すべてのデータベース・ユーザーがそのファイルシステムに関連する各自の項目の登録を解除している必要があります。

rootとしてDBFSを実行することは推奨されません。

18.4.7 DBFSへのHTTP、WebDAVおよびFTPアクセス

インターネットを介してDBFSへのHTTP、WebDAVおよびFTPアクセスを可能にするコンポーネントでは、様々なXML DBサーバーのプロトコルを使用します。

18.4.7.1 XDBを介したDBFSへのインターネット・アクセス

DBFS認証を持つデータベース・ユーザーに対して、階層ファイルシステムに類似した登録済およびマウント済DBFSストアのビューを提供するために、ストアはパス/dbfsの下に表示されます。

/dbfsフォルダは仮想フォルダです。これは、サブツリー内のリソースがXDBリポジトリではなくDBFSストアに格納されるためです。XDBは、ルート・パス名/に対して(起動者権限を使用して) dbms_dbfs_content.list()コマンドを発行し、/dbfsフォルダ内のサブフォルダとしてストア・アクセス・ポイントのリストを受け取ります。このリストは、dbms_dbfs_content.mountStore()に渡されるstore_mountパラメータと同等です。FTPユーザーとWebDAVユーザーはこれらのストアに移動できます。一方、HTTPユーザーとHTTPSユーザーはブラウザからURLにアクセスします。

リポジトリ・イベント、リソース構成およびACLなどの、XDBリポジトリによって実装される機能は、/dbfsフォルダでは使用できません。

DBFSストアの作成、登録、登録解除、マウント、アンマウントおよび削除に関するガイドラインの詳細は、「DBFSコンテンツAPI」を参照してください

18.4.7.2 Web Distributed Authoring and Versioning (WebDAV)アクセス

WebDAVは、インターネットを介してリポジトリへのファイルシステムの類似インタフェースをユーザーに提供するIETF標準のプロトコルです。

通常、WebDAVサーバーのフォルダは、Microsoft Windows (2000/NT/XP/Vista/7など)上でWebフォルダを介してアクセスされます。リソースには、完全修飾名を使用してアクセスできます。たとえば、/dbfs/sfs1/dir1/file1.txtなどで、sfs1はDBFSストアの名前です。

DBFSファイルシステムにアクセスするには、WindowsでWebDAVを設定する必要があります。

DBFS仮想フォルダにアクセスするために必要なユーザー認証は、XDBリポジトリの場合と同じです。

WebDAVクライアントがWebDAVサーバーに初めて接続する場合、通常、ユーザーにはユーザー名およびパスワードの入力が求められます。これらは、クライアントが後続のすべてのリクエストに対して使用します。プロトコルの観点からは、すべてのリクエストには認証情報が含まれます。この情報は、XDBがユーザーを有効なデータベース・ユーザーとして認証するために使用します。ユーザーが存在しない場合、クライアントはDBFSストアまたはXDBリポジトリにアクセスできません。認証が成功すると、データベース・ユーザーはセッション内の現在のユーザーになります。

XDBでは、Basic認証およびDigest認証の両方がサポートされています。セキュリティ上の理由により、Basic認証が有効になっている場合はHTTPS転送を使用することをお薦めします。

18.4.7.3 DBFSへのFTPアクセス

DBFSへのFTPアクセスでは、ほとんどのUNIXベースのディストリビューションで使用されている標準のFTPクライアントが使用されます。FTPは、制御およびデータ接続方式が異なるクライアント・サーバー・アーキテクチャ上に構築されるファイル転送メカニズムです。

FTPユーザーは、データベース・ユーザーとして認証されます。このプロトコルは、RFC 959で説明されているように、認証用としてクリアテキストのユーザー名およびパスワードを使用します。したがって、FTPはセキュアなプロトコルではありません。

DBFSに対しては、次のコマンドがサポートされています。

  • USER: 認証ユーザー名

  • PASS: 認証パスワード

  • CWD: 作業ディレクトリの変更

  • CDUP: 親ディレクトリへの変更

  • QUIT: 切断

  • PORT: サーバーの接続先のアドレスおよびポートの指定

  • PASV: パッシブ・モードの入力

  • TYPE: ASCIIまたはバイナリなどの転送モードの設定

  • RETR: ファイルのコピーの転送

  • STOR: データを受け入れ、サーバー・サイトでデータをファイルとして格納

  • RNFR: 変更前の名前

  • RNTO: 変更後の名前

  • DELE: ファイルの削除

  • RMD: ディレクトリの削除

  • MKD: ディレクトリの作成

  • PWD: 作業ディレクトリの印刷

  • LIST: ファイルまたはディレクトリのリスト。デフォルトは現在のディレクトリです。

  • NLST: ディレクトリ内のファイル名を戻す

  • HELP: 使用方法に関するドキュメント

  • SYST: システム・タイプを戻す

  • FEAT: サーバーによって実装される機能リストの取得

  • NOOP: 操作なし(キープ・アライブ用として使用)

  • EPRT: サーバーの接続先の拡張アドレス(IPv6)およびポート

  • EPSV: 拡張パッシブ・モード(IPv6)の入力

18.4.7.4 DBFSへのHTTPアクセス

ユーザーは、HTTP/HTTPSプロトコルを介して読取り専用でアクセスできます。

ユーザーは、XDB HTTPサーバーを使用してブラウザでDBFSストアを指定します。これには、https://hostname:port/dbfs/sfs1などのURLを使用します。sfs1はDBFSストア名です。