g_hk 发表于 2011-12-22 08:54

(DBFS) in Oracle 11g

<p>简单的来说,DBFS就是Oracle数据库11gR2中提供的能够在Linux操作系统中将Oracle数据库当成文件系统来使用的功能。在DBFS内部,文件是以SecureFiles LOBs(对比与以前的BasicFiles LOBs)的形式存储在数据表中。</p>
<p>本文简单介绍在Oracle11gR2中使用DBFS的方法。<br>
参考文档:Oracle® Database SecureFiles and Large Objects Developer’s Guide 11g Release 2 (11.2) – <a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e18294/adlob_client.htm#BABFGDAF">6 DBFS File System Client</a></p>
<p>本文使用的数据库是Oracle 11.2.0.1,操作系统是Oracle Enterprise Linux 5.3:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ cat /etc/enterprise-release
Enterprise Linux Enterprise Linux Server release 5.3 (Carthage)
$ uname -r
2.6.18-128.el5</pre></div></div>

<p>1. 首先需要安装kernel-devel和<a href="http://sourceforge.net/projects/fuse/files/fuse-2.X/">FUSE</a>包。实际上现在最新的FUSE版本是2.8.5,但是为了防止有兼容性问题,仍然按照文档所述选择了2.7.4版本。kernel-devel包在OEL的安装光盘中就可以找到,如果你的Linux系统中已经安装过,无需再次安装。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;"># rpm -qa| grep kernel-devel
kernel-devel-2.6.18-128.el5</pre></div></div>

<p>安装FUSE也同样很简单。<br>
将下载成功的fuse-2.7.4.tar.gz文件解压,生成fuse-2.7.4目录。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;"># ./configure --prefix=/usr --with-kernel=/usr/src/kernels/`uname -r`-`uname -p`
# make
# make install
# /sbin/depmod
# /sbin/modprobe fuse
# chmod 666 /dev/fuse
# echo "/sbin/modprobe fuse" &gt;&gt; /etc/rc.modules
# chmod +x /etc/rc.modules</pre></div></div>

<p>2. 在数据库中创建文件系统。创建文件系统的数据库用户至少需要拥有以下权限。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">SQL&gt; grant connect, create session, resource, create table,
create procedure, dbfs_role to kamus;</pre></div></div>

<p>在$ORACLE_HOME/rdbms/admin目录中执行dbfs_create_filesystem.sql来创建文件系统。其中mytbs为文件系统所在的表空间,dbfs_area为文件系统的名称。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">cd $ORACLE_HOME/rdbms/admin
sqlplus kamus
SQL&gt; @dbfs_create_filesystem.sql mytbs dbfs_area</pre></div></div>

<p>3. 将数据库文件系统mount到操作系统中。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">--添加一个新的库目录到库文件加载路径中
# echo "/usr/local/lib" &gt;&gt; /etc/ld.so.conf.d/usr_local_lib.conf
--将必须的库文件link到该目录中
# cd /usr/local/lib
# ln -s $ORACLE_HOME/lib/libclntsh.so.11.1
# ln -s $ORACLE_HOME/lib/libnnz11.so
# ln -s /usr/lib/libfuse.so
--创建运行时动态库链接
# ldconfig
--创建挂载点目录,修改目录属主
# mkdir /dbfs
# chown oracle:dba /dbfs
--以oracle用户挂载DBFS文件系统
# su - oracle
$ dbfs_client kamus@dbserver:1521/orcl -o rw,user,direct_io /dbfs</pre></div></div>

<p>以上命令并没有使用在后台mount DBFS,因此在执行完最后命令的时候,要求输入数据库用户kamus的密码,之后并不会回到命令行状态,这是正常的。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ dbfs_client kamus@dbserver:1521/orcl -o rw,user,direct_io /dbfs
Password:</pre></div></div>

<p>如果要以后台的方式mount,则需要执行以下命令,其中pwd.f中保存数据库用户的密码:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ nohup dbfs_client kamus@dbserver:1521/orcl -o rw,user,direct_io /dbfs &lt; pwd.f &amp;</pre></div></div>

<p>如果要卸载文件系统,则使用:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ fusermount -u /dbfs</pre></div></div>

