什么是 DBFS
DBFS,全称为Oracle DatabaseFilesystem,这是一个类似于NFS的可共享的网络文件系统,不同之处在于DBFS将文件以SecureFilesLOBs的形式存储在数据库中。
相比较NFS,DBFS有诸多优点:
ü 除了可以使用标准的POSIX接口来访问、操作文件系统外,还支持PL/SQL、Java、OCI等方式方便的访问、操作文件系统;
ü 可以使用RMAN方便的将文件系统备份到磁带库或者云存储(目前只支持AmazonS3);
ü 可以使用DataGuard方便的使文件系统做到高可用;
DBFS 的安装
同NFS一样,DBFS也分为服务端和客户端。为方便起见,实验环境服务端和客户端为同一台机器,操作系统为OracleLinux 6.5,数据库为11.2.0.4,数据存储使用ASM。
1 、服务端的安装
首要条件是要有一个正常运行的Oracle数据库。需要先创建一个表空间用于DBFS的存储:
SQL> CREATE TABLESPACE DBFS_TEST_TBS DATAFILE '+DATA01'>
Tablespace created.
创建一个DBFS的用户,并赋予相应的权限:
SQL> CREATE USER DBFS_TEST>
User created.
SQL> GRANT CREATE SESSION,RESOURCE,CREATE TABLE,CREATE PROCEDURE,DBFS_ROLE TO DBFS_TEST;
Grant succeeded.
以DBFS用户,这里为DBFS_TEST登录数据库,并创建DBFS文件系统:
SQL> conn DBFS_TEST/DBFS_TEST
Connected.
SQL> @?/rdbms/admin/dbfs_create_filesystem.sql DBFS_TEST_TBS DBFS_TEST_FS
No errors.
--------
CREATE STORE:
begin dbms_dbfs_sfs.createFilesystem(store_name => 'FS_DBFS_TEST_FS', tbl_name
=> 'T_DBFS_TEST_FS', tbl_tbs => 'DBFS_TEST_TBS', lob_tbs => 'DBFS_TEST_TBS',
do_partition => false, partition_key => 1, do_compress => false, compression =>
'', do_dedup => false, do_encrypt => false); end;
--------
REGISTER STORE:
begin dbms_dbfs_content.registerStore(store_name=> 'FS_DBFS_TEST_FS',
provider_name => 'sample1', provider_package => 'dbms_dbfs_sfs'); end;
--------
MOUNT STORE:
begin dbms_dbfs_content.mountStore(store_name=>'FS_DBFS_TEST_FS',
store_mount=>'DBFS_TEST_FS'); end;
--------
CHMOD STORE:
declare m integer; begin m := dbms_fuse.fs_chmod('/DBFS_TEST_FS', 16895); end;
No errors.
使用dbfs_create_filesystem.sql来创建文件系统 (也可以使用dbfs_create_filesystem_advanced.sql来创建文件系统,该脚本可以提供更多的控制选项,如加密等,有兴趣的可以自己研究下^_^)。DBFS_TEST_TBS为我们 之前创建的表空间的名称,DBFS_TEST_FS为创建的文件系统的名称(自己指定)。这样服务端就完成了。
2、客户端挂载
首先需要安装Oracle Database Client,Client的安装这里不再多讲。除了Client,还需要安装几个系统包kernel-devel、fuse、fuse-libs:
# yum install kernel-devel
# yum install fuse fuse-libs
配置库路径:
# echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf
# cd /usr/local/lib # export ORACLE_HOME=/u01/app/oracle/product/database/11.2.0/db_1
# ln -s $ORACLE_HOME/lib/libclntsh.so.11.1
# ln -s $ORACLE_HOME/lib/libnnz11.so
# ln -s /lib64/libfuse.so //不同的操作系统下,fuse-lib的路径可能会不一样
#
# ldconfig
建立挂载点:
# mkdir /dbfs_test_fs
# chown oracle:oinstall /dbfs_test_fs
在tnsnames中加入数据库的连接串:
$ cat >> tnsnames.ora
DBFS_TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = DBFS_TEST)(SERVER = DEDICATED)
)
)
$ tnsping DBFS_TEST
TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 26-MAY-2015 12:44:39
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = DBFS_TEST)(SERVER = DEDICATED)))
OK (10 msec)
挂载DBFS:
$ $ORACLE_HOME/bin/dbfs_client DBFS_TEST@DBFS_TEST /dbfs_test_fs
Password:
另开一个命令窗口,可以看到系统中已经挂载了一个新的文件系统,然后我们尝试创建一个文件:
$ df -h
Filesystem >
/dev/mapper/vg_ogg-lv_sys 20G 15G 4.1G 78% /
tmpfs 499M 287M 212M 58% /dev/shm
/dev/sda1 477M 50M 403M 11% /boot
/dev/mapper/vg_ogg-lv_data 18G 44M 17G 1% /data
dbfs-DBFS_TEST@DBFS_TEST:/ 1023M 120K 1023M 1% /dbfs_test_fs
$ cd /dbfs_test_fs/DBFS_TEST_FS
$ cat > test
fsdfad
^C
$ ls -ltr
total 1
-rw-r--r--. 1 oracle oinstall 7 May 26 12:50 test
$ cat test
fsdfad
操作和本地文件系统一样。而在数据库中,会有相应的表来记录文件:
> desc DBFS_TEST. T_DBFS_TEST_FS
Name Null ? Type
----------------------------------------------------------------------------------------- -------- ------------------------------------------------------------
VOLID NOT NULL NUMBER
CSNAP# NOT NULL NUMBER
LSNAP# NUMBER
PATHNAME NOT NULL VARCHAR2 ( 1024)
ITEM NOT NULL VARCHAR2 ( 256)
PATHTYPE NOT NULL NUMBER ( 38)
FILEDATA BLOB
POSIX_NLINK NUMBER ( 38)
POSIX_MODE NUMBER ( 38)
POSIX_UID NUMBER ( 38)
POSIX_GID NUMBER ( 38)
STD_ACCESS_TIME NOT NULL TIMESTAMP( 6)
STD_ACL VARCHAR2 ( 1024)
STD_CHANGE_TIME NOT NULL TIMESTAMP( 6)
STD_CONTENT_TYPE VARCHAR2 ( 1024)
STD_CREATION_TIME NOT NULL TIMESTAMP( 6)
STD_DELETED NOT NULL NUMBER ( 38)
STD_GUID NOT NULL NUMBER ( 38)
STD_MODIFICATION_TIME NOT NULL TIMESTAMP( 6)
STD_OWNER VARCHAR2 ( 32)
STD_PARENT_GUID NOT NULL NUMBER ( 38)
STD_REFERENT VARCHAR2 ( 1024)
OPT_HASH_TYPE VARCHAR2 ( 32)
OPT_HASH_VALUE VARCHAR2 ( 128)
OPT_LOCK_COUNT NUMBER ( 38)
OPT_LOCK_DATA VARCHAR2 ( 128)
OPT_LOCK_STATUS NUMBER ( 38)
> SELECT VOLID, PATHNAME, ITEM FROM DBFS_TEST. T_DBFS_TEST_FS;
VOLID PATHNAME ITEM
---------- ------------------------------------------------------------ ------------------------------------------------------------
0 / test test
0 / ROOT
0 / . sfs . sfs
0 / . sfs/ attributes attributes
0 / . sfs/ tools tools
0 / . sfs/ snapshots snapshots
0 / . sfs/ RECYCLE RECYCLE
0 / . sfs/ content content
其中test是我们之前创建的一个测试文件,我们可以很方便的从数据库表中读出文件系统的内容。
需要注意的是执行挂载操作的的窗口不能关闭,挂载操作也不能CTRL+C结束,否则挂载点也就断开了。所以这种方式只适合临时使用,我们可以使用nohup将挂载放在后台,这样就能保证文件系统能一直正常使用了:
$ nohup $ORACLE_HOME/bin/dbfs_client DBFS_TEST@DBFS_TEST /dbfs_test_fs
[1] 4789
dbfs_test_password的内容是DBFS_TEST账号的密码:
$ cat dbfs_test_password
DBFS_TEST
这种方式不是很安全,容易导致密码泄露,所以如果要更安全的方式可以使用wallet。同时DBFS还支持fstab,可以将挂载操作加到fstab中,以实现启动时自动挂载。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com