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数据。
可以注意到:表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数据库当成文件系统来使用的功能...相关推荐
- python连接access数据库未找到提供程序_连接ACCESS数据库时未找到提供程序.该程序可能未正确安装的解决...
出现错误:ADODB.Connection 错误 '800a0e7a' 未找到提供程序.该程序可能未正确安装. 我的连接字符串是 ConnStr = "Provider = Mic ...
- tde数据库加密_如何在TDE加密的数据库上配置SQL Server镜像
tde数据库加密 Securing and encrypting sensitive data stored in your production databases is a big concern ...
- oracle label security redition,今天在用11GR2客户端全库导出10GR2版本的数据库时报ORA-00904错误...
今天在用11GR2客户端全库导出10GR2版本的数据库时报ORA-00904错误. C:\>expfile=full.dmp full=y buffer=10485760 Export: Re ...
- oracle数据库有哪些文件构成,Oracle数据库架构中包括几层?每层都有什么元素?...
Oracle数据库架构中包括几层?每层都有 什么元素? 1 PL/SQL代表 A PROCEDURAL LANGUAGE/SQL B PROGRAM LANGUAGE SQL C POWER LANG ...
- 关于Oracle数据库19c中的关键字和保留字的说明
关于Oracle数据库中的关键字和保留字的说明 官方文档节选: You cannot use Oracle SQL reserved words as nonquoted identifiers. ...
- 如何将oracle数据库中的表结构导入到sqlserver中,Oracle转换成SqlServer数据库的步骤...
1 背景 ITM系统目前支持MysqL.Oracle数据库,由于现在需要和CA产品进行结合,用CA产品的采集功能进行数据采集,因此需要使用CA产品的sqlServer数据库,为了使得系统支持sqlse ...
- 将oracle冷备份恢复到另外一个数据库实例中
因更换服务器需要将Oracle数据库转移到另外台Oracle中. 说明: 1.测试环境为:windows server2003 和 oracle 10g. 2.2台服务器安装的程序目录一样,数据目录不 ...
- oracle数据库存储过程中NO_DATA_FOUND不起作用解决
oracle数据库存储过程中NO_DATA_FOUND不起作用 1.首先创建一个表lengzijiantest,表中只有一个字段f_id ? 1 2 3 4 5 [cpp] CREATE TABLE ...
- php7连接oracle数据库,使用一个持久连接连到 Oracle 数据库 - PHP 7 中文文档
(PHP 5, PHP 7, PECL OCI8 >= 1.1.0) oci_pconnect – 使用一个持久连接连到 Oracle 数据库 说明 oci_pconnect ( string ...
最新文章
- 第三个Sprint冲刺第八天(燃尽图)
- Extended WPF Toolkit 新控件介绍
- 问题集锦(16-20)
- 求数组中第k个最小数
- linux下挂载和卸载的命令的用法:mount 、umount
- linux+内核中开启nfs,NFS Client in Linux Kernel - Open
- idea使用svn拉取项目代码_IntelliJ IDEA 14 拉取SVN maven 多模块项目 部署tomcat 详细图解!...
- 如何设计良好的viewcontroller
- 浅谈MIPS地址对齐问题
- xftp 无法连接linux 22端口,解决Xshell不从22端口连接服务器
- Gym - 100543L
- python三种基本数据类型_Python的三种基本数据类型
- sourcetree使用简介
- 如何在柱状图中点连线_如何快速掌握MSA
- 查看高通kernel用哪个dsti
- 移动硬盘在Mac上无法拷贝或删除文件的解决办法
- c#窗体编辑个人简历_3年工作经验.net程序员简历应该怎么写
- PMI-ACP敏捷项目认证练习题(一)
- 百度大数据+零售发挥引擎优势 ------BDL ,大数据+亚当科茨领导的人工智能实验室和由张潼领导的大数据实验室
- 维度表,实体表,事实表之间的关系
热门文章
- 3.1栈和队列——顺序栈基本操作的实现
- 作一份高水准的英文简历
- 树链剖分(四)——旅行
- 解决CMake Error: The source directory “*“ does not appear to contain CMakeLists.txt.
- pytorch安装错误
- 2022年十一届认证杯(小美赛)C题思路新鲜出炉
- python解非线性方程组_python scipy求解非线性方程的方法(fsolve/root)
- HK1Box,在armbian上基于docker安装宝塔
- UI设计培训费用多少钱?贵不贵?
- 做人要低调,别把自己太当回事