25 DBFSの使用

DBFSファイルシステムの実装には、ファイルシステムの作成、アクセスおよび管理が含まれます。

内容は次のとおりです。

25.1 DBFSインストール

DBFSはOracle Databaseインストールの一部であり、ORACLE_HOMEの下にインストールされます。

$ORACLE_HOME/rdbms/adminには、次のDBFSユーティリティ・スクリプトが含まれます。

  • コンテンツAPI (CAPI)

  • SecureFilesストア(SFS)

$ORACLE_HOME/binには、次が含まれます。

  • dbfs_client実行可能ファイル

$ORACLE_HOME/rdbms/adminには、次が含まれます。

  • コンテンツ・ストア用のSQL (.plb拡張子)スクリプト

25.2 DBFSファイルシステムの作成

DBFSファイルシステムには、パーティション化されているものとパーティション化されていないものがあります。ユーザーには特定の権限が要求される場合があります。

内容は次のとおりです。

25.2.1 DBFSファイルシステムの作成に必要な権限

データベース・ユーザーがファイルシステムを作成するには、最小限の権限セットが必要です。

ユーザーには、次の権限が必要です。

  • GRANT CONNECT

  • CREATE SESSION

  • RESOURCECREATE TABLE

  • CREATE PROCEDURE

  • DBFS_ROLE

25.2.2 パーティション化されていないDBFSファイルシステムとパーティション化されたDBFSファイルシステムのメリットの違い

パーティション化されていないファイルシステムを作成することも、パーティション化されたファイルシステムを作成することもできます。パーティショニングは、DBFSにファイルシステムを作成するにあたり、最善のパフォーマンスとスケーラビリティを得られるデフォルトの方法です。

パーティション間では、領域は共有されないため、あるパーティションに領域があっても、別のパーティションでは領域が不足する場合があります。通常、ファイルシステム・サイズが個別のファイルのサイズに比べて大きい場合、問題はありません。ただし、ファイル・サイズがファイルシステム・サイズの大きい割合を占める場合、ファイルシステムに空きがあっても、ENOSPCエラーが発生する場合があります。

また、パーティション化では、名前変更の操作でファイルの再書込みが必要になる場合もあります。ファイルが大きい場合、このコストは高くなる可能性があります。

25.2.3 パーティション化されていないファイルシステムの作成

DBFS管理者権限を持つユーザーとしてログインし、DBFS_CREATE_FILESYSTEM.SQLを実行してファイルシステムを作成できます。

次のステップにより、ファイルシステムを作成できます。

  1. データベース・インスタンスにログインします。
    $ sqlplus dbfs_user/@db_server
    
  2. 次のコマンドを入力します。
    @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem.sql tablespace_name
         file_system_name
    

たとえば、既存の表領域dbfs_tbspcstaging_areaというファイルシステムを作成するには、次を実行します。

$ sqlplus dbfs_user/db_server
   @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem.sql
   dbfs_tbspc staging_area

25.2.4 パーティション化されたファイルシステムの作成

パーティション化では、データベース内に複数の物理セグメントが作成され、ファイルはこれらのパーティション内にランダムに分散されます。

DBFS管理者権限を持つユーザーとしてログインし、DBFS_CREATE_FILESYSTEM_ADVANCED.SQLを実行して、パーティション化されたファイルシステムを作成できます。

  1. データベース・インスタンスにログインします。
    $ sqlplus dbfs_user/@db_server
    
  2. 次のコマンドを入力します。
    @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem_advanced.sql tablespace_name
           file_system_name nocompress nodeduplicate noencrypt partition
    

たとえば、既存の表領域dbfs_tbspcstaging_areaという、パーティション化されたファイルシステムを作成するには、次を実行します。

$ sqlplus dbfs_user/@db_server  
       @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem_advanced.sql dbfs_tbspc
       staging_area nocompress nodeduplicate noencrypt partition

25.2.5 ファイルシステムの削除

DBFS_DROP_FILESYSTEM.SQLを実行してファイルシステムを削除できます。

  1. データベース・インスタンスにログインします。
    $ sqlplus dbfs_user/@db_server
    
  2. 次のコマンドを入力します。
    @$ORACLE_HOME/rdbms/admin/dbfs_drop_filesystem.sql file_system_name
    

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

