ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE11GR1 中的SecureFiles

ORACLE11GR1 中的SecureFiles

原创 Linux操作系统 作者:guoge 时间:2008-12-26 10:29:13 0 删除 编辑
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 的安装可参考 Transparent Data Encryption (TDE) Tablespace Encryption,
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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: ORACLE 压缩
请登录后发表评论 登录
全部评论

注册时间:2007-12-12

  • 博文量
    72
  • 访问量
    220459