認識Oracle DBFS檔案系統

Jet_Zhang發表於2015-05-26

什麼是DBFS

DBFS,全稱為Oracle Database Filesystem,這是一個類似於NFS的可共享的網路檔案系統,不同之處在於DBFS將檔案以SecureFiles LOBs的形式儲存在資料庫中。


1-DBFS結構

相比較NFSDBFS有諸多優點:

ü  除了可以使用標準的POSIX介面來訪問、操作檔案系統外,還支援PL/SQLJavaOCI等方式方便的訪問、操作檔案系統;

ü  可以使用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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章