什么是DBFS
DBFS,全称为Oracle Database
Filesystem,这是一个类似于NFS的可共享的网络文件系统,不同之处在于DBFS将文件以SecureFiles
LOBs的形式存储在数据库中。
图1-DBFS结构
相比较NFS,DBFS有诸多优点:
ü 除了可以使用标准的POSIX接口来访问、操作文件系统外,还支持PL/SQL、Java、OCI等方式方便的访问、操作文件系统;
ü 可以使用RMAN方便的将文件系统备份到磁带库或者云存储(目前只支持Amazon
S3);
ü 可以使用DataGuard方便的使文件系统做到高可用;
DBFS的安装
同NFS一样,DBFS也分为服务端和客户端。为方便起见,实验环境服务端和客户端为同一台机器,操作系统为Oracle
Linux 6.5,数据库为11.2.0.4,数据存储使用ASM。
1、服务端的安装
首要条件是要有一个正常运行的Oracle数据库。需要先创建一个表空间用于DBFS的存储:
-
SQL> CREATE TABLESPACE DBFS_TEST_TBS DATAFILE '+DATA01' SIZE 1G;
-
-
Tablespace created.
创建一个DBFS的用户,并赋予相应的权限:
-
SQL> CREATE USER DBFS_TEST IDENTIFIED BY DBFS_TEST DEFAULT TABLESPACE DBFS_TEST_TBS QUOTA UNLIMITED ON DBFS_TEST_TBS;
-
-
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 Size Used Avail Use% Mounted on
-
/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 < dbfs_test_password &
-
[1] 4789
dbfs_test_password的内容是DBFS_TEST账号的密码:
-
$ cat dbfs_test_password
-
DBFS_TEST
这种方式不是很安全,容易导致密码泄露,所以如果要更安全的方式可以使用wallet。同时DBFS还支持fstab,可以将挂载操作加到fstab中,以实现启动时自动挂载。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13885898/viewspace-1672059/
,如需转载,请注明出处,否则将追究法律责任。