DBFSファイルシステムにアクセスするには、前提条件、アクセス・インタフェース、DBFSセキュリティ・モデルおよびXML DBサーバー・プロトコルを使用します。

内容は次のとおりです。

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

dbfs_clientという名前のDBFSファイルシステム・クライアントは、特定の前提条件に基づいて、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パッケージがインストールされている必要があります。

    • fuseという名前のグループを作成し、dbfs_clientを実行しているユーザー名をメンバーにする必要があります。

    関連項目:

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

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

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

内容は次のとおりです。

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

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

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

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

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

25.3.2.2 コンテンツ・ストア・パスの作成

パス名を指定することにより、コンテンツ・ストア・パスを作成できます

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

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

説明:

  • commandは、lscpmkdirrmなどの実行可能なコマンドです。

  • switchesは、コマンドごとに固有です。

  • argumentsは、ファイル名またはディレクトリ名で、コマンドごとに固有です。

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

25.3.2.3 ディレクトリの作成

mkdirコマンドを使用して、新しいディレクトリを作成できます。

次の構文を使用します。

dbfs_client db_user@db_server --command mkdir directory_name

説明:

  • directory_nameは、作成されたディレクトリの名前です。次に例を示します。

    $ dbfs_client ETLUser@DBConnectString --command mkdir dbfs:/staging_area/dir1
25.3.2.4 ディレクトリのリスト

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 
25.3.2.5 ファイルおよびディレクトリのコピー

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
25.3.2.6 ファイルおよびディレクトリの削除

コマンド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

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

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

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

内容は次のとおりです。

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

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

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

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

    pkg install libfuse
25.3.3.2 DBFSストアのマウント

DBFSストアをマウントするには、dbfs_clientプログラムを実行します。

dbfs_clientプログラムするには、次の手順を実行します。

  1. Oracleクライアント・ライブラリへのパスがLD_LIBRARY_PATHに正しく指定されていることを確認します。
  2. dbfs_clientプログラムを実行します。

ファイルシステムがアンマウントされるまで、dbfs_clientプログラムは戻されません。

関連項目:

「DBFSクライアントでのOracle Walletの使用」で、パスワードを指定するのが最も安全な方法を参照してください

25.3.3.3 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.*
    
25.3.3.4 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は、Oracle Databaseサーバーの有効な接続文字列(hrdb_host:1521/hrserviceなど)です。

  • 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を指定すると、トレース・ファイルの最大サイズが無制限に設定されます。

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

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

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

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

dbfs_clientを使用してファイルシステムをマウントできます。

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

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

    $ dbfs_client ETLUser@DBConnectString /mnt/dbfs
      password: xxxxxxx
25.3.3.7 ファイルから読み込まれたパスワードを使用したファイルシステムのマウント

ファイルから読み込まれたパスワードを使用してファイルシステムをマウントできます。

次の例では、ファイルシステムをマウントし、ターミナルを解放します。ここでは、パスワードをファイルから読み取ります。

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

    $ nohup dbfs_client ETLUser@DBConnectString /mnt/dbfs < passwordfile.f &
    $ ls -l /mnt/dbfs
    drwxrwxrwx 10 root root 0 Feb  9 17:28 staging_area
25.3.3.8 ファイルシステムのアンマウント

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

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

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

     $ fusermount -u <mount point>
    

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

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

     $ umount -u <mount point>
25.3.3.9 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をサポートしていません。

25.3.3.10 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
    
25.3.3.11 マウントされたファイルシステムの制限事項

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

  • ioctl

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

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

  • O_DIRECTファイル・オープン

  • ハード・リンク、パイプ

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

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

direct_ioオプションが指定されている場合、DBFSマウント・ファイルからプログラムを実行することはできません。

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

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

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

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

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

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

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

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

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

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

ファイルシステムをマウントしているオペレーティング・システム・ユーザーとしては、allow_rootオプションを指定することで、ファイルシステムへのrootアクセスを許可できます。このオプションでは、例25-1に示すように、/etc/fuse.confファイルにuser_allow_otherフィールドを含める必要があります。

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