<p>4. 检查文件系统是否已经mount成功。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ ls -l /dbfs
total 0
drwxrwxrwx 5 root root 0 Apr 12 00:21 dbfs_area</pre></div></div>

<p>可以看到之前创建的名称为dbfs_area的文件系统已经以目录的形式存在于挂载点/dbfs中了。</p>
<p>5. 创建一个测试目录,直接往目录中copy文件。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ cd /dbfs/dbfs_area
$ mkdir test
$ echo "A great user experience" &gt; test/dbfs.txt</pre></div></div>

<p>6. 在数据库中查看该文件是如何存储的。这里我们使用SQL Devloper来更方便地查看LOB数据。<br>
<a href="http://www.dbform.com/wp-content/uploads/2011/04/mwsnap732.jpg"><img src="http://www.dbform.com/wp-content/uploads/2011/04/mwsnap732.jpg" alt="" title="Check DBFS LOB" class="alignleft size-full wp-image-1488" height="585" width="800"></a></p>
<p>可以注意到:表T_DBFS_AREA是Oracle自动创建的,该表的PATHNAME为文件系统路径,FILEDATA字段为LOB类型,存储
真正的文件内容,并且在SQL Developer中也可以看到我们刚才在操作系统中直接echo进dbfs.txt文本文件中的内容了。</p>
<p>再测试一个图片文件。</p>
<p>7. 创建一个新文件系统。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">cd $ORACLE_HOME/rdbms/admin
sqlplus kamus/oracle
SQL&gt; @dbfs_create_filesystem.sql mytbs dbfs_pics</pre></div></div>

<p>8. 新文件系统会立刻以目录的形式出现在操作系统中。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ ls -l /dbfs
total 0
drwxrwxrwx 4 root root 0 Apr 12 02:20 dbfs_area
drwxrwxrwx 3 root root 0 Apr 12 00:42 dbfs_pics</pre></div></div>

<p>9. 远程使用sftp从本地机器中上传一个jpg图片,上传到/dbfs/dbfs_pics目录中。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ ls -l /dbfs/dbfs_pics/
total 33
-rw-r--r-- 1 oracle dba 33565 Apr 12 00:42 zombie2.jpg</pre></div></div>

<p>10. 在SQL Developer中查看该图片。<br>
<a href="http://www.dbform.com/wp-content/uploads/2011/04/mwsnap733.jpg"><img src="http://www.dbform.com/wp-content/uploads/2011/04/mwsnap733.jpg" alt="" title="Check DBFS LOB Pics" class="alignleft size-full wp-image-1489" height="658" width="799"></a></p>
<p>11. 查看用户LOB视图,确实是以SecureFile LOBs的形式存储的。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">SQL&gt; select table_name,column_name,segment_name,securefile from user_lobs;
&nbsp;
TABLE_NAME         COLUMN_NAME          SEGMENT_NAME                   SEC
-------------------- -------------------- ------------------------------ ---
T_DBFS_AREA          FILEDATA             LOB_SFS$_FST_1               YES
T_DBFS_PICS          FILEDATA             LOB_SFS$_FST_17                YES</pre></div></div>

<p>至此,完成了最基本的DBFS测试,这是很奇妙的用户体验,不是吗?</p>
<p>【备注1】<br>
在DBFS被使用的时候,也仍然可以正常关闭数据库,这一点与<a href="http://www.dbform.com/html/2010/1255.html">ACFS</a>不同,毕竟这仅仅是通过FUSE框架展现出来的用户接口而已。在关闭数据库以后,再次尝试读取DBFS中的内容,将报IO错误。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ pwd
/dbfs/dbfs_area/test
$ ls
ls: .: Input/output error</pre></div></div>

<p>【备注2】<br>
如果在Linux X86-64操作系统中使用dbfs_client,需要额外打上一些Critical Patches,具体参看<a href="https://support.oracle.com/CSP/main/article?cmd=show&amp;type=NOT&amp;id=1150157.1">MOS Note 1150157.1</a>。</p>
               
               
               
               
页: [1]
查看完整版本: (DBFS) in Oracle 11g