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拡張子)スクリプト
DBFSファイルシステムには、パーティション化されているものとパーティション化されていないものがあります。ユーザーには特定の権限が要求される場合があります。
ここでは、次の項目について説明します。
データベース・ユーザーがファイルシステムを作成するには、最小限の権限セットが必要です。
ユーザーには、次の権限が必要です。
GRANT CONNECT
CREATE SESSION
RESOURCE、CREATE TABLE
CREATE PROCEDURE
DBFS_ROLE
パーティション化されていないファイルシステムを作成することも、パーティション化されたファイルシステムを作成することもできます。パーティショニングは、DBFSにファイルシステムを作成するにあたり、最善のパフォーマンスとスケーラビリティを得られるデフォルトの方法です。
パーティション間では、領域は共有されないため、あるパーティションに領域があっても、別のパーティションでは領域が不足する場合があります。通常、ファイルシステム・サイズが個別のファイルのサイズに比べて大きい場合、問題はありません。ただし、ファイル・サイズがファイルシステム・サイズの大きい割合を占める場合、ファイルシステムに空きがあっても、ENOSPCエラーが発生する場合があります。
また、パーティション化では、名前変更の操作でファイルの再書込みが必要になる場合もあります。ファイルが大きい場合、このコストは高くなる可能性があります。
DBFS管理者権限を持つユーザーとしてログインし、DBFS_CREATE_FILESYSTEM.SQLを実行してファイルシステムを作成できます。
次の手順により、ファイルシステムを作成できます。
たとえば、既存の表領域dbfs_tbspcにstaging_areaというファイルシステムを作成するには、次を実行します。
$ sqlplus dbfs_user/db_server @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem.sql dbfs_tbspc staging_area
パーティション化では、データベース内に複数の物理セグメントが作成され、ファイルはこれらのパーティション内にランダムに分散されます。
DBFS管理者権限を持つユーザーとしてログインし、DBFS_CREATE_FILESYSTEM_ADVANCED.SQLを実行して、パーティション化されたファイルシステムを作成できます。
たとえば、既存の表領域dbfs_tbspcにstaging_areaという、パーティション化されたファイルシステムを作成するには、次を実行します。
$ sqlplus dbfs_user/@db_server @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem_advanced.sql dbfs_tbspc staging_area nocompress nodeduplicate noencrypt partition
DBFSファイルシステムにアクセスするには、前提条件、アクセス・インタフェース、DBFSセキュリティ・モデルおよびXML DBサーバー・プロトコルを使用します。
ここでは、次の項目について説明します。
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のみ)」を参照してください。
DBFSクライアント・コマンドライン・インタフェースを使用すると、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、mkdir、rmなどの実行可能なコマンドです。
switchesは、コマンドごとに固有です。
argumentsは、ファイル名またはディレクトリ名で、コマンドごとに固有です。
dbfs_clientは、失敗するとゼロ以外の値を戻します。
mkdirコマンドを使用して、新しいディレクトリを作成できます。
次の構文を使用します。
dbfs_client db_user@db_server --command mkdir directory_name
条件:
directory_nameは、作成されたディレクトリの名前です。次に例を示します。
$ dbfs_client ETLUser@DBConnectString --command mkdir dbfs:/staging_area/dir1
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
cpコマンドを使用して、ファイルまたはディレクトリをソースの場所から宛先の場所にコピーできます。
cpコマンドは、ディレクトリの再帰的コピーもサポートしています。
dbfs_client db_user@db_server --command cp [switches]sourcedestination
条件:
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
コマンド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
dbfs_clientを使用してDBFSをマウントできるのは、LinuxおよびSolarisの場合のみです。
LinuxプラットフォームとSolarisプラットフォームでは要件が異なります。
ここでは、次の項目について説明します。
FUSEをインストールする場合、Solaris 11 SRU7以降ではdbfs_clientをマウント・クライアントとして使用できます
Solaris 11 SRU7以降でdbfs_clientをマウント・クライアントとして使用するには、FUSEをインストールします。
次のパッケージをrootとして実行します。
pkg install libfuse
DBFSストアをマウントするには、dbfs_clientプログラムを実行します。
dbfs_clientプログラムするには、次の手順を実行します。
LD_LIBRARY_PATHに正しく指定されていることを確認します。dbfs_clientプログラムを実行します。ファイルシステムがアンマウントされるまで、dbfs_clientプログラムは戻されません。
パスワードを安全に指定する方法の詳細は、「DBFSクライアントでのOracle Walletの使用」を参照してください。
Solarisの場合、DBFSファイルシステムでマウントおよびアンマウント操作を実行するには、Solarisの権限PRIV_SYS_MOUNTが必要です。
ユーザーのSolarisの権限PRIV_SYS_MOUNTを付与します。
/etc/user_attrを編集します。
次のようにユーザー・エントリを追加または変更します(ユーザーがOracleであることを前提としています)。
oracle::::type=normal;project=group.dba;defaultpriv=basic,priv_sys_mount;;auth s=solaris.smf.*
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: トレース・ログ・ファイルを指定します。STRはfile_nameとsyslogのどちらでもかまいません。
trace_size=trcfile_size: トレース・ファイルのサイズをMB単位で指定します。デフォルトでは、dbfs_clientでは、2つの10MBファイル間でトレース出力をローテーションします。trace_size=に対して0を指定すると、トレース・ファイルの最大サイズが無制限に設定されます。
様々な環境変数を構成した後、ウォレットを使用してファイルシステムをマウントできます。
ウォレットを使用してファイルシステムをマウントする前に、最初にLD_LIBRARY_PATHおよびORACLE_HOME環境変数を正しく構成する必要があります。「DBFSクライアントでのOracle Walletの使用」を参照してください。
dbfs_clientを使用してファイルシステムをマウントできます。
dbfs_clientを使用してファイルシステムをマウントするには、コマンド・プロンプトでパスワードを入力する必要があります。
次を実行します。
$ dbfs_client ETLUser@DBConnectString /mnt/dbfs password: xxxxxxx
ファイルから読み込まれたパスワードを使用してファイルシステムをマウントできます。
次の例では、ファイルシステムをマウントし、ターミナルを解放します。ここでは、パスワードをファイルから読み取ります。
次を実行します。
$ nohup dbfs_client ETLUser@DBConnectString /mnt/dbfs < passwordfile.f &
$ ls -l /mnt/dbfs
drwxrwxrwx 10 root root 0 Feb 9 17:28 staging_area
Linuxの場合、fusermountを実行して、ファイルシステムをアンマウントできます。
fusermountをLinuxで実行するには、次を実行します。
次を実行します。
$ fusermount -u <mount point>
Solarisの場合、umountを実行して、ファイルシステムをアンマウントできます。
次を実行します。
$ umount -u <mount point>
Linuxの場合、fstabユーティリティを構成し、dbfs_clientを使用してDBFSファイルシステムをマウントします。
/etc/fstabでDBFSをマウントするには、Oracle Walletを認証に使用する必要があります。
DBFSでは、一部を例外としてほとんどのファイルシステム操作をサポートしています。例外は次のとおりです。
ioctl
ロック
libaioを使用した非同期I/O
O_DIRECTファイル・オープン
ハード・リンク、パイプ
その他の特定のファイル・モード
メモリー・マップ・ファイルは、共有書込み可能モードを除いてサポートされます。パフォーマンス上の理由から、DBFSでは、ファイル・データまたはファイル・データ属性の読取りのたびにファイル・アクセス時間を更新することはありません。
direct_ioオプションが指定されている場合、DBFSマウント・ファイルからプログラムを実行することはできません。
Oracleでは、NFSまたはSambaを使用したDBFSファイル・システムのエクスポートはサポートしていません。
データベースでは、DBFSでセキュリティを管理します。オペレーティング・システムのセキュリティ・モデルは使用しません。
DBFSは、ユーザーによって作成されたすべてのファイルシステムが、デフォルトでそのユーザー固有になるセキュリティ・モデルで機能します。
このモデルを変更しないことをお薦めします。オペレーティング・システム・ユーザーとOracle Databaseユーザーは異なるため、複数のオペレーティング・システム・ユーザーを単一のDBFSファイルシステムにマウントすることはできません。これらのマウントは、マウント・ポイントおよび権限が異なる場合があります。たとえば、user1はDBFSファイルシステムをREAD ONLYとしてマウントし、user2はREAD WRITEとしてマウントできます。ただし、どちらのユーザーも同じデータベース・ユーザーとしてファイルシステムにアクセスするため、Oracle Databaseでは、両方のユーザーを同じ権限を持つユーザーとして認識します。
データベース・ファイルシステムにアクセスするには、ファイルシステムの基礎となっている表の権限を持つデータベース・ユーザーとしてデータベースにログインする必要があります。データベース管理者は、ファイルシステムへのアクセス権をデータベース・ユーザーに付与します。データベース・ユーザーごとに、ファイルシステムに対して異なるREAD権限またはUPDATE権限を持つことができます。データベース管理者は、DBFSファイルシステムに格納されているすべてのファイルにアクセスできます。
各クライアント・コンピュータでは、DBFSマウント・ポイントへのアクセスは、ファイルシステムをマウントするオペレーティング・システム・ユーザーに制限されています。ただし、多数のユーザーが同一のDBFSファイルシステムを別々にマウントできるため、これによってDBFSファイルシステムにアクセス可能なユーザーの数が制限されることはありません。
DBFSでは、データベースの権限チェックのみが実行されます。Linuxでは、DBFSがファイルシステムがマウントされた場合に、オペレーティング・システムのファイル・レベルの権限チェックが実行されます。コマンド・インタフェースを使用した場合、またはPL/SQLインタフェースを直接使用した場合は、DBFSでこのチェックは実行されません。
ファイルシステムをマウントしているオペレーティング・システム・ユーザーとしては、allow_rootオプションを指定することで、ファイルシステムへのrootアクセスを許可できます。このオプションでは、例10-1に示すように、/etc/fuse.confファイルにuser_allow_otherフィールドを含める必要があります。
例10-1 他のユーザーのルート・アクセスの有効化
# Allow users to specify the 'allow_root' mount option. user_allow_other
状況によっては、複数のデータベース・ユーザーが同じファイルシステムにアクセスする必要が生じます。たとえば、ファイルシステムを所有するデータベース・ユーザーが権限を付与されたユーザーで、そのユーザーの証明書を共有すると、セキュリティのリスクにさらされる危険があるとします。これを回避するために、DBFSでは、複数のデータベース・ユーザーがファイルシステムの状態のサブセットを共有できるようになっています。
DBFSコンテンツAPIによるDBFSの登録およびマウントは各ユーザー固有ですが、各ユーザーが利用する基礎となるファイルシステムおよび表はユーザー間で共有できます。これにより、個々のファイルシステムを個別にマウントできるようになり、SQL/PLSQLまたはdbfs_client APIのいずれかを使用して、異なるデータベース・ユーザーで使用できます。
複数のデータベース・ユーザー間でDBFSを共有できます。
次の例では、ユーザーuser1はファイルシステムを変更できますが、user2はこれらの変更を参照することしかできません。user1は、ファイルシステムを作成するデータベース・ユーザーで、user2は、最終的にdbfs_clientを使用してファイルシステムのマウントとアクセスを行うデータベース・ユーザーです。user1とuser2は、どちらもDBFS_ROLE権限を持ちます。
エクスポートと登録の組合せが完了した後、基礎となる表の使用に関しては両ユーザーは対等に動作します。exportFilesystem()プロシージャは、スキーマ間で共有される同じデータへのアクセスに必要な権限の付与を管理します。user1がexportFilesystem()をコールした後、ファイルシステムのアクセス権をDBFS_ROLEを持つすべてのユーザーに付与できます。別のロールを指定することもできます。
続いて、dbms_dbfs_sfs.registerFilesystem()、dbms_dbfs_sfs.registerStore()およびdmbs_dbfs_sfs.mountStore()プロシージャ・コールを呼び出すことにより、基礎となる同じ記憶域を共有する新しいDBFSファイルシステムをuser2がuser1_FSファイルシステムとして作成できます。
複数のデータベース・ユーザーがファイルシステムを共有している場合は、所有者(ここではuser1)がファイルシステムを削除する前に、すべてのデータベース・ユーザーがそのファイルシステムに関連する各自の項目の登録を解除している必要があります。
rootとしてDBFSを実行することは推奨されません。
インターネットを介してDBFSへのHTTP、WebDAVおよびFTPアクセスを可能にするコンポーネントでは、様々なXML DBサーバーのプロトコルを使用します。
ここでは、次の項目について説明します。
DBFS認証を持つデータベース・ユーザーに対して、階層ファイルシステムに類似した登録済およびマウント済DBFSストアのビューを提供するために、ストアはパス/dbfsの下に表示されます。
DBFSストアの作成、登録、登録解除、マウント、アンマウントおよび削除に関するガイドラインの詳細は、「DBFSコンテンツAPI」を参照してください。
/dbfsフォルダは仮想フォルダです。これは、サブツリー内のリソースがXDBリポジトリではなくDBFSストアに格納されるためです。XDBは、ルート・パス名/に対して(起動者権限を使用して) dbms_dbfs_content.list()コマンドを発行し、/dbfsフォルダ内のサブフォルダとしてストア・アクセス・ポイントのリストを受け取ります。このリストは、dbms_dbfs_content.mountStore()に渡されたstore_mountパラメータと比較されます。FTPおよびWebDAVユーザーはこれらのストアにナビゲートでき、HTTPおよびHTTPSユーザーはブラウザからURLにアクセスします。
リポジトリ・イベント、リソース構成およびACLなどの、XDBリポジトリによって実装される機能は、/dbfsフォルダでは使用できません。
WebDAVは、インターネットを介してリポジトリへのファイルシステムの類似インタフェースをユーザーに提供するIETF標準のプロトコルです。
通常、WebDAVサーバーのフォルダは、Microsoft Windows (2000/NT/XP/Vista/7など)上でWebフォルダを介してアクセスされます。リソースには、完全修飾名を使用してアクセスできます。たとえば、/dbfs/sfs1/dir1/file1.txtなどで、sfs1はDBFSストアの名前です。
DBFSファイルシステムにアクセスするには、WindowsでWebDAVを設定する必要があります。
関連項目:
『Oracle XML DB開発者ガイド』
DBFS仮想フォルダにアクセスするために必要なユーザー認証は、XDBリポジトリの場合と同じです。
WebDAVクライアントがWebDAVサーバーに初めて接続する場合、通常、ユーザーにはユーザー名およびパスワードの入力が求められます。これらは、クライアントが後続のすべてのリクエストに対して使用します。プロトコルの観点からは、すべてのリクエストには認証情報が含まれます。この情報は、XDBがユーザーを有効なデータベース・ユーザーとして認証するために使用します。ユーザーが存在しない場合、クライアントはDBFSストアまたはXDBリポジトリにアクセスできません。認証が成功すると、データベース・ユーザーはセッション内の現在のユーザーになります。
XDBでは、Basic認証およびDigest認証の両方がサポートされています。セキュリティ上の理由により、Basic認証が有効になっている場合はHTTPS転送を使用することをお薦めします。
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)の入力
Oracle Walletを使用すると、ユーザーがパスワードを入力しなくても、DBFSクライアントでDBFSストアをマウントできます。ウォレットの作成と管理の詳細は、『Oracle Databaseエンタープライズ・ユーザー・セキュリティ管理者ガイド』を参照してください。
手順7に示すように、/@構文は、ウォレットを使用することを意味します。
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サーバー・ログを表示して、そのエラーが根本原因であるかを確認してください。
dbfs_clientプログラムは、Oracle RACクラスタ内のデータベース・インスタンスの1つに障害が発生した場合、既存の他のデータベース・インスタンスの1つにフェイルオーバーできます。
dbfs_clientフェイルオーバーが正常に動作するには、Oracleデータベース・サービスを変更して、フェイルオーバー・パラメータを指定する必要があります。サービスを変更するには、例10-2に示すように、DBMS_SERVICE.MODIFY_SERVICEプロシージャを実行します例10-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
dbfs_clientの共有およびキャッシュ・セマンティクスは、close-to-openキャッシュ一貫性動作を使用する点においてNFSと類似しています。これにより、dbfs_clientの複数のコピーが同一の共有ファイルシステムにアクセスできるようになります。デフォルト・モードでは、クライアント上に書込みをキャッシュし、タイムアウト後またはユーザーがファイルを閉じた後で、その書込みをフラッシュします。また、ファイルへの書込みは、ライターがファイルをクローズした後にファイルをオープンするクライアントにのみ表示されます。
クライアント側の書込みキャッシュは迂回できます。
ファイルがオープンしているときにO_SYNCを指定します。
キャッシュへの書込みをディスクに強制するには、fsyncをコールします。
DBFSのバックアップには2つの方法があります。ファイルシステムの基礎となる表をデータベース・レベルでバックアップするか、マウント・ポイントを介してOracle Secure Backupなどのファイルシステムのバックアップ・ユーティリティを使用できます。
ここでは、次の項目について説明します。
データベース・レベルで表をバックアップすると、ファイルシステム内のファイルとデータベース内のリレーショナル・データの一貫性を常に保つことができる利点があります。また、データベースの完全なリストアおよびリカバリにより、データを損失せずにファイルシステムを完全にリストアおよびリカバリできます。データベースのpoint-in-timeリカバリの実行中に、ファイルは指定した時間にリカバリされます。通常のデータベース・バックアップのように、バックアップ中に発生した変更はリストアの一貫性に影響しません。リストアされたファイルシステム全体は、指定したタイム・スタンプにおいて常に一貫性があります。
すべての共有ファイルシステムと同様に、小さいファイルに対するDBFSのパフォーマンスは、ローカル・ファイルシステムのパフォーマンスより遅れます。
DBFS内の各ファイルのデータまたはメタデータの操作は、FUSEユーザー・モード・ファイルシステムによって処理され、ネットワークを介してデータベースに転送される必要があります。このため、クライアントでキャッシュされていない操作は、DBFS内での実行に数ミリ秒かかります。
ディスクへの入力/出力(IO)を伴う操作では、ディスクIOの待機によって時間遅延のオーバーヘッドがマスクされます。大きいIOのオーバーヘッドは、小さいIOの場合よりも当然低いパーセンテージになります。ネットワーク・オーバーヘッドは、ディスクIOを発行しない操作でより顕著です。
ローカル・ファイルシステムを使用する数の少ない小さいファイル上で動作する操作では、オーバーヘッドは目立ちませんが、数千の小さいファイル上に影響を与える操作では、オーバーヘッドは大きくなります。たとえば、単一ディレクトリをリストする場合や単一ファイルを参照する場合、ほぼ即時にレスポンスが得られますが、数千のファイルを含むディレクトリ・ツリー内を検索する場合、オーバーヘッドは相対的に大きくなります。
DBFSでは、圧縮、重複除外、暗号化、パーティション化など、SecureFiles LOBで使用可能な拡張機能を利用できます。
たとえば、パーティション化を使用して、DBFSを圧縮ファイルシステムとして構成できます。DBFSファイルシステムの作成時に、ファイルシステムで使用可能にする機能のセットを指定する必要があります。SecureFiles LOBの機能の詳細は、「Oracle LOB記憶域の使用」および「パーティション化されたファイルシステムの作成」を参照してください。
例10-3 DBFSの高度なセキュア・ファイルLOBの有効化
$ sqlplus @dbfs_create_filesystem_advanced tablespace_name file_systemname [compress-high | compress-medium | compress-low | nocompress] [deduplicate | nodeduplicate] [encrypt | noencrypt] [partition | non-partition]
DBFSファイルシステムは、オンライン・ファイルシステム再編成を使用してそれ自体を縮小することにより、割り当てられた領域を、これが含まれる表領域に解放できるようにします。
ここでは、次の項目について説明します。
DBFSファイルシステムは、他のデータベース・セグメントと同様に、ファイルやディレクトリの追加または増大に伴ってサイズが動的に大きくなります。ファイルシステムが大きくなるのは、DBFSファイルシステムを保持する表領域から、ファイルシステムを構成する様々なセグメントに領域が割り当てられるときです。
ただし、DBFSファイルシステム内のファイルおよびディレクトリが削除されたとしても、割り当てられた領域は、これが含まれる表領域には解放されずに存在し続け、他のDBFSエンティティで使用できます。オンライン・ファイルシステム再編成というプロセスは、DBFSファイルシステムを縮小することにより、この問題を解消します。
DBFSオンライン・ファイルシステム再編成ユーティリティの内部ではOracle Databaseオンライン再定義機能が使用されます。その際に、元のファイルシステム、およびオンライン再定義モデルの基本オブジェクトと暫定オブジェクトに対応する一時プレースホルダが使用されます。
関連項目:
オンライン再定義の詳細は、『Oracle Database管理者ガイド』を参照してください
DBFSオンライン・ファイルシステム再編成は、次のような一定のメリットがある強力なデータ移動機能です。
内容は次のとおりです。
オンラインである: 再編成が行われても、ファイルシステムはすべてのアプリケーションに対する読取りおよび書込み操作が完全に使用可能なままです。
構造を再編成できる: DBFSファイルシステムの基礎となる物理構造および組織を、次のような様々な方法で変更できます。
パーティション化されていないファイルシステムを、パーティション化されたファイルシステムに変換できます(この逆も可能)。
圧縮、暗号化および重複除外プロパティを含む特定のSecureFiles LOBプロパティを選択して任意の組合せで有効化または無効化できます。
ファイルシステム内のデータを表領域間または同じ表領域内で移動できます。
複数のファイルシステムを同時に再編成できる: 複数の異なるファイルシステムを同時に再編成できます。同じ名前を持つ一時ファイルシステムが存在せず、表領域に十分な空き領域がある場合は通常、再編成するファイルシステムごとに領域要件を2倍にします。
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
一時DBFSファイルシステムを作成することにより、オンライン・ファイルシステム再編成を実行できます。
次の例は、一時ファイルシステム名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倍の量が必要です。