LOB-part3-securefile

从Oracle 11gR1开始,oracle公司引入了SecureFiles,一个新的LOB存储架构,SecureFiles LOB只能在ASSM表空间下进行创建。在12c之前,在执行create table的语句中如果没有为LOB指定SECUREFILE关键字,默认是采用BASICFILE storage的,从12c开始,oracle将SECUREFILE作为CREATE TABLE默认的storage选项。DBA可以在11g的数据库版本在pfile中指定db_securefile初始化参数来覆盖默认的设置。

我们来查看一下在11.2.0.4和12.1.0.2下db_securefile参数的设置情况。

11.2.0.4
SQL> select name, value from v$parameter where  name = 'db_securefile';

NAME            VALUE
--------------- ---------------
db_securefile   PERMITTED

12.1.0.2 pdb
SQL> select name, value from v$parameter where  name = 'db_securefile';

NAME            VALUE
--------------- ---------------
db_securefile   PREFERRED

可以看到,12c下已经变成默认的选项,在进行11g升级到12c的版本中,我们需要关注这个特性,并比较一下自己对LOB的使用情况和可能发生的潜在问题,这也是DBA需要不断的学习新知识避免潜在的坑在升级完成后发发现。

Oracle建议在CREATE TABLE语句创建表的时候的时候就开启compression/deduplication或者encryption,因为如果在创建之后使用ALTER语句开启这些特性的时候,所有的SECUREFILE LOB数据是被读、修改和写的,这将造成数据库在操作的时间内需要锁表,shrink选项不支持securefile lob。
接下来对上述的三个特性进行介绍。
关于Compression
SecureFiles Intelligent Compression在Oracle高级压缩选项上可用,可以无缝分析SecureFiles LOB数据并且压缩保存在磁盘上,但是需要注意的是高级压缩这个特性是需要lisence授权的。
压缩的等级可以等位LOW、MEDIUM和HIGH三种,默认是MEDIUM等级。下面演示一下各个压缩等级下的语法

SQL> create table securefile_t_low(id number,desciption clob)
  2  lob(desciption) store as securefile(
  3  compress low
  4  cache
  5  nologging)
  6  tablespace lob_test;

Table created.

SQL>
SQL> create table securefile_t_medium(id number,desciption clob)
  2  lob(desciption) store as securefile(
  3  compress
  4  cache
  5  nologging)
  6  tablespace lob_test;

Table created.

SQL>
SQL> create table securefile_t_high(id number,desciption clob)
  2  lob(desciption) store as securefile(
  3  compress high
  4  cache
  5  nologging)
  6  tablespace lob_test;

Table created.

SQL>
SQL> create table securefile_t_noncompress(id number,desciption clob)
  2  lob(desciption) store as securefile(
  3  nocompress
  4  cache
  5  nologging)
  6  tablespace lob_test;

Table created.

SQL> select table_name,segment_name,chunk,compression From user_lobs ;

TABLE_NAME                     SEGMENT_NAME                        CHUNK COMPRESSION
------------------------------ ------------------------------ ---------- ------------------
SECUREFILE_T_LOW                SYS_LOB0000134680C00002$$            8192 LOW
SECUREFILE_T_MEDIUM             SYS_LOB0000134683C00002$$            8192 MEDIUM
SECUREFILE_T_HIGH                SYS_LOB0000134686C00002$$            8192 HIGH
SECUREFILE_T_NONCOMPRESS       SYS_LOB0000134689C00002$$            8192 NO

关于decuplication
SecureFiles Intelligent Deduplication在Oracle高级压缩选项上可用,让Oracle数据库可以自动的删除重复的LOB数据,包括LOB列或者分区,通过只保存一份数据来达到节省空间的目的。需要注意的是Oracle的stream是不支持这个特性的,这个特性也只能应用在SecureFiles LOB上。
相同的LOBs是去重的首选目标,在开启了deduplication后copy操作可以避免数据重复,重复数据监测是发生在LOB段内,所以对于分区表和子分区,LOB列的重复监测是无法扩区或者子分区的,deduplication可以在分区级别进行制定,参数lob_storage_clause可以完成这个需求。另外, Oracle提供了DBMS_LOB.SETOPTIONS来帮助开启和关闭单独或者某个LOBs的deduplication特性。

SQL> --enable deduplication
SQL> create table securefile_t1(id number,desciption clob)
  2  lob(desciption) store as securefile(
  3  deduplicate
  4  cache)
  5  tablespace lob_test;

Table created.

SQL>
SQL>
SQL> --disable decuplication
SQL> create table securefile_t2(id number,desciption clob)
  2  lob(desciption) store as securefile(
  3  keep_duplicates
  4  cache)
  5  tablespace lob_test;

Table created.

SQL> select table_name,column_name, deduplication From user_lobs where table_name in ('SECUREFILE_T1','SECUREFILE_T2');

TABLE_NAME                     COLUMN_NAME                    DEDUPLICATION
------------------------------ ------------------------------ ---------------------------------------------
SECUREFILE_T1                  DESCIPTION                     LOB
SECUREFILE_T2                  DESCIPTION                     NO

对2表进行数据初始化看下开启和不开启deduplication模式下的存储使用情况

declare
  l_description clob := rpad('a', 10000, 'a');
begin
  for i IN 1 .. 100000 loop
    insert into SECUREFILE_T1 values (i, l_description);
  end loop;
  commit;
  for i IN 1 .. 100000 loop
    insert into SECUREFILE_T2 values (i, l_description);
  end loop;
  commit;
end;
/

SQL>  select segment_name,bytes,blocks from user_segments where segment_name = 'SECUREFILE_T1' or segment_name = 'SECUREFILE_T2';

SEGMENT_NAME                        BYTES     BLOCKS
------------------------------ ---------- ----------
SECUREFILE_T1                    10485760       1280
SECUREFILE_T2                     6291456        768

关于Encryption
SecureFiles Intelligent Encryption在Oracle高级压缩选项上可用,推出一种对于LOB的新的加密能力,数据可以使用Transparent Data Encryption (TDE)进行加密,这个特性让数据存储起来更安全并且支持随机读写。Encryption是在块级别进行的,加密算法的种类是通过参数encrypt_algorithm来指定的,有效的算法包括AES192 (default), 3DES168, AES128, and AES256.如果指定了PASSWORD,那么列的加密key都是从password来继承;在分区表中,LOB列在所有的分区中都是加密的。传统的imp和exp或者表空间传输技术不支持TDE,需要使用数据泵来完成。
创建和使用TDE请查看oracle官方手册关于Using Oracle Wallet Manager部分。

--create securefile lob with AES128 algorithm
create table encryption_t1(id number,desciption clob encrypt using 'AES128')
lob(desciption) store as securefile(
cache)
tablespace lob_test;


--create securefile lob with a password key
create table encryption_t1(id number,desciption clob encrypt identified by blue)
lob(desciption) store as securefile(
cache)
tablespace lob_test;
此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s