暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库SecureFile-LOB段详解及操作过程

Oracle微学堂 2018-01-24
3777
SecureFile功能是oracle 11g中对大对象(LOB)存储格式的完全重新设计实现,原来的LOB存储格式现在通称为BASIXFILE,它仍然是默认的存储方法,但是SECURFILE关键字开启了新的存储方法,它允许加密、利用压缩节约空间和数据重复消除。

1
初始化参数

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

2
创建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;

3
LOB重复消除

SecureFileDEDUPLICATE选项允许在表或分区一级上的一个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 .

  SQL>

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

  ALTER TABLE deduplicate_tab MODIFY LOB(clob_data) (

  KEEP_DUPLICATES

  );

  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 76808192

  KEEPDUP_LOB 68091904

  2 rows selected.

4
LOB压缩

SecureFileCOMPRESS选项在表或分区一级上开启了对LOB内容的压缩,使用关键字MEDIUMHIGH表示压缩的等级,如果没有指定压缩等级,就默认为MEDIUM,对LOB内容进行压缩会增加系统开销,因此使用高等级的压缩可能会对系统性能产生不良影响,SecureFile LOB的压缩功能不影响表压缩,反之亦然,下面的例子对比了使用普通的SecureFile LOB和启用压缩功能的SecureFile LOB的空间利用情况。

CREATE TABLE nocompress_tab (

  id NUMBER,

  clob_data CLOB

  )

  LOB(clob_data) STORE AS SECUREFILE nocompress_lob(

  NOCOMPRESS

  );

  CREATE TABLE compress_tab (

  id NUMBER,

  clob_data CLOB

  )

  LOB(clob_data) STORE AS SECUREFILE compress_lob (

  COMPRESS HIGH

  );

  DECLARE

  l_clob CLOB := RPAD('X', 10000, 'X');

  BEGIN

  FOR i IN 1 .. 1000 LOOP

  INSERT INTO nocompress_tab VALUES (i, l_clob);

  END LOOP;

  COMMIT;

  FOR i IN 1 .. 1000 LOOP

  INSERT INTO compress_tab VALUES (i, l_clob);

  END LOOP;

  COMMIT;

  END;

  /

  EXEC DBMS_STATS.gather_table_stats(USER, 'nocompress_tab');

  EXEC DBMS_STATS.gather_table_stats(USER, 'compress_tab');

  COLUMN segment_name FORMAT A30

  SELECT segment_name, bytes

  FROM user_segments

  WHERE segment_name IN ('COMPRESS_LOB', 'NOCOMPRESS_LOB');

  SEGMENT_NAME BYTES

  ------------------------------ ----------

  COMPRESS_LOB 131072

  NOCOMPRESS_LOB 71565312

  2 rows selected.

  SQL>

我们可以看到压缩的LOB段比没有压缩的LOB段明显要小得多,空间节约的程度依赖于LOB段数据的存储类型。

可以使用ALTER TABLE命令重新设置压缩模式。

  ALTER TABLE compress_tab MODIFY LOB(clob_data) (

  NOCOMPRESS

  );

  EXEC DBMS_STATS.gather_table_stats(USER, 'compress_tab');

  COLUMN segment_name FORMAT A30

  SELECT segment_name, bytes

  FROM user_segments

  WHERE segment_name IN ('COMPRESS_LOB', 'NOCOMPRESS_LOB');

  SEGMENT_NAME BYTES

  ------------------------------ ----------

  COMPRESS_LOB 76808192

  NOCOMPRESS_LOB 71630848

  2 rows selected.

5
LOB加密

SecureFile LOB的加密功能依赖于钱夹或硬件安全模型(HSM)掌管加密密钥,钱夹设置与透明数据加密(TDE)和表空间加密描述的一样,因此在尝试下面的例子前先完成那两个实验。

SecureFileENCRYPT选项执行块级别的LOB内容加密,一个可选的USING子句定义了使用哪种加密算法(3DES168, AES128, AES192, AES256),默认使用AES192算法,NO SALT选项对于SecureFile加密不可用,加密是应用在每一列上的,因此它会影响所有使用LOB的分区,DECRPT选项用于明确地阻止加密,下面的例子显示了使用加密的SecureFile LOB数据类型创建表。

  CREATE TABLE encrypt_tab (

  id NUMBER,

  clob_data CLOB

  )

  LOB(clob_data) STORE AS SECUREFILE encrypt_lob(

  ENCRYPT USING 'AES256'

  );

ALTER TABLE命令可以用于加密或解密现有的列,要切换加密算法你必须使用REKEY选项。 ALTER TABLE encrypt_tab MODIFY (

  clob_data CLOB DECRYPT

  );

  ALTER TABLE encrypt_tab MODIFY (

  clob_data CLOB ENCRYPT USING '3DES168'

  );

  ALTER TABLE encrypt_tab REKEY USING 'AES192';

扫描二维码关注我的微学堂

搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!





文章转载自Oracle微学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论