ORACLE11GR1 中的SecureFiles

guoge發表於2008-12-26
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 本文是結合SecureFiles in Oracle 11g Database Release 1(http://www.oracle-base.com/articles/11g/SecureFiles_11gR1.php)SecureFiles: The New LOBs (http://www.oracle.com/technology/pub/articles/oracle-database-11g-top-features/11g-securefiles.html)的筆記

SecureFilesOracle 11g中是用來替代large object (LOB),原來的LOB仍然存在,只是用SECUREFILE關鍵字來說明,SECUREFILE關鍵字以來表示一種新的儲存方式,它允許加密,空間壓縮和刪除重複資料。

初始化引數

 SecureFile 功能可用要求COMPATIBLE 引數設為 11.0.0.0.0或者更高.

DB_SECUREFILE 初始化引數控制預設的資料庫關於LOB儲存的行為,允許的值包括:

  • ALWAYS所有在ASSM 表空間的LOB都建立成 SecureFile LOB.在非 ASSM 表空間的LOB建立成 BasicFile LOB除非顯示說明為SecureFiles. BasicFile 儲存選項被忽略,如果未指明,SecureFile 作為預設儲存選項。
  • FORCE所有的 LOB被建立成 SecureFile LOB. 如果 LOB 建立在非ASSM表空間, 則會丟擲一個錯誤。 BasicFile 儲存選項被忽略,如果未指明,SecureFile 作為預設儲存選項。
  • PERMITTED預設值, 當指定SECUREFILE 關鍵字時,建立為SecureFile LOB ,預設儲存方法是BASICFILE
  • NEVER不允許建立成SecureFile LOBs
  • IGNORE不允許建立成 SecureFile LOB, 如果有因為SecureFile 儲存選項的錯誤都會被忽略。
  • 引數是動態的,因此可以在ALTER SYSTEM 命令中使用.
SQL> ALTER SYSTEM SET db_securefile = 'FORCE';
 
System altered.
 
SQL>  ALTER SYSTEM SET db_securefile = 'PERMITTED';
 
System altered.
 
 

下面的例子假設DB_SECUREFILE 初始化引數值為預設的PERMITTED

建立SecureFile LOBs

基礎

透過為LOB儲存指定SECUREFILE關鍵字來建立 SecureFile LOB。第一個表是傳統型別,第二個是SecureFile型別。

create table contracts_basic

(

        contract_id     number(12),

        contract_name   varchar2(80),

        file_size       number,

        orig_file       blob

)

tablespace users

lob (orig_file)

(

        tablespace users

        enable storage in row

        chunk 4096

        pctversion 20

        nocache

        nologging

);

 

 

create table contracts_sec

(

        contract_id     number(12),

        contract_name   varchar2(80),

        file_size       number,

        orig_file       blob

)

tablespace users

lob (orig_file)

store as securefile

(

        tablespace users

        enable storage in row

        chunk 4096

        pctversion 20

        nocache

        nologging

)

/

 

使用下面的過程裝載資料,假設SECFILE 目錄下有一個contract.pdf 檔案

SQL> create directory secfile as '/opt/oracle/';

 

Directory created.

SQL> host ls /opt/oracle/con*.pdf

/opt/oracle/contract.pdf

 

declare

    l_size      number;

    l_file_ptr  bfile;

    l_blob      blob;

begin

    l_file_ptr := bfilename('SECFILE', 'contract.pdf');

    dbms_lob.fileopen(l_file_ptr);

    l_size := dbms_lob.getlength(l_file_ptr);

    for ctr in 1 .. 100 loop

        insert into contracts_sec

        (

            contract_id,

            contract_name,

            file_size,

            orig_file

        )

        values

        (

            ctr,

            'Contract '||ctr,

            null,

            empty_blob()

        )

        returning orig_file into l_blob;

        dbms_lob.loadfromfile(l_blob, l_file_ptr, l_size);

    end loop;

    commit;

    dbms_lob.close(l_file_ptr);

end;

/

 

LOB 刪除重複資料

 SecureFiles DEDUPLICATE選項允許在LOB的表或者分割槽級刪除重複的入口。這個過程允許防止過度重複。而 KEEP_DUPLICATES 選項顯示的避免刪除重複。可以使用Alter table 語句修改該選項,例如:

SQL> alter table contracts_sec

  2  modify lob(orig_file)

  3  (deduplicate)

  4  /

 

使用下面的過程可以檢視所佔用的空間:

declare

    l_segment_name          varchar2(30);

    l_segment_size_blocks   number;

    l_segment_size_bytes    number;

    l_used_blocks           number;

    l_used_bytes            number;

    l_expired_blocks        number;

    l_expired_bytes         number;

    l_unexpired_blocks      number;

    l_unexpired_bytes       number;

 

begin

    select segment_name

    into l_segment_name

    from dba_lobs

    where table_name = 'CONTRACTS_SEC';

        dbms_output.put_line('Segment Name=' || l_segment_name);

 

    dbms_space.space_usage(

        segment_owner           =>USER,

        segment_name            => l_segment_name,

        segment_type            => 'LOB',

        partition_name          => NULL,

        segment_size_blocks     => l_segment_size_blocks,

        segment_size_bytes      => l_segment_size_bytes,

        used_blocks             => l_used_blocks,

        used_bytes              => l_used_bytes,

        expired_blocks          => l_expired_blocks,

        expired_bytes           => l_expired_bytes,

        unexpired_blocks        => l_unexpired_blocks,

        unexpired_bytes         => l_unexpired_bytes

    );

 

 

    dbms_output.put_line('segment_size_blocks       => '||  l_segment_size_blocks);

    dbms_output.put_line('segment_size_bytes        => '||  l_segment_size_bytes);

    dbms_output.put_line('used_blocks               => '||  l_used_blocks);

    dbms_output.put_line('used_bytes                => '||  l_used_bytes);

    dbms_output.put_line('expired_blocks            => '||  l_expired_blocks);

    dbms_output.put_line('expired_bytes             => '||  l_expired_bytes);

    dbms_output.put_line('unexpired_blocks          => '||  l_unexpired_blocks);

    dbms_output.put_line('unexpired_bytes           => '||  l_unexpired_bytes);

end;

/

 

對於keep_duplicates LOB

Segment Name=SYS_LOB0000069919C00004$$

segment_size_blocks       => 10272

segment_size_bytes        => 84148224

used_blocks               => 2101

used_bytes                => 17211392

expired_blocks            => 5888

expired_bytes             => 48234496

unexpired_blocks          => 2247

unexpired_bytes           => 18407424

 

對於deduplicateLOB

Segment Name=SYS_LOB0000069919C00004$$

segment_size_blocks       => 10272

segment_size_bytes        => 84148224

used_blocks               => 22

used_bytes                => 180224

expired_blocks            => 3712

expired_bytes             => 30408704

unexpired_blocks          => 6502

unexpired_bytes           => 53264384

 

主要是比較used_bytes 值,可以看出deduplicate後,LOB所佔用空間大大減少。具體能減少多少,還是看重複率。

LOB 壓縮

SecureFiles COMPRESS 選項能夠在表或者分割槽級壓縮 LOB內容 。壓縮程度使用 MEDIUM或者 HIGH 關鍵字來說明。如果未指明壓縮程度,則指MEDIUM。壓縮會帶來效能上的影響。LOB上的壓縮不影響表的影響,反之亦然。下面的例子裡說明了壓縮後的空間使用情況。

 

SQL> alter table contracts_sec

 modify lob(orig_file)

 (keep_duplicates nocompress );

 

Table altered.

 

繼續使用前面的過程顯示空間使用情況:

Segment Name=SYS_LOB0000069919C00004$$

segment_size_blocks       => 11296

segment_size_bytes        => 92536832

used_blocks               => 2101

used_bytes                => 17211392

expired_blocks            => 1023

expired_bytes             => 8380416

unexpired_blocks          => 8135

unexpired_bytes           => 66641920

 

SQL> alter table contracts_sec

 modify lob(orig_file)

 ( compress HIGH);

 

 

Table altered.

Segment Name=SYS_LOB0000069922C00004$$

segment_size_blocks       => 11680

segment_size_bytes        => 95682560

used_blocks               => 2101

used_bytes                => 17211392

expired_blocks            => 3840

expired_bytes             => 31457280

unexpired_blocks          => 5699

unexpired_bytes           => 46686208

 

好像沒什麼效果,大概可能和我這個PDF檔案本身就是壓縮有關。

LOB 加密

SecureFile LOB的加密依賴於walle或者Hardware Security Model (HSM)來持有金鑰。wallet setup 的安裝可參考 ,
SecureFiles
ENCRYPT 選項可以完LOB內容在塊級的加密。USING 子句定義了使用哪種加密演算法(3DES168, AES128, AES192, or AES256), 預設是 'AES192'. 對於SecureFile 壓縮,NO SALT選項不可用。具體不做詳細介紹。

LOB Cache and Logging

Basicfile SecureFile LOBs共享一些基本的 caching logging 選項. 常見的caching 選項有:

  • CACHE – LOB資料放在 buffer cache.
  • CACHE READS - LOB 資料只有當在讀的時候才放在buffer cache ,寫操作不放。NOCACHE

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9036/viewspace-521316/,如需轉載,請註明出處,否則將追究法律責任。

相關文章