无所不能:Oracle的数据库文件系统DBFS是什么鬼?

张乐奕

云和恩墨副总经理,Oracle ACE总监,ACOUG 联合创始人

在Oracle11g新增了一个特别的功能—DBFS,从字面翻译,DBFS=DATABASE FILE SYSTEM(数据库文件系统),听上去好像很神奇的样子,到底数据库文件系统是什么呢?

简单的来说,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) – 6 DBFS File System Client

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

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

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

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

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

通过观察屏幕显示,可以知道 dbfs_create_filesystem.sql 实际上是调用了一些 package,创建了 DBFS 文件系统。而这种默认方式对于 Securefile LOB 的一些特性都是没有启用的,比如压缩,去重,分区,加密等,如果要启用这些特性,可以使用 dbfs_create_filesystem_advanced.sql。

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

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

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

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

创建新目录。

copy文件。

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

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

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

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

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

通过wallet方式,如果要挂载不同数据库用户下的DBFS,则需要mkstore -createCredential命令添加多个密码证书,通过不同的tnsnames条目来区分。

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

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

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

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

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

可以注意到:表T_DBFS_AREA是Oracle自动创建的,该表的PATHNAME为文件系统路径,FILEDATA字段为LOB类型,存储真正的文件内容,并且在SQL Developer中也可以看到我们刚才在操作系统中直接echo进dbfs.txt文本文件中的内容了。

再测试一个图片文件。

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

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

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

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

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

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

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

【备注2】 如果在Linux X86-64操作系统中使用dbfs_client,需要额外打上一些Critical Patches,具体参看MOS Note 1150157.1。

【备注3】 更多的资料请阅读:

  • Oracle database filesystem (DBFS) done the easy way!
  • Oracle Database File System (DBFS) in Oracle Database 11g Release 2
  • Oracle Database File System (DBFS) PL/SQL APIs
  • Introducing the Oracle Database File System

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

使用 Oracle 的 Security External Password Store 功能实现数据库加密登陆

编辑手记:让安全成为一种习惯,使用 Oracle 的 Security External Password Store 功能实现加密登录, 不将明文密码暴露在生...

3976
来自专栏友弟技术工作室

Python虚拟环境

本教程将引导你完成安装和使用 Python 包。 它将向你展示如何安装和使用必要的工具,并就最佳做法做出强烈推荐。请记住, Python 用于许多不同的目的。准...

48915
来自专栏三木的博客

RPM软件包管理机制之旅

    Linux下的man命令十分实用,可以查看Linux命令的手册。但这些手册只适用于忘记命令的选项时查询之用,如果用来学习Linux下类似于Git, RP...

2847
来自专栏容器云生态

如何优雅的编写Dockerfile

在生产环境中一般我们会对基本的环境进行自构建,从而利用images的分层特性去层层构建上层的业务镜像。 1.默认情况下我们会首先构建一个基本的base镜像,这...

4218
来自专栏ytkah

dedecms批量修改文章为待审核稿件怎么操作

  dedecms批量修改文章为待审核稿件要怎么操作呢?因为我们有时会出于某些原因要把文章暂时先隐藏掉,dedecms有一个比较好的功能是将文件状态设为未审核前...

2775
来自专栏Greenplum

Greenplum权限管理

每个数据库的逻辑结构对象都有一个所有者,所有者默认拥有所有的权限,不需要重新赋予。

1800
来自专栏散尽浮华

git push上传代码到gitlab上,报错401/403(或需要输入用户名和密码)

之前部署的gitlab,采用ssh方式连接gitlab,在客户机上产生公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都...

52910
来自专栏13blog.site

让docker中的mysql启动时自动执行sql文件

本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL...

5516
来自专栏Java架构解析

mysql用户创建、修改、删除及授权操作的总结

1、mysql命令进行连接如果不带-h,表示user@localhost连接本地localhost数据库服务器,-h后面的ip是数据库服务器的IP

660
来自专栏北京马哥教育

FTP基于PAM和MySQL/MariaDB实现虚拟用户访问控制

前言 vsftpd是一款在Linux发行版中最受 推崇的FTP服务器程序,特点是小巧轻快,安全易用,目前在开源操作系统中常用的FTP套件主要有proftp...

2935

扫码关注云+社区