# Allow users to specify the 'allow_root' mount option.
user_allow_other
25.3.4.3 複数データベース・ユーザーのDBFSアクセスについて

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

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

25.3.4.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にはマウントがないため、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> var ret number;
    user1@tank> var data blob;
    user1@tank> exec :ret := dbms_fuse.fs_create('/user1_mnt/xxx', content => :data);
    user1@tank> select :ret from dual;
          :RET
    ----------
             0
    
  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を持つすべてのユーザーに付与できます。別のロールを指定することもできます。

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

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

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

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

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

内容は次のとおりです。

25.3.5.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」を参照してください

25.3.5.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転送を使用することをお薦めします。

25.3.5.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)の入力

25.3.5.4 DBFSへのHTTPアクセス

ユーザーは、HTTP/HTTPSプロトコルを介して読取り専用でアクセスできます。ユーザーは、XDB HTTPサーバーを使用してブラウザでDBFSストアを指定します。これには、https://hostname:port/dbfs/sfs1などのURLを使用します。sfs1はDBFSストア名です。

25.4 DBFS管理

DBFS管理には、診断の実行、フェイルオーバーの管理、バックアップの実行などを行うためのツールが用意されています。

内容は次のとおりです。

25.4.1 DBFSクライアントでのOracle Walletの使用

Oracle Walletを使用すると、ユーザーがパスワードを入力しなくても、DBFSクライアントでDBFSストアをマウントできます。

関連項目:

ウォレットの作成と管理の詳細は、Oracle Databaseエンタープライズ・ユーザー・セキュリティ管理者ガイドを参照してください

ステップ7に示すように、/@構文は、ウォレットを使用することを意味します。

  1. ウォレットのディレクトリを作成します。次に例を示します。
    mkdir $ORACLE_HOME/oracle/wallet
    
  2. 自動ログイン・ウォレットを作成します。
    mkstore -wrl $ORACLE_HOME/oracle/wallet -create
    
  3. クライアントのsqlnet.oraファイルに、ウォレットの場所を追加します。
    WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY =
     $ORACLE_HOME/oracle/wallet) ) ) 
    
  4. クライアントのsqlnet.oraファイル内に、次のパラメータを追加します。
    SQLNET.WALLET_OVERRIDE = TRUE
    
  5. 資格証明を作成します。
    mkstore -wrl wallet_location -createCredential db_connect_string username password
    

    次に例を示します。

    mkstore -wrl $ORACLE_HOME/oracle/wallet -createCredential DBConnectString scott password
    
  6. 使用するtnsnames.oraファイルに、接続の別名を追加します。
  7. dbfs_clientをOracle Walletで使用します。

    次に例を示します。

    $ dbfs_client -o wallet /@DBConnectString /mnt/dbfs 

25.4.2 DBFSの診断

dbfs_clientプログラムは、問題の診断に役立つように複数レベルのトレースをサポートしています。トレースは、ファイルに出力することも、Linuxのsyslogデーモンを使用して/var/log/messagesに出力することもできます。

ファイルに対してトレースする場合、dbfs_clientプログラムにより、ディスク上で2つのトレース・ファイルが保持されます。dbfs_clientは、トレース・ファイルを自動的にローテーションし、ディスク使用量を20MBに制限します。

デフォルトでは、/var/log/messagesに常にロギングされるクリティカルなメッセージを除き、トレーシングは無効になっています。

dbfs_clientでOracle Databaseに接続できない場合、trace_levelおよびtrace_fileオプションを使用してトレースを有効にします。トレースを使用すると、追加メッセージがログ・ファイルに出力されて、デバッグが容易になります。

DBFSでは、Oracle Databaseを使用して、ファイルが格納されます。Oracleサーバーの問題は、dbfs_clientにエラーとして伝播される場合があります。dbfs_clientエラーが発生した場合、Oracleサーバー・ログを表示して、そのエラーが根本原因であるかを確認してください。

25.4.3 フェイルオーバー・イベント中のデータ損失の防止

