简单的来说,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数据。

可以注意到:表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中查看该图片。

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】

更多的资料请阅读:

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

  1. python连接access数据库未找到提供程序_连接ACCESS数据库时未找到提供程序.该程序可能未正确安装的解决...

    出现错误:ADODB.Connection   错误   '800a0e7a' 未找到提供程序.该程序可能未正确安装. 我的连接字符串是  ConnStr = "Provider = Mic ...

  2. tde数据库加密_如何在TDE加密的数据库上配置SQL Server镜像

    tde数据库加密 Securing and encrypting sensitive data stored in your production databases is a big concern ...

  3. oracle label security redition,今天在用11GR2客户端全库导出10GR2版本的数据库时报ORA-00904错误...

    今天在用11GR2客户端全库导出10GR2版本的数据库时报ORA-00904错误. C:\>expfile=full.dmp  full=y buffer=10485760 Export: Re ...

  4. oracle数据库有哪些文件构成,Oracle数据库架构中包括几层?每层都有什么元素?...

    Oracle数据库架构中包括几层?每层都有 什么元素? 1 PL/SQL代表 A PROCEDURAL LANGUAGE/SQL B PROGRAM LANGUAGE SQL C POWER LANG ...

  5. 关于Oracle数据库19c中的关键字和保留字的说明

    关于Oracle数据库中的关键字和保留字的说明 官方文档节选: ​ You cannot use Oracle SQL reserved words as nonquoted identifiers. ...

  6. 如何将oracle数据库中的表结构导入到sqlserver中,Oracle转换成SqlServer数据库的步骤...

    1 背景 ITM系统目前支持MysqL.Oracle数据库,由于现在需要和CA产品进行结合,用CA产品的采集功能进行数据采集,因此需要使用CA产品的sqlServer数据库,为了使得系统支持sqlse ...

  7. 将oracle冷备份恢复到另外一个数据库实例中

    因更换服务器需要将Oracle数据库转移到另外台Oracle中. 说明: 1.测试环境为:windows server2003 和 oracle 10g. 2.2台服务器安装的程序目录一样,数据目录不 ...

  8. oracle数据库存储过程中NO_DATA_FOUND不起作用解决

    oracle数据库存储过程中NO_DATA_FOUND不起作用 1.首先创建一个表lengzijiantest,表中只有一个字段f_id ? 1 2 3 4 5 [cpp] CREATE TABLE ...

  9. php7连接oracle数据库,使用一个持久连接连到 Oracle 数据库 - PHP 7 中文文档

    (PHP 5, PHP 7, PECL OCI8 >= 1.1.0) oci_pconnect – 使用一个持久连接连到 Oracle 数据库 说明 oci_pconnect ( string ...

最新文章

  1. 第三个Sprint冲刺第八天(燃尽图)
  2. Extended WPF Toolkit 新控件介绍
  3. 问题集锦(16-20)
  4. 求数组中第k个最小数
  5. linux下挂载和卸载的命令的用法:mount 、umount
  6. linux+内核中开启nfs,NFS Client in Linux Kernel - Open
  7. idea使用svn拉取项目代码_IntelliJ IDEA 14 拉取SVN maven 多模块项目 部署tomcat 详细图解!...
  8. 如何设计良好的viewcontroller
  9. 浅谈MIPS地址对齐问题
  10. xftp 无法连接linux 22端口,解决Xshell不从22端口连接服务器
  11. Gym - 100543L
  12. python三种基本数据类型_Python的三种基本数据类型
  13. sourcetree使用简介
  14. 如何在柱状图中点连线_如何快速掌握MSA
  15. 查看高通kernel用哪个dsti
  16. 移动硬盘在Mac上无法拷贝或删除文件的解决办法
  17. c#窗体编辑个人简历_3年工作经验.net程序员简历应该怎么写
  18. PMI-ACP敏捷项目认证练习题(一)
  19. 百度大数据+零售发挥引擎优势 ------BDL ,大数据+亚当科茨领导的人工智能实验室和由张潼领导的大数据实验室
  20. 维度表,实体表,事实表之间的关系

热门文章

  1. 3.1栈和队列——顺序栈基本操作的实现
  2. 作一份高水准的英文简历
  3. 树链剖分(四)——旅行
  4. 解决CMake Error: The source directory “*“ does not appear to contain CMakeLists.txt.
  5. pytorch安装错误
  6. 2022年十一届认证杯(小美赛)C题思路新鲜出炉
  7. python解非线性方程组_python scipy求解非线性方程的方法(fsolve/root)
  8. HK1Box,在armbian上基于docker安装宝塔
  9. UI设计培训费用多少钱?贵不贵?
  10. 做人要低调,别把自己太当回事