Oracle SecureFile的功能第1/4页

securefile功能是oracle 11g中对大对象(lob)存储格式的完全重新设计实现,原来的lob存储格式现在通称为basixfile,它仍然是默认的存储方法,但是securfile关键字开启了新的存储方法,它允许加密、利用压缩节约空间和数据重复消除。

  初始化参数

  securefile功能在初始化参数compatible设置我11.0.0.0.0或更高时可用。

  db_securefile初始化参数控制数据库对lob存储格式的默认行为,允许的值有:

  ◆always – 在assm表空间中的所有lob对象以securefile lob的格式创建,在非assm表空间中的所有lob对象以basicfile lob的格式创建(除非明确地指出要以securefile格式创建),在没有指定选项的情况下,basicfile存储格式选项被忽略,securefile默认存储格式选项被使用。

  ◆ force – 所有lob对象都以securefile lob格式创建,如果是在一个非assm表空间中创建lob,会出现错误,在没有指定选项的情况下,basicfile存储格式选项被忽略,securefile默认存储格式选项被使用。

  ◆permitted – 默认设置,当使用了securefile关键字时它允许securefile lob存储格式,默认存储方法是basicfile。

  ◆never – 不允许创建securefile lob对象。

  ◆ignore – 防止创建securefile lob,使用securefile存储选项时忽略所有错误。

  这个参数是动态的,因此它可以使用alter system命令设置。


  sql> alter system set db_securefile = ‘force’;
  system altered.
  sql> alter system set db_securefile = ‘permitted’;
  system altered.
  sql>

  下面的例子假设db_securefile初始化参数设置为默认值permitted。

  创建securefile lob

  基础

  securefile lob通过在lob存储子句后添加securefile关键字来创建,下面的代码显示创建了两个表,第一个使用的是原来的存储格式,第二个使用的是securefile存储格式。


  create table bf_tab (
  id number,
  clob_data clob
  )
  lob(clob_data) store as basicfile;
  insert into bf_tab values (1, ‘my clob data‘);
  commit;
  create table sf_tab (
  id number,
  clob_data clob
  )
  lob(clob_data) store as securefile;
  insert into sf_tab values (1, ‘my clob data’);
  commit;

lob重复消除

  securefile的deduplicate选项允许在表或分区一级上的一个lob内消除重复数据,正如你预料的那样,这个技术与预防重写导致系统开销增大,keep_duplicate选项明确地阻止重复消除,下面的例子对比了普通的securefile和重复消除securefile的空间使用情况。


  create table keep_duplicates_tab (
  id number,
  clob_data clob
  )
  lob(clob_data) store as securefile keepdup_lob(
  keep_duplicates
  );
  create table deduplicate_tab (
  id number,
  clob_data clob
  )
  lob(clob_data) store as securefile dedup_lob (
  deduplicate
  );
  declare
  l_clob clob := rpad(‘x’, 10000, ‘x’);
  begin
  for i in 1 .. 1000 loop
  insert into keep_duplicates_tab values (i, l_clob);
  end loop;
  commit;
  for i in 1 .. 1000 loop
  insert into deduplicate_tab values (i, l_clob);
  end loop;
  commit;
  end;
  /
  exec dbms_stats.gather_table_stats(user, ‘keep_duplicates_tab’);
  exec dbms_stats.gather_table_stats(user, ‘deduplicate_tab’);
  column segment_name format a30
  select segment_name, bytes
  from user_segments
  where segment_name in (‘keepdup_lob’, ‘dedup_lob’);
  segment_name bytes
  —————————— ———-
  dedup_lob 262144
  keepdup_lob 19267584
  2 rows selected.
  sql>

  注意重复消除段要小很多,空间节约依赖于lob段内的重复程度,重复模式可以使用alter table命令进行重新设置。

1

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