dbfs_clientプログラムは、Oracle RACクラスタ内のデータベース・インスタンスの1つに障害が発生した場合、既存の他のデータベース・インスタンスの1つにフェイルオーバーできます。

dbfs_clientフェイルオーバーが正常に動作するには、Oracleデータベース・サービスを変更して、フェイルオーバー・パラメータを指定する必要があります。サービスを変更するには、例25-2に示すように、DBMS_SERVICE.MODIFY_SERVICEプロシージャを実行します

例25-2 DBFSクライアント・フェイルオーバー・イベントの有効化

exec DBMS_SERVICE.MODIFY_SERVICE(service_name => 'service_name',
              aq_ha_notifications => true,
              failover_method => 'BASIC',
              failover_type => 'SELECT',
              failover_retries => 180,
              failover_delay => 1);

前提条件が満たされれば、バックエンドのOracle Databaseインスタンスに障害が発生した後におけるDBFS接続のフェイルオーバー中のデータ損失を防ぐことができます。この場合、クライアントが終了するとキャッシュされた書込みは失われる可能性があります。ただし、他のOracle RACインスタンスまたはスタンバイ・データベースに対するバックエンド・フェイルオーバーでは、書込みが失われることはありません。

  • -o failoverマウント・オプションを指定します。

    $ dbfs_client database_user@database_server -o failover /mnt/dbfs 

25.4.4 クライアント側の書込みキャッシュの迂回

dbfs_clientの共有およびキャッシュ・セマンティクスは、close-to-openキャッシュ一貫性動作を使用する点においてNFSと類似しています。これにより、dbfs_clientの複数のコピーが同一の共有ファイルシステムにアクセスできるようになります。デフォルト・モードでは、クライアント上に書込みをキャッシュし、タイムアウト後またはユーザーがファイルを閉じた後で、その書込みをフラッシュします。また、ファイルへの書込みは、ライターがファイルをクローズした後にファイルをオープンするクライアントにのみ表示されます。

クライアント側の書込みキャッシュは迂回できます。

  • ファイルがオープンしているときにO_SYNCを指定します。

    キャッシュへの書込みをディスクに強制するには、fsyncをコールします。

25.4.5 DBFSのバックアップ

DBFSのバックアップには2つの方法があります。ファイルシステムの基礎となる表をデータベース・レベルでバックアップするか、マウント・ポイントを介してOracle Secure Backupなどのファイルシステムのバックアップ・ユーティリティを使用できます。

内容は次のとおりです。

25.4.5.1 データベース・レベルでのDBFSバックアップ

データベース・レベルで表をバックアップすると、ファイルシステム内のファイルとデータベース内のリレーショナル・データの一貫性を常に保つことができる利点があります。また、データベースの完全なリストアおよびリカバリにより、データを損失せずにファイルシステムを完全にリストアおよびリカバリできます。データベースのpoint-in-timeリカバリの実行中に、ファイルは指定した時間にリカバリされます。通常のデータベース・バックアップのように、バックアップ中に発生した変更はリストアの一貫性に影響しません。リストアされたファイルシステム全体は、指定したタイム・スタンプにおいて常に一貫性があります。

25.4.5.2 ファイルシステム・ユーティリティを介したDBFSのバックアップ

ファイルシステム・バックアップ・ユーティリティを使用してファイルシステムをバックアップすると、個々のファイルをバックアップから容易にリストアできる利点があります。リストアされたファイルに最後のバックアップ以降に加えられた変更は失われます。

Oracle Secure Backup管理サーバーを使用してバックアップがスケジュールされる場合、allow_rootマウント・オプションを指定します。

25.4.6 DBFSの小さいファイルのパフォーマンス

すべての共有ファイルシステムと同様に、小さいファイルに対するDBFSのパフォーマンスは、ローカル・ファイルシステムのパフォーマンスより遅れます。

DBFS内の各ファイルのデータまたはメタデータの操作は、FUSEユーザー・モード・ファイルシステムによって処理され、ネットワークを介してデータベースに転送される必要があります。このため、クライアントでキャッシュされていない操作は、DBFS内での実行に数ミリ秒かかります。

