この章では、DBFSファイルシステムの実装、アクセスおよび管理について説明します。
注意: Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3以降から、dbfs_client をマウント・モードで実行できます。LinuxプロセスおよびSolarisプロセス間固有の差異を理解するには、「Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3」を参照してください。 |
この章の内容は次のとおりです。
この項では、DBFSのインストールに必要な手順について説明します。
この項の内容は次のとおりです。
dbfs_client
は、DBFSコマンド・インタフェースを使用して、直接のRDBMSクライアントとしてLinux、Linux.X64、Solaris、Solaris64、AIX、HPUXおよびWindowsプラットフォームでのみ使用できます。
dbfs_
client
ホストに、Oracleクライアント・ライブラリがインストールされている必要があります。
Oracle Databaseリリース11.2.0.1以降、およびSolaris 11 SRU7上ではOracle Database 11.2.0.3以降で、dbfs_client
プログラムを使用してLinuxおよびLinux X64プラットフォームのDBFSファイル・システムをマウントできます。Solaris互換性に関する詳細は、「Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3」を参照してください。
Linuxでは、次も必須です。
dbfs_client
ホストには、FUSE
を構成および作成するためにkernel-devel
パッケージをインストールする必要があります。
dbfs_client
ホストに、FUSE
Linuxパッケージをインストールする必要があります。
fuse
という名前のグループを作成し、dbfs_client
を実行しているユーザー名をfuse
グループのメンバーにする必要があります。
Solaris 11 SRU7の違いおよび追加要件については、「Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3」を参照してください。
使用するLinuxのリリースに一致するkernel-devel
パッケージをLinuxディストリビュータからダウンロードします。
FUSE 2.7.4
パッケージを、http://fuse.sourceforge.net/
からダウンロードします。
kernel-devel
パッケージをインストールします。次に例を示します。
# rpm -i kernel-devel-2.6.18-8.el5.i686.rpm
カーネル・ディレクトリを指定します。通常、カーネル・ディレクトリは、/usr/src/kernels/`uname -r`-`uname -p`
です。
FUSE
をインストールします。
$ tar -xzvf fuse-2.7.4.tar.gz $ cd [fuse_src_dir] $ ./configure --prefix=/usr --with-kernel=[your kernel dir] $ make $ sudo su # make install # /sbin/depmod # /sbin/modprobe fuse # chmod 666 /dev/fuse # echo "/sbin/modprobe fuse" >> /etc/rc.modules
DBFSインストール・ホームには、コンテンツ・ストアのSQLスクリプト(.plb
拡張子)およびdbfs_client
実行可能ファイルが含まれます。
ファイルシステムを作成するには、データベース・ユーザーにGRANT CONNECT
、CREATE SESSION
、RESOURCE
、CREATE TABLE
、CREATE PROCEDURE
およびDBFS_ROLE
の権限が少なくとも必要です。
DBFS_ROLE
権限を持つユーザーとしてログインし、dbfs_create_filesystem
.sql
を実行してファイルシステムを作成します。
$ sqlplus @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem.sqltablespace_name
file_system_name
次の例では、表領域dbfs_tbspc
にstaging_area
というファイルシステムを作成します。表領域は事前に作成しておく必要があります。
$ sqlplus @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem.sql dbfs_tbspc staging_area
DBFSファイルシステムを作成するために、dbfs_create_filesystem_advanced.sql
も使用できます。このスクリプトにより、ユーザーはファイルシステムに使用される圧縮、暗号化、重複除外などの記憶域オプションをさらに制御できるようになります。
注意: Oracle Databaseリリース11.2.0.3以降、DBFSはデフォルトでファイルシステムを非パーティションとして作成します。 |
dbfs_drop_filesystem.sql
を実行して、ファイルシステムを削除します。
$ sqlplus @$ORACLE_HOME/rdbms/admin/dbfs_drop_filesystem.sql file system name
この項では、DBFSファイル・システムをマウントする方法について説明します。この内容は、「Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3」で説明されるSolaris 11 SRU7との相違とともに、LinuxおよびSolarisに適用されます。
この項の内容は次のとおりです。
dbfs_client
プログラムを実行して、DBFSストアをマウントします。Oracleクライアント・ライブラリへのパスがLD_LIBRARY_PATH
に正しく指定されていることを確認してから、このプログラムをコールする必要があります。ファイルシステムがアンマウントされるまで、dbfs_client
プログラムは戻されません。
パスワードを安全に指定する方法の詳細は、「DBFSクライアントでのOracle Walletの使用」を参照してください。
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
はLinuxページ・キャッシュを使用しないため、大きいファイルの場合にパフォーマンスが向上します。このオプションでは、ファイルシステムのプログラムを実行できません。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
では、トレース・レベルを設します。トレース・レベルは次のとおりです。
DEBUG
INFO
WARNING
ERROR
CRITICAL
(デフォルト設定)
trace_file
file_name
|'syslog'
では、トレース・ログ・ファイルを指定します。
ファイルシステムをマウントする前に、Oracle Walletを作成し、該当のDBFSデータベース・ユーザーに証明書を割り当てる必要があります。詳細は、「DBFSクライアントでのOracle Walletの使用」を参照してください。
例6-1 ファイルシステムのマウント
rootユーザーとしてログインします。
新しいライブラリ・パスを追加します。
# echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf
ディレクトリをlib
に変更し、libclntsh.so.11.1
およびlibnnz11.so
ライブラリに対して次のシンボリック・リンクを作成します。
# cd /usr/local/lib # ln -s $ORACLE_HOME/lib/libclntsh.so.11.1 # ln -s $ORACLE_HOME/lib/libnnz11.so
libfuse.so
を検索し、このライブラリのシンボリック・リンクを作成します。
# locate libfuse.so determined_path/libfuse.so # ln –s determined_path/libfuse.so
ldconfig
を実行し、新しいシンボリック・リンクのリンクおよびキャッシュを作成します。
# ldconfig
dbfs_client
のシンボリックリンクをmount.dbfs
として/sbin
に作成します。
# ln -s $ORACLE_HOME/bin/dbfs_client /sbin/mount.dbfs
管理ユーザーとしてログインします。(次の手順はrootユーザーとして実行しないことをお薦めします。)
DBFSストアをマウントします。
% dbfs_client @/dbfsdb -o wallet,rw,user,direct_io /mnt/dbfs
(オプション)前述の手順が成功したかどうかをテストするには、dbfs
ディレクトリを表示します。
# ls /mnt/dbfs
ファイルシステムをアンマウントするには、fusermount
を実行します。
$ fusermount -u <mount point
>
DBFSでは、ioctl
、ロック、libaio
による非同期IO、O_DIRECT
ファイル・オープン、ハード・リンク、パイプ、およびその他の特定のファイル・モードを除く、ほとんどのファイルシステム操作がサポートされます。メモリー・マップ・ファイルは、共有書込み可能モードを除いてサポートされます。パフォーマンス上の理由から、DBFSでは、ファイル・データまたはその属性の読取りのたびにファイル・アクセス時間を更新することはありません。
direct_io
オプションが指定されている場合、DBFSマウント・ファイルからプログラムを実行することはできません。
NFSまたはSambaを使用してDBFSファイルシステムをエクスポートできません。
Linuxでは一般に、ファイルシステムは、fstab
ユーティリティを使用して構成されます。/etc/fstab
でDBFSをマウントするには、Oracle Walletを認証に使用する必要があります。次の操作をroot
ユーザーとして実行します。
LinuxでのfstabでDBFSをマウントする手順:
root
ユーザーとしてログインします。
ユーザーをユーザーroot
に変更し、dbfs_client
のグループをグループfuse
に変更します。
# chown root.fuse $ORACLE_HOME/bin/dbfs_client
dbfs_client
でsetuid
ビットを設定し、このユーザーとグループのみにexecute
権限を制限します。
# chmod u+rwxs,g+rx-w,o-rwx dbfs_client
dbfs_client
のシンボリックリンクをmount.dbfs
として/sbin
に作成します。
$ ln -s $ORACLE_HOME/bin/dbfs_client /sbin/mount.dbfs
fuse
という名前の新しいLinuxグループを作成します。
DBFSクライアントを実行しているLinuxユーザーをfuse
グループに追加します。
次の行を/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
Linuxユーザーは、Linuxの標準のmount
コマンドを使用して、DBFSファイルシステムをマウントできます。次に例を示します。
$ mount /mnt/dbfs
現在、FUSE
はautomount
をサポートしていません。
Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3以降から、Solaris上にlibfuse
をインストールしてdbfs_client
をマウント・モードで実行できます。この項では「DBFSのインストール」の項および「DBFSマウント・インタフェース」の項に説明されているLinuxプロシージャとは別に実行が必要な項目を説明します。
dbfs_client
をSolaris 11 SRU7以降のマウント・クライアントとして使用するには、プロンプトでpkg
info
libfuse
を実行してlibfuse
パッケージがインストールされていることを確認してください。行またはエラーが戻されなければ、次の手順を実行しlibfuse
をインストールしてください。
rootとしてinstallコマンドを実行します。
# pkg install libfuse
verifyコマンドを実行し、libfuse
が正常にインストールされていることを確認します。成功した場合は出力がありません。
# pkg verify libfuse
Solarisの場合、DBFSファイルシステムでマウントおよびアンマウント操作を実行するには、Solarisの権限PRIV_SYS_MOUNT
が必要です。
/etc/user_attr
を編集し、次のように、ユーザー・エントリ(ユーザーがOracleであることが前提)を追加または変更します。
oracle::::type=normal;project=group.dba;defaultpriv=basic,priv_sys_mount;;auth s=solaris.smf.*
Solarisでは一般に、ファイルシステムは、vfstab
ユーティリティを使用して構成されます。
vfstab
を使用したDBFSのマウントの手順:
dbfs_client
を起動するために使用するマウント・シェル・スクリプトmount_dbfs.sh
を作成します。Oracle Databaseに必要な環境変数をすべてエクスポートする必要があります。これらの環境変数には、TNS_ADMIN
、ORACLE_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 & ) &
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
ユーザーは標準のSolarisマウント・コマンドを使用して、DBFSファイルシステムをマウントできます。次に例を示します。
$ mount /mnt/dbfs
ユーザーは標準のSolarisのumount
コマンドを使用して、DBFSファイルシステムをアンマウントできます。次に例を示します。
$ umount /mnt/dbfs
DBFSコマンド・インタフェースにより、ネットワーク上の任意のホストからDBFSファイルシステムとの間でファイルを簡単にコピーできます。コマンド・インタフェースでは、ファイルシステムのマウントを必要とせず、ユーザー・モード・ファイルシステム・オーバーヘッドをバイパスするため、マウント・インタフェースよりパフォーマンスが多少向上します。ただし、アプリケーションに透過的ではありません。
すべてのDBFSコンテンツ・ストア・パスの前には、dbfs:
を付ける必要があります。たとえば、dbfs:/staging_area/file1
などです。指定するすべてのデータベース・パス名は、絶対パスである必要があります。DBFSコマンドを実行するには、DBFSクライアントに対して--command
を指定します。
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
コマンドは、ファイルまたはディレクトリをソースの場所から宛先の場所にコピーします。ディレクトリの再帰的コピーもサポートしています。
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
コマンド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管理ツールについて説明します。
この項の内容は次のとおりです。
Oracle Walletを使用すると、ユーザーがパスワードを入力することなく、DBFSクライアントでDBFSストアをマウントできます。ウォレットの作成および管理の詳細は、『Oracle Database Advanced Security管理者ガイド』を参照してください。"/@
"構文は、ウォレットを使用することを意味します。
Oracle Walletの作成手順:
ウォレットのディレクトリを作成します。次に例を示します。
mkdir $ORACLE_HOME/oracle/wallet
自動ログイン・ウォレットを作成します。
mkstore -wrl $ORACLE_HOME/oracle/wallet -create
クライアントのsqlnet.ora
ファイルに、ウォレットの場所を追加します。
vi $TNS_ADMIN/sqlnet.ora WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = $ORACLE_HOME/oracle/wallet) ) )
クライアントのsqlnet.ora
ファイル内に、次のパラメータを追加します。
vi $TNS_ADMIN/sqlnet.ora SQLNET.WALLET_OVERRIDE = TRUE
次のようにして、資格証明を作成します。
mkstore -wrl wallet_location -createCredential db_connect_string username password
次に例を示します。
mkstore -wrl $ORACLE_HOME/oracle/wallet -createCredential DBConnectString scott tiger
使用するtnsnames.ora
ファイルに、接続の別名を追加します。
これで、dbfs_client
をOracle Walletで使用できるようになります。
次に例を示します。
$ dbfs_client -o wallet /@DBConnectString /mnt/dbfs
データベースは、オペレーティング・システムのセキュリティ・モデルではなくDBFS内のセキュリティを管理します。データベース・ファイルシステムにアクセスするには、ファイルシステムの基礎となる表の権限を持つデータベース・ユーザーでデータベースにログインする必要があります。データベース管理者はファイルシステムへのアクセスをユーザーに付与でき、これにより別々のデータベース・ユーザーがファイルシステムに対して、データベース管理者が決定する別々のREAD
またはUPDATE
権限を持つことができます。当然、データベース管理者は、DBFSファイルシステムに格納されているすべてのファイルにアクセスできます。
クライアント・マシンでは、DBFSマウント・ポイントへのアクセスは、ファイルシステムをマウントするオペレーティング・システム・ユーザーに制限されています。ただし、多数のユーザーが同一のDBFSファイルシステムを別々にマウントできるため、これによってDBFSにアクセス可能なユーザーの数が制限されることはありません。
Linuxでは、DBFSがファイルシステムがマウントされた場合に、オペレーティング・システムのファイル・レベルの権限チェックが実行されます。コマンド・インタフェースを使用した場合、またはPL/SQLインタフェースを直接使用した場合は、DBFSでこのチェックは実行されません。かわりに、データベースの権限チェックのみが実行されます。
DBFSは、ユーザーによって作成されたすべてのファイルシステムが、デフォルトでそのユーザー固有になるセキュリティ・モデルで機能します。このモデルを変更しないことをお薦めします。オペレーティング・システム・ユーザーとRDBMSユーザーは異なるため、複数のオペレーティング・ユーザーを単一のDBFSファイルシステムにマウントすることはできません。これらのマウントは、マウント・ポイントおよび権限が異なる場合があります。たとえば、user1
はREAD ONLY
としてDBFSをマウントできますが、user2
はREAD WRITE
としてマウントできます。ただし、どちらのユーザーも同じRDBMSユーザーとしてファイルシステムにアクセスするため、RDBMSでは、両方のユーザーを同じ権限を持つユーザーとして認識します。
この項の内容は次のとおりです。
ファイルシステムをマウントしているオペレーティング・システム・ユーザーは、allow_root
オプションを指定することで、ファイルシステムへのrootアクセスを許可できます。このオプションでは、例6-4に示すように、/etc/fuse.conf
ファイルにuser_allow_other
フィールドを含める必要があります。
複数のRDBMSユーザーが同じファイルシステムにアクセスする必要がある状況が生じる場合があります。たとえば、ファイルシステムを所有するRDBMSユーザーが権限を付与されたユーザーで、そのユーザーの証明書を共有すると、セキュリティのリスクにさらされる危険があるとします。これを回避するために、DBFSでは、複数のRDBMSユーザーがファイルシステムの状態のサブセットを共有できるようになっています。
DBFSコンテンツAPIによるDBFSの登録およびマウントは各ユーザー固有ですが、各ユーザーが利用する基礎となるファイルシステムおよび表はユーザー間で共有できます。これにより、個々のファイルシステムを個別にマウントできるようになり、SQL/PLSQLまたはdbfs_client
APIのいずれかを使用して、異なるRDBMSユーザーで使用できます。
次の例では、ユーザーuser1
はファイルシステムを変更できますが、user2
はこれらの変更を参照することしかできません。user1
は、ファイルシステムを作成するRDBMSユーザーで、user2
は、最終的にdbfs_client
を使用してファイルシステムのマウントとアクセスを行うRDBMSユーザーです。user1
とuser2
は、どちらもDBFS_ROLE
権限を持ちます。
複数のRDBMSユーザー間でDBFSアクセス共有を確立する手順:
ファイルシステムを作成するユーザーとして接続します。
sys@tank as sysdba> connect user1 Connected.
ファイルシステム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;
(オプション)すべてのマウントを表示することにより、前述の手順が正常に実行されたかどうかを確認できます。
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))
(オプション)dbfs_client
を使用するユーザーとして接続します。
user1@tank> connect user2 Connected.
(オプション) user2
にはマウントがないため、user1
のDBFSの状態を確認できません。
user2@tank> select * from table(dbms_dbfs_content.listMounts);
user1
として接続している間に、DBFS_ROLE
権限を持つユーザーがアクセスできるように、ファイルシステムuser1_FS
をエクスポートします。
user1@tank> exec dbms_dbfs_sfs.exportFilesystem('user1_FS'); user1@tank> commit;
dbfs_client
を使用するユーザーとして接続します。
user1@tank> connect user2 Connected.
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)
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;
(オプション)すべてのマウントを表示することにより、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))
(オプション)user2
およびuser1
のパス名をリストします。ストアuser2_FS
用の別のマウントであるuser2_mnt,
は、user2
で使用できます。ただし、基礎となるファイルシステム・データは、user2
とuser1
で同じです。
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
ファイルシステム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
(オプション)前述の手順で作成したファイル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;
(オプション)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
ユーザー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()
プロシージャは、スキーマ間で共有される同じデータへのアクセスに必要な権限の付与を管理します。user1
がexportFilesystem()
をコールした後、DBFS_ROLE
権限を持つ任意のユーザーにファイルシステムのアクセス権を付与できます。別のロールを指定することもできます。
続いて、dbms_dbfs_sfs.registerFilesystem()
、dbms_dbfs_sfs.registerStore()
およびdmbs_dbfs_sfs.mountStore()
プロシージャ・コールを呼び出すことにより、基礎となる同じ記憶域を共有する新しいDBFSファイルシステムをuser2
がuser1_FS
ファイルシステムとして作成できます。
複数のRDBMSユーザーがファイルシステムを共有している場合は、所有者(ここではuser1
)がファイルシステムを削除する前に、すべてのRDBMSユーザーがそのファイルシステムに関連する各自の項目の登録を解除している必要があります。
rootユーザーがDBFSを実行することは推奨されません。
dbfs_client
は、問題の診断を支援するために複数のトレース・レベルをサポートしています。dbfs_client
は、Linuxでsyslog
デーモンを使用してトレースをファイルまたは/var/log/messages
に出力できます。ファイルに対してトレースする場合、ディスク上で2つのトレース・ファイルが保持されます。dbfs_client
は、トレース・ファイルを自動的にローテーションし、ディスク使用量を20MBに制限します。
デフォルトでは、/var/log/messages
に常にロギングされるクリティカルなメッセージを除き、トレーシングは無効になっています。
dbfs_client
でOracle Databaseに接続できない場合、trace_level
およびtrace_file
オプションを使用してトレースを有効にします。トレースを使用すると、追加メッセージがログ・ファイルに出力されて、デバッグが容易になります。
DBFSでは、Oracle Databaseを使用して、ファイルが格納されます。Oracleサーバーの問題は、dbfs_client
にエラーとして伝播される場合があります。dbfs_client
エラーが発生した場合、Oracleサーバー・ログを参照して、そのエラーが根本原因であるかを確認してください。
Oracle RACクラスタの1つのデータベース・インスタンスが失敗した場合、dbfs_client
を、その他の既存のデータベース・インスタンスの1つにフェイルオーバーできます。dbfs_client
フェイルオーバーが正常に動作するには、例6-5に示すように、Oracleデータベース・サービスを変更して、フェイルオーバー・パラメータを指定する必要があります。
例6-5 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データベース・インスタンスが失敗した後で、DBFS接続のフェイルオーバーの際にデータが損失しないようにするには、例6-6に示すように、-o failover
マウント・オプションを指定します。この場合、クライアントが終了するとキャッシュされた書込みは失われる可能性があります。ただし、他のOracle RACインスタンスまたはスタンバイ・データベースに対するバックエンド・フェイルオーバーでは、書込みが失われることはありません。
同一の共有ファイルシステムにアクセスするdbfs_client
の複数コピーを保持することが可能です。共有およびキャッシュ・セマンティクスは、NFSと同様です。NFSと同様に、デフォルト・モードでは、クライアント上に書込みをキャッシュし、タイムアウト後またはユーザーがファイルを閉じた時点で、その書込みをフラッシュします。また、NFSと同様に、ファイルへの書込みは、ライターがファイルをクローズした後にファイルをオープンするクライアントにのみ参照されます。この動作は一般に、close-to-openキャッシュ一貫性と呼ばれます。
クライアント側の書込みキャッシュを省略するには、ファイルのオープン時にO_SYNC
を指定します。キャッシュへの書込みは、fsync
をコールすることで、強制的にディスクに書き込まれます。
DBFSのバックアップには2つの方法があります。1つ目は、ファイルシステムの基礎となる表をデータベース・レベルでバックアップする方法です。2つ目は、マウント・ポイントからOracle Secure Backupなどのファイルシステムのバックアップ・ユーティリティを使用する方法です。
この項の内容は次のとおりです。
データベース・レベルで表をバックアップすると、ファイルシステム内のファイルとデータベース内のリレーショナル・データの一貫性を常に保つことができる利点があります。また、データベースの完全なリストアおよびリカバリにより、データを損失せずにファイルシステムを完全にリストアおよびリカバリできます。データベースのpoint-in-timeリカバリの実行中に、ファイルは指定した時間にリカバリされます。通常のデータベース・バックアップのように、バックアップ中に発生した変更はリストアの一貫性に影響しません。リストアされたファイルシステム全体は、指定したタイム・スタンプにおいて常に一貫性があります。
ファイルシステム・バックアップ・ユーティリティを使用してファイルシステムをバックアップすると、個々のファイルをバックアップから容易にリストアできる利点があります。リストアされたファイルに最後のバックアップ以降に加えられた変更は失われます。
Oracle Secure Backup管理サーバーを使用してバックアップがスケジュールされる場合、allow_root
マウント・オプションを指定する必要があります。
すべての共有ファイルシステムと同様に、小さいファイルに対するDBFSのパフォーマンスは、ローカル・ファイルシステムのパフォーマンスより遅れます。DBFS内の各ファイルのデータまたはメタデータの操作は、FUSE
ユーザー・モード・ファイルシステムによって処理され、ネットワークを介してデータベースに転送される必要があります。このため、クライアントでキャッシュされていない操作は、DBFS内での実行に数ミリ秒かかります。
ディスクへの入力/出力(IO)を伴う操作では、ディスクIOの待機によって時間遅延のオーバーヘッドがマスクされます。大きいIOのオーバーヘッドは、小さいIOの場合よりも当然低いパーセンテージになります。ネットワーク・オーバーヘッドは、ディスクIOを発行しない操作でより顕著です。
ローカル・ファイルシステムを使用する数の少ない小さいファイル上で動作する操作では、オーバーヘッドは目立ちませんが、数千の小さいファイル上に影響を与える操作では、オーバーヘッドは大きくなります。たとえば、単一ディレクトリをリストする場合や単一ファイルを参照する場合、ほぼ即時にレスポンスが得られますが、数千のファイルを含むディレクトリ・ツリー内を検索する場合、オーバーヘッドは相対的に大きくなります。
DBFSでは、圧縮、重複除外、暗号化、パーティション化など、SecureFiles LOBで使用可能な拡張機能を利用できます。たとえば、パーティション化を使用して、DBFSを圧縮ファイルシステムとして構成できます。ファイルシステムの作成時に、ファイルシステムで使用可能にする機能のセットを指定する必要があります。SecureFiles LOBの機能については、第4章「Oracle SecureFiles LOBの使用」を参照してください。