この章では、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_namefile_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]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はファイルまたはディレクトリを削除します。ディレクトリの再帰的削除もサポートしています。
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の使用」を参照してください。