ディスクへの入力/出力(IO)を伴う操作では、ディスクIOの待機によって時間遅延のオーバーヘッドがマスクされます。大きいIOのオーバーヘッドは、小さいIOの場合よりも当然低いパーセンテージになります。ネットワーク・オーバーヘッドは、ディスクIOを発行しない操作でより顕著です。

ローカル・ファイルシステムを使用する数の少ない小さいファイル上で動作する操作では、オーバーヘッドは目立ちませんが、数千の小さいファイル上に影響を与える操作では、オーバーヘッドは大きくなります。たとえば、単一ディレクトリをリストする場合や単一ファイルを参照する場合、ほぼ即時にレスポンスが得られますが、数千のファイルを含むディレクトリ・ツリー内を検索する場合、オーバーヘッドは相対的に大きくなります。

25.4.7 DBFSの高度なSecureFiles LOBの有効化

DBFSでは、圧縮、重複除外、暗号化、パーティション化など、SecureFiles LOBで使用可能な拡張機能を利用できます。

たとえば、パーティション化を使用して、DBFSを圧縮ファイルシステムとして構成できます。DBFSファイルシステムの作成時に、ファイルシステムで使用可能にする機能のセットを指定する必要があります。

関連項目:

SecureFiles LOBの機能の詳細は、「Oracle LOB記憶域の使用」および「パーティション化されたファイルシステムの作成」を参照してください。

例25-3 DBFSの高度なセキュア・ファイルLOBの有効化

$ sqlplus @dbfs_create_filesystem_advanced tablespace_name file_system­name
  [compress-high | compress-medium | compress-low | nocompress] 
  [deduplicate | nodeduplicate]
  [encrypt | noencrypt]
  [partition | non-partition]

25.5 DBFSファイルシステムの縮小および再編成

DBFSファイルシステムは、オンライン・ファイルシステム再編成を使用してそれ自体を縮小することにより、割り当てられた領域を、これが含まれる表領域に解放できるようにします。

内容は次のとおりです。

25.5.1 DBFSファイルシステムの変更について

DBFSファイルシステムは、他のデータベース・セグメントと同様に、ファイルやディレクトリの追加または増大に伴ってサイズが動的に大きくなります。ファイルシステムが大きくなるのは、DBFSファイルシステムを保持する表領域から、ファイルシステムを構成する様々なセグメントに領域が割り当てられるときです。

ただし、DBFSファイルシステム内のファイルおよびディレクトリが削除されたとしても、割り当てられた領域は、これが含まれる表領域には解放されずに存在し続け、他のDBFSエンティティで使用できます。オンライン・ファイルシステム再編成というプロセスは、DBFSファイルシステムを縮小することにより、この問題を解消します。

DBFSオンライン・ファイルシステム再編成ユーティリティの内部ではOracle Databaseオンライン再定義機能が使用されます。その際に、元のファイルシステム、およびオンライン再定義モデルの基本オブジェクトと暫定オブジェクトに対応する一時プレースホルダが使用されます。

関連項目:

オンライン再定義の詳細は、『Oracle Database管理者ガイド』を参照してください

25.5.2 オンライン・ファイルシステム再編成の利点

DBFSオンライン・ファイルシステム再編成は、次のような一定のメリットがある強力なデータ移動機能です。

それらは次のとおりです。

  • オンラインである: 再編成が行われても、ファイルシステムはすべてのアプリケーションに対する読取りおよび書込み操作が完全に使用可能なままです。

  • 構造を再編成できる: DBFSファイルシステムの基礎となる物理構造および組織を、次のような様々な方法で変更できます。

    • パーティション化されていないファイルシステムを、パーティション化されたファイルシステムに変換できます(この逆も可能)。

    • 圧縮、暗号化および重複除外プロパティを含む特定のSecureFiles LOBプロパティを選択して任意の組合せで有効化または無効化できます。

    • ファイルシステム内のデータを表領域間または同じ表領域内で移動できます。

  • 複数のファイルシステムを同時に再編成できる: 複数の異なるファイルシステムを同時に再編成できます。同じ名前を持つ一時ファイルシステムが存在せず、表領域に十分な空き領域がある場合は通常、再編成するファイルシステムごとに領域要件を2倍にします。

