oracle中yest,DBFS就是Oracle数据库11gR2中提供的能够将Oracle数据库当成文件系统来使用的功能...

简单的来说,DBFS就是Oracle数据库11gR2中提供的能够在Linux操作系统中将Oracle数据库当成文件系统来使用的功能。在DBFS内部,文件是以SecureFiles

LOBs(对比与以前的BasicFiles LOBs)的形式存储在数据表中。

本文简单介绍在Oracle11gR2中使用DBFS的方法。

参考文档:Oracle® Database SecureFiles and Large Objects Developer’s

Guide 11g Release 2 (11.2) –

本文使用的数据库是Oracle 11.2.0.1,操作系统是Oracle Enterprise Linux 5.3:

$ cat/etc/enterprise-releaseEnterpriseLinuxEnterpriseLinuxServerrelease5.3(Carthage)$ uname-r2.6.18-128.el5

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

# rpm -qa| grep kernel-develkernel-devel-2.6.18-128.el5

安装FUSE也同样很简单。

将下载成功的fuse-2.7.4.tar.gz文件解压,生成fuse-2.7.4目录。

# ./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" >> /etc/rc.modules# chmod +x /etc/rc.modules

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

SQL>grant connect,create session,resource,create table,create procedure,dbfs_role to kamus;

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

cd $ORACLE_HOME/rdbms/admin

sqlplus kamus

SQL>@dbfs_create_filesystem.sql mytbs dbfs_area

通过观察屏幕显示,可以知道dbfs_create_filesystem.sql实际上是调用了一些package,创建了DBFS文件系统。而这种默认方式对于Securefile

LOB的一些特性都是没有启用的,比如压缩,去重,分区,加密等,如果要启用这些特性,可以使用dbfs_create_filesystem_advanced.sql。

--------CREATE STORE:begindbms_dbfs_sfs.createFilesystem(store_name=>'FS_DBFS_AREA',tbl_name=>'T_DBFS_AREA',tbl_tbs=>'users',lob_tbs=>'users',do_partition=>false,partition_key=>1,do_compress=>false,compression=>'',do_dedup=>false,do_encrypt=>false);end;--------REGISTER STORE:begindbms_dbfs_content.registerStore(store_name=>'FS_DBFS_AREA',provider_name=>'sample1',provider_package=>'dbms_dbfs_sfs');end;--------MOUNT STORE:begindbms_dbfs_content.mountStore(store_name=>'FS_DBFS_AREA',store_mount=>'dbfs_area');end;--------CHMOD STORE:declare m integer;beginm:=dbms_fuse.fs_chmod('/dbfs_area',16895);end;

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

--添加一个新的库目录到库文件加载路径中# echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf--将必须的库文件link到该目录中# export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1# 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

如果不执行以上步骤,则运行dbfs_client将会报错。

dbfs_client:errorwhileloading shared libraries:libclntsh.so.11.1:cannot open sharedobjectfile:Nosuch fileordirectory

实际上到此为止,DBFS已经可以正常运转了,即使我们不将DBFS挂载到操作系统中的某个目录下,也同样可以通过dbfs_client程序来创建目录,copy文件。

比如用dbfs_client来列出初始的DBFS目录结构。

$ dbfs_client dbfs@localhost:1521/orcl--command ls-a-R dbfs:/dbfs_areaPassword:dbfs:/dbfs_area/.sfs

dbfs:/dbfs_area/.sfs/content

dbfs:/dbfs_area/.sfs/RECYCLE

dbfs:/dbfs_area/.sfs/snapshots

dbfs:/dbfs_area/.sfs/tools

dbfs:/dbfs_area/.sfs/attributes

创建新目录。

$ dbfs_client dbfs@localhost:1521/orcl--command mkdir dbfs:/dbfs_area/dir1

copy文件。

$ dbfs_client dbfs@localhost:1521/orcl--command cp test.txt dbfs:/dbfs_area/dir1/Password:test.txt->dbfs:/dbfs_area/dir1/test.txt

可以通过以下方式从数据字典中查看DBFS的目录结构和属性。

SQL>SELECT*FROMTABLE(dbms_dbfs_content.listmounts);SQL>SELECT*FROMTABLE(dbms_dbfs_content.listallcontent);SQL>SELECT*FROMdbfs_content;SQL>SELECT*FROMdbfs_content_properties;

不过为了更加方便使用,我们将DBFS挂载到/dbfs目录中。

--创建挂载点目录,修改目录属主# mkdir /dbfs# chown oracle:dba /dbfs--以oracle用户挂载DBFS文件系统# su - oracle$ dbfs_client kamus@dbserver:1521/orcl-o rw,user,direct_io/dbfs

以上命令并没有使用在后台mount

DBFS,因此在执行完最后命令的时候,要求输入数据库用户kamus的密码,之后并不会回到命令行状态,这是正常的。

$ dbfs_client kamus@dbserver:1521/orcl-o rw,user,direct_io/dbfsPassword:

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

$ nohup dbfs_client kamus@dbserver:1521/orcl-o rw,user,direct_io/dbfs<pwd.f&

更安全的方法是使用wallet,方法如下。

--创建wallet目录,该目录位置随意mkdir $ORACLE_HOME/wallet--创建Oraclewallet,回车以后会要求指定wallet的密码,要求至少为8个字符。mkstore-wrl $ORACLE_HOME/wallet-create--更新$ORACLE_HOME/network/admin/sqlnet.ora文件,添加wallet的位置。vi $ORACLE_HOME/network/admin/sqlnet.ora--添加如下行WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/product/11.2.0/dbhome_1/wallet)))SQLNET.WALLET_OVERRIDE=TRUE--将密码证书添加到wallet中。其中orcl为tnsnames.ora中的条目,kamus为用户名,oracle为密码。mkstore-wrl $ORACLE_HOME/wallet-createCredential orcl kamus oracle--添加成功以后,可以通过如下命令查看密码证书mkstore-wrl $ORACLE_HOME/wallet-listCredential--挂载DBFS文件系统dbfs_client-o wallet/@orcl/dbfs

通过wallet方式,如果要挂载不同数据库用户下的DBFS,则需要mkstore

-createCredential命令添加多个密码证书,通过不同的tnsnames条目来区分。

--添加scott用户的密码证书mkstore-wrl $ORACLE_HOME/wallet-createCredential orcl_scott scott tiger--在tnsnames.ora中添加orcl_scott条目--挂载DBFS文件系统dbfs_client-o wallet/@orcl_scott/dbfs

如果要卸载文件系统,则使用:

$ fusermount-u/dbfs

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

$ ls-l/dbfs

total0drwxrwxrwx5root root0Apr1200:21dbfs_area

可以看到之前创建的名称为dbfs_area的文件系统已经以目录的形式存在于挂载点/dbfs中了。

5. 创建一个测试目录,直接往目录中copy文件。

$ cd/dbfs/dbfs_area

$ mkdir test

$ echo"A great user experience">test/dbfs.txt

6. 在数据库中查看该文件是如何存储的。这里我们使用SQL Devloper来更方便地查看LOB数据。

a4c26d1e5885305701be709a3d33442f.png

可以注意到:表T_DBFS_AREA是Oracle自动创建的,该表的PATHNAME为文件系统路径,FILEDATA字段为LOB类型,存储真正的文件内容,并且在SQL

Developer中也可以看到我们刚才在操作系统中直接echo进dbfs.txt文本文件中的内容了。

再测试一个图片文件。

7. 创建一个新文件系统。

cd $ORACLE_HOME/rdbms/admin

sqlplus kamus/oracle

SQL>@dbfs_create_filesystem.sql mytbs dbfs_pics

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

$ ls-l/dbfs

total0drwxrwxrwx4root root0Apr1202:20dbfs_area

drwxrwxrwx3root root0Apr1200:42dbfs_pics

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

$ ls-l/dbfs/dbfs_pics/total33-rw-r--r--1oracle dba33565Apr1200:42zombie2.jpg

10. 在SQL Developer中查看该图片。

a4c26d1e5885305701be709a3d33442f.png

11. 查看用户LOB视图,确实是以SecureFile LOBs的形式存储的。

SQL>selecttable_name,column_name,segment_name,securefilefromuser_lobs;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

至此,完成了最基本的DBFS测试,这是很奇妙的用户体验,不是吗?

【备注1】

在DBFS被使用的时候,也仍然可以正常关闭数据库,这一点与ACFS不同,毕竟这仅仅是通过FUSE框架展现出来的用户接口而已。在关闭数据库以后,再次尝试读取DBFS中的内容,将报IO错误。

$ pwd/dbfs/dbfs_area/test

$ ls

ls:.:Input/output error

【备注2】

如果在Linux X86-64操作系统中使用dbfs_client,需要额外打上一些Critical

Patches,具体参看MOS

Note 1150157.1。

【备注3】

更多的资料请阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值