认识Oracle DBFS文件系统

什么是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的存储:

  1. SQL> CREATE TABLESPACE DBFS_TEST_TBS DATAFILE '+DATA01' SIZE 1G;
  2. Tablespace created.
创建一个DBFS的用户,并赋予相应的权限:


  1. SQL> CREATE USER DBFS_TEST IDENTIFIED BY DBFS_TEST DEFAULT TABLESPACE DBFS_TEST_TBS QUOTA UNLIMITED ON DBFS_TEST_TBS;
  2. User created.
  3. SQL> GRANT CREATE SESSION,RESOURCE,CREATE TABLE,CREATE PROCEDURE,DBFS_ROLE TO DBFS_TEST;
  4. Grant succeeded.
以DBFS用户,这里为DBFS_TEST登录数据库,并创建DBFS文件系统:
  1. SQL> conn DBFS_TEST/DBFS_TEST
  2. Connected.
  3. SQL> @?/rdbms/admin/dbfs_create_filesystem.sql DBFS_TEST_TBS DBFS_TEST_FS
  4. No errors.
  5. --------
  6. CREATE STORE:
  7. begin dbms_dbfs_sfs.createFilesystem(store_name => 'FS_DBFS_TEST_FS', tbl_name
  8. => 'T_DBFS_TEST_FS', tbl_tbs => 'DBFS_TEST_TBS', lob_tbs => 'DBFS_TEST_TBS',
  9. do_partition => false, partition_key => 1, do_compress => false, compression =>
  10. '', do_dedup => false, do_encrypt => false); end;
  11. --------
  12. REGISTER STORE:
  13. begin dbms_dbfs_content.registerStore(store_name=> 'FS_DBFS_TEST_FS',
  14. provider_name => 'sample1', provider_package => 'dbms_dbfs_sfs'); end;
  15. --------
  16. MOUNT STORE:
  17. begin dbms_dbfs_content.mountStore(store_name=>'FS_DBFS_TEST_FS',
  18. store_mount=>'DBFS_TEST_FS'); end;
  19. --------
  20. CHMOD STORE:
  21. declare m integer; begin m := dbms_fuse.fs_chmod('/DBFS_TEST_FS', 16895); end;
  22. 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:

  1. # yum install kernel-devel
  2. # yum install fuse fuse-libs
配置库路径:
  1. # echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf
  2. # 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的路径可能会不一样
  3. #
  4. # ldconfig

建立挂载点:

  1. # mkdir /dbfs_test_fs
  2. # chown oracle:oinstall /dbfs_test_fs
在tnsnames中加入数据库的连接串:
  1. $ cat >> tnsnames.ora
  2. DBFS_TEST =
  3. (DESCRIPTION =
  4. (ADDRESS_LIST =
  5. (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  6. )
  7. (CONNECT_DATA =
  8. (SERVICE_NAME = DBFS_TEST)(SERVER = DEDICATED)
  9. )
  10. )
 $ 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:
  1. $ $ORACLE_HOME/bin/dbfs_client DBFS_TEST@DBFS_TEST /dbfs_test_fs
  2. Password:
另开一个命令窗口,可以看到系统中已经挂载了一个新的文件系统,然后我们尝试创建一个文件:
  1. $ df -h
  2. Filesystem Size Used Avail Use% Mounted on
  3. /dev/mapper/vg_ogg-lv_sys 20G 15G 4.1G 78% /
  4. tmpfs 499M 287M 212M 58% /dev/shm
  5. /dev/sda1 477M 50M 403M 11% /boot
  6. /dev/mapper/vg_ogg-lv_data 18G 44M 17G 1% /data
  7. dbfs-DBFS_TEST@DBFS_TEST:/ 1023M 120K 1023M 1% /dbfs_test_fs
  8. $ cd /dbfs_test_fs/DBFS_TEST_FS
  9. $ cat > test
  10. fsdfad
  11. ^C
  12. $ ls -ltr
  13. total 1
  14. -rw-r--r--. 1 oracle oinstall 7 May 26 12:50 test
  15. $ cat test
  16. fsdfad
操作和本地文件系统一样。 而在数据库中,会有相应的表来记录文件:
  1. > desc DBFS_TEST.T_DBFS_TEST_FS
  2.  Name Null? Type
  3.  ----------------------------------------------------------------------------------------- -------- ------------------------------------------------------------
  4.  VOLID NOT NULL NUMBER
  5.  CSNAP# NOT NULL NUMBER
  6.  LSNAP# NUMBER
  7.  PATHNAME NOT NULL VARCHAR2(1024)
  8.  ITEM NOT NULL VARCHAR2(256)
  9.  PATHTYPE NOT NULL NUMBER(38)
  10.  FILEDATA BLOB
  11.  POSIX_NLINK NUMBER(38)
  12.  POSIX_MODE NUMBER(38)
  13.  POSIX_UID NUMBER(38)
  14.  POSIX_GID NUMBER(38)
  15.  STD_ACCESS_TIME NOT NULL TIMESTAMP(6)
  16.  STD_ACL VARCHAR2(1024)
  17.  STD_CHANGE_TIME NOT NULL TIMESTAMP(6)
  18.  STD_CONTENT_TYPE VARCHAR2(1024)
  19.  STD_CREATION_TIME NOT NULL TIMESTAMP(6)
  20.  STD_DELETED NOT NULL NUMBER(38)
  21.  STD_GUID NOT NULL NUMBER(38)
  22.  STD_MODIFICATION_TIME NOT NULL TIMESTAMP(6)
  23.  STD_OWNER VARCHAR2(32)
  24.  STD_PARENT_GUID NOT NULL NUMBER(38)
  25.  STD_REFERENT VARCHAR2(1024)
  26.  OPT_HASH_TYPE VARCHAR2(32)
  27.  OPT_HASH_VALUE VARCHAR2(128)
  28.  OPT_LOCK_COUNT NUMBER(38)
  29.  OPT_LOCK_DATA VARCHAR2(128)
  30.  OPT_LOCK_STATUS NUMBER(38)

  31. > SELECT VOLID,PATHNAME,ITEM FROM DBFS_TEST.T_DBFS_TEST_FS;

  32.      VOLID PATHNAME ITEM
  33. ---------- ------------------------------------------------------------ ------------------------------------------------------------
  34.          0 /test test
  35.          0 / ROOT
  36.          0 /.sfs .sfs
  37.          0 /.sfs/attributes attributes
  38.          0 /.sfs/tools tools
  39.          0 /.sfs/snapshots snapshots
  40.          0 /.sfs/RECYCLE RECYCLE
  41.          0 /.sfs/content content
其中test是我们之前创建的一个测试文件,我们可以很方便的从数据库表中读出文件系统的内容。

需要注意的是执行挂载操作的的窗口不能关闭,挂载操作也不能CTRL+C结束,否则挂载点也就断开了。所以这种方式只适合临时使用,我们可以使用nohup将挂载放在后台,这样就能保证文件系统能一直正常使用了:
  1. $ nohup $ORACLE_HOME/bin/dbfs_client DBFS_TEST@DBFS_TEST /dbfs_test_fs < dbfs_test_password &
  2. [1] 4789
dbfs_test_password的内容是DBFS_TEST账号的密码:
  1. $ cat dbfs_test_password
  2. DBFS_TEST
这种方式不是很安全,容易导致密码泄露,所以如果要更安全的方式可以使用wallet。同时DBFS还支持fstab,可以将挂载操作加到fstab中,以实现启动时自动挂载。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13885898/viewspace-1672059/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13885898/viewspace-1672059/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值