25.5.3 オンライン・ファイルシステム再編成の可用性の確認

Oracle Database 12c以降のDBFSは、オンライン・ファイルシステム再編成をサポートしています。以前のバージョンの一部もこの機能をサポートしています。使用中のバージョンがサポートしているかどうかを確認するには、次に示すように、DBFS PL/SQLパッケージ内の特定の機能について問い合せます。

  • DBFS PL/SQLパッケージ内の特定の機能について問い合せます。

$ sqlplus / as sysdba
SELECT * FROM dba_procedures
WHERE   owner = 'SYS'
    and object_name = 'DBMS_DBFS_SFS'
    and procedure_name = 'REORGANIZEFS';

この問合せによってこの出力のような単一行が戻される場合、DBFSインストールはオンライン・ファイルシステム再編成をサポートしています。問合せによっていずれの行も戻されない場合、DBFSインストールは、アップグレードするか、バグ10051996用のパッチを適用する必要があります。

 
OWNER
----------------------------------------------------------------------------------
OBJECT_NAME
----------------------------------------------------------------------------------
PROCEDURE_NAME
----------------------------------------------------------------------------------
OBJECT_ID|SUBPROGRAM_ID|OVERLOAD                                |OBJECT_TYPE  |AGG|PIP
----------|-------------|-----------------------------------|-------------|---|---
IMPLTYPEOWNER
----------------------------------------------------------------------------------
IMPLTYPENAME
----------------------------------------------------------------------------------
PAR|INT|DET|AUTHID
---|---|---|------------
SYS
DBMS_DBFS_SFS
REORGANIZEFS
     11424|           52|(null)                                  |PACKAGE      |NO |NO
(null)
(null)
NO |NO |NO |CURRENT_USER

25.5.4 オンライン・ファイルシステム再編成の起動

一時DBFSファイルシステムを作成することにより、オンライン・ファイルシステム再編成を実行できます。

  1. 目的の新規組織および構造を使用して一時DBFSファイルシステムを作成します。これには、目的のターゲット表領域(再編成するファイルシステムと同じ表領域である場合があります)、目的のターゲットSecureFiles LOB記憶域プロパティ(圧縮、暗号化または重複除外)などが含まれます。
  2. PL/SQLプロシージャを起動し、データ移動用として新しく作成した一時ファイルシステムを使用してDBFSファイルシステムを再編成します。
  3. 再編成プロシージャが完了したら、一時ファイルシステムを削除します。

次の例は、一時ファイルシステム名TMP_FSを使用して、表領域TS1のDBFSファイルシステムFS1を新しい表領域TS2に再編成します。ここでは、すべてのファイルシステムはデータベース・ユーザーdbfs_userに属します。

$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus dbfs_user/***
 
@dbfs_create_filesystem TS2 TMP_FS
EXEC DBMS_DBFS_SFS.REORGANIZEFS('FS1', 'TMP_FS');
@dbfs_drop_filesystem TMP_FS
QUIT;

説明:

  • TMP_FSには、任意の有効な名前を使用できます。これは、一時プレースホルダとして使用することを目的としており、削除することも(前述の例のように)、完全に具体化された元のファイルシステムのpoint-in-timeスナップショットとして保持することもできます。

  • FS1は、元のファイルシステムであり、再編成試行の影響は受けません。これは、再編成時に、SQL、PL/SQL、およびdbfs_clientのマウントとコマンドラインを含むすべてのDBFS操作で使用可能なままです。再編成が終了すると、FS1は、TMP_FSを作成するために使用される新規構造および組織になります(またはこの逆。TMP_FSは、本来FS1に使用されていた構造および組織になります)。なんらかの理由により、再編成が失敗すると、DBFSはFS1の内部状態をクリーン・アップしようとします。

  • TS2には、FS1内のアクティブな(削除されていない)ファイルおよびディレクトリをすべて収容するために十分な領域が必要です。

  • 縮小の一環としてファイルシステムが同じ表領域内で移動する場合、TS1には、FS1によって使用される領域量の少なくとも2倍の量が必要です。