一. Oracle SecureFiles 说明
1.1 现有LOB实施中的问题
在Oracle8i 中,LOB 设计是基于下列假设做出的:
(1) LOB 实例化的大小预计为几个兆字节。
(2) LOB 通常被视为“单写多读”类型的数据。很少进行更新,所以可以为所有类型的更新(大型或小型)对整个块进行版本化。
(3) 预计很少有批处理会流式处理数据。预计不会出现联机事务处理(OLTP) 类型的工作量。
(4) 保留的还原量由用户使用PCTVERSION 和RETENTION 参数进行控制。这是额外的管理工作。
(5) 在假设LOB 大小通常是统一的前提下,CHUNK 大小是一个静态参数。CHUNK 大小的上限是32 KB。
(6) 预计Oracle RAC 中不会出现高并发性的写入。
自首次实施后,业务要求已发生了显著变化。现在LOB 的使用方式与关系数据的相似,用于存储各种大小的半结构化和非结构化数据。数据大小可以从几千字节(用于HTML 链接)到几兆兆字节(用于流视频)不等。
在LOB 中存储所有文件系统数据的Oracle 文件系统会遇到类似OLTP 的高并发性访问。随着Oracle RAC 日益广泛的应用,必须解决OracleRAC 的可扩展性问题。LOB 空间结构的现有设计不能满足这些新要求。
1.2 Oracle SecureFiles 说明
Oracle Database 11g 将LOB 数据类型作为Oracle SecureFiles 进行了完全重新设计,显著改进了应用程序开发的性能、可管理性和易用性。新实施也提供了下一代高级功能,如智能压缩和透明加密。
使用SecureFiles 时,块大小介于Oracle 数据块大小到64MB 之间。Oracle DB 尝试使数据集中在磁盘的相邻物理位置,从而将内部碎片降到最低。通过使用可变的块大小,SecureFiles 避免对不必要的大型LOB 数据块进行版本化。
SecureFiles 还提供了新的客户机/服务器网络层,从而允许在支持更高读写性能的服务器和客户机之间进行高速数据传输。SecureFiles自动确定生成重做和还原的最有效方法,因而不需要用户定义参数。SecureFiles 自动确定是仅为更改生成重做和还原,还是通过生成完整的重做记录创建新版本。
由于SecureFiles 需要维护各种内存中统计信息以帮助有效地分配内存和空间,所以将其设计为可自适应的智能工具。这样,由于减少了很难使用不可预测的负荷进行优化的可优化参数数量,可管理性有所提高。
Oracle SecureFiles 重新设计了非结构化(文件)数据的处理方法,提供了以下全新的设计:
(1) 磁盘格式
a) 可变块大小
(2) 网络协议
a) 改进的输入/输出
(3) 版本化和共享机制
(4) 重做和还原算法
a) 无用户配置
(5) 空间和内存增强功能
1.3 启用SecureFiles 存储
使用DB_SECUREFILE 初始化参数,数据库管理员(DBA) 可确定SecureFiles 的使用情况,其中有效值为:
(1) ALWAYS:尝试将ASSM表空间上的所有LOB 创建为SecureFile LOB,但是仅可将自动段空间管理(ASSM) 表空间外的任何LOB 创建为BasicFile LOB
(2) FORCE:强制将所有LOB 创建为SecureFileLOB
(3) PERMITTED:允许创建SecureFiles(默认值)
(4) NEVER:禁止创建SecureFiles
(5) IGNORE:禁止创建SecureFiles,并忽略使用SecureFiles 选项强制创建BasicFiles 而导致的任何错误
如果指定了NEVER,则任何指定为SecureFiles 的LOB 均被创建为BasicFiles。如果对BasicFiles 使用任何SecureFiles 特定的存储选项和功能(如压缩、加密和取消重复),则会导致异常错误。将对任何未指定的存储选项使用BasicFiles 默认值。
如果指定了ALWAYS,则系统中创建的所有LOB 均会被创建为SecureFiles。必须在ASSM 表空间中创建LOB,否则会发生错误。将忽略所有指定的BasicFiles 存储选项。可以使用ALTER SYSTEM 命令更改所有存储的SecureFiles 默认值。
SQL>Altersystem set db_securefile=’ALWAYS’;
1.4 SecureFiles:高级功能
OracleSecureFiles 实施也提供了下一代高级功能,如智能压缩和透明加密。压缩功能支持显式压缩SecureFiles。SecureFiles 仅为随机读取或写入访问透明解压缩所需的数据块集,从而自动维护未压缩和已压缩的偏移量之间的映射。如果将压缩级别从MEDIUM 更改为HIGH,则映射会自动进行更新以反映新的压缩算法。取消重复可自动检测重复的SecureFile LOB 数据,并通过仅存储一个副本来节省空间- 减少磁盘存储空间、I/O 和重做事件记录。可在表级别或分区级别指定取消重复,但不能跨越分区的LOB。取消重复需要使用高级压缩选项。
现在可以在适当位置存储加密的LOB数据,并对其进行随机读取和写入,因而提高了数据的安全性。只能按列加密SecureFile LOB (与透明数据加密相同)。将使用相同的加密算法对LOB 列中的所有分区进行加密。无法对BasicFiles 数据进行加密。SecureFiles 支持行业标准加密算法:3DES168、AES128、AES192(默认)和AES256。加密是高级安全选项的一部分。
注:必须将COMPATIBLE 初始化参数设置为11.0.0.0.0 或更高,才能使用SecureFiles。在11.1.0.0.0 兼容性下BasicFiles(以前的LOB)格式仍然受支持。设置11.0.0.0.0 后不会出现功能降低。
Oracle SecureFiles 提供了下列高级功能:
(1) 智能LOB 压缩
(2) 取消重复
(3) 透明加密
1.5 SecureFiles:存储选项
MAXSIZE 是新的存储子句,用于控制SecureFiles 的物理存储属性。MAXSIZE 指定与存储子句级别相关的最大段大小。
RETENTION 指定SecureFiles 的以下项:
(1) MAX 在达到段MAXSIZE 后重新使用旧版本。
(2) MIN 在指定的最短时间内保留旧版本。
(3) AUTO 是默认设置,主要对空间和时间进行折中使之达到平衡。这是自动确定的。
(4) NONE 尽可能重用旧版本。
使用ALTER TABLE 语句更改RETENTION 仅影响该语句执行后创建的空间。
对于SecureFiles,不再需要指定CHUNK、PCTVERSION、FREEPOOLS、FREELISTS 和FREELIST GROUPS。为了与现有脚本相兼容,将对这些子句进行分析但不解释它们。
1.6 创建SecureFiles
可使用CREATE TABLE 语句中的存储关键字SECUREFILE 创建带有LOB 列的SecureFiles。早期数据库版本中的LOB 实施现在被称为BasicFiles。将LOB 列添加到表时,可以指定是将其创建为SecureFiles 还是BasicFiles。如果没有指定存储类型,LOB 将创建为BasicFiles以确保向后兼容性。
CREATE TABLE func_spec(
id number, doc CLOBENCRYPT USING 'AES128' )
LOB(doc) STORE ASSECUREFILE
(DEDUPLICATE LOB CACHE NOLOGGING);
上面的SQL,创建了一个名为FUNC_SPEC的表,用于将文档存储为SecureFiles。在该示例中指定不希望存储LOB 的重复内容、读取时将高速缓存LOB,并且对LOB 执行更新时不生成还原。此外,还指定将使用AES128 加密算法对存储在doc 列中的文档进行加密。与DEDUPLICATE 相反,KEEP_DUPLICATES 可用在ALTER语句中。
CREATE TABLE test_spec (
id number, doc CLOB)
LOB(doc) STORE AS SECUREFILE
(COMPRESS HIGH KEEP_DUPLICATES CACHENOLOGGING);
上面的SQL,创建一个名为TEST_SPEC的表,用于将文档存储为SecureFiles。对于此表,可以存储重复内容、LOB 将以压缩格式存储,并且将高速缓存LOB 而不进行记录。HIGH 压缩设置需要进行更多的工作,但可提供更有效的数据压缩。默认压缩是MEDIUM。压缩算法在服务器端实施,允许对LOB 数据进行随机读取和写入,可以通过ALTER 语句对其进行更改。
CREATE TABLE design_spec (id number, docCLOB)
LOB(doc) STORE AS SECUREFILE (ENCRYPT);
CREATE TABLE design_spec (id number,
doc CLOB ENCRYPT)
LOB(doc) STORE AS SECUREFILE;
上面2段代码都结果相同:使用默认的AES192加密创建具有SecureFilesLOB 列的表。
1.7 共享I/O池
为了支持共享内存(与程序全局区(PGA)相对)的大型I/O,OracleDatabase 11g 中新增了共享I/O 池内存组件,用于进行直接路径访问。这种情况仅适用于将SecureFiles 创建为NOCACHE 时(默认)。共享I/O 池默认大小为零,仅当存在SecureFiles NOCACHE 工作量时,系统才会将其大小增加到高速缓存的4%。由于这是共享资源,因此可由大型并发SecureFiles 工作量使用。与其它池(如大型池或共享池)不同,用户进程不会生成ORA-04031错误,但在释放更多共享I/O 池缓冲区之前会临时退回到PGA。
LOB 高速缓存是SecureFiles 体系结构中的新组件,通过收集和批处理数据以及重叠网络和磁盘I/O改进了LOB 访问性能。LOB高速缓存从缓冲区高速缓存(常规缓冲区或共享I/O 池的内存)借用内存。由于从缓冲区高速缓存借用的内存实质上适合于执行数据库I/O,并且适合在I/O 完成后回退到该缓冲区高速缓存,因此可以避免不必要的内存复制。
在多实例Oracle RealApplication Clusters 中,LOB 高速缓存为每个已访问的LOB 保留一个锁定。
1.8 更改SecureFiles
使用DEDUPLICATE 选项,可以指定在LOB 列的两行或多行中相同的LOB 数据共享同一数据块。KEEP_DUPLICATES 与此相反。Oracle使用安全的散列索引检测重复,并且将具有相同内容的LOB 合并到一个副本中,从而降低存储空间并简化存储管理。LOB 关键字是可选的,它可以使语法变得更清楚。
COMPRESS 或NOCOMPRESS 关键字分别启用或禁用LOB 压缩。新的压缩设置会更改LOB 段中的所有LOB。
ENCRYPT 或DECRYPT关键字可使用透明数据加密(TDE) 打开或关闭LOB 加密。新设置会更改LOB 段中的所有LOB。可将LOB 段更改为仅启用或仅禁用LOB 加密。也就是说,ALTER 不能用于更新加密算法或加密密钥。可使用ALTER TABLE REKEY 语法更新加密算法或加密密钥。结合使用其它选项,在块级别执行加密可以提高性能(可能为最小的加密量)。
相关示例:
ALTER TABLE t1
MODIFY LOB(a) ( KEEP_DUPLICATES );
ALTER TABLE t1
MODIFY LOB(a) ( DEDUPLICATE LOB );
ALTER TABLE t1
MODIFY PARTITION p1 LOB(a) ( DEDUPLICATELOB );
ALTER TABLE t1
MODIFY LOB(a) ( NOCOMPRESS );
ALTER TABLE t1
MODIFY LOB(a) (COMPRESS HIGH);
ALTER TABLE t1
MODIFY PARTITION p1 LOB(a) ( COMPRESS HIGH);
ALTER TABLE t1 MODIFY
( a CLOB ENCRYPT USING '3DES168');
ALTER TABLE t1 MODIFY PARTITION p1
( LOB(a) ( ENCRYPT );
ALTER TABLE t1 MODIFY
( a CLOB ENCRYPT IDENTIFIED BY ghYtp);
1.9 访问SecureFiles 元数据
DBMS_LOB 程序包:LOB 继承取消重复、加密和压缩的LOB 列设置,也可使用LOB 定位器API 在每个LOB 级别上进行配置。但是不能使用LONG API 配置这些LOB 设置。
必须为这些功能使用以下DBMS_LOB 程序包附加函数:
(1) DBMS_LOB.GETOPTIONS:可使用此函数获得设置。返回与基于选项类型的预定义常量相对应的整数。
(2) DBMS_LOB.SETOPTIONS:此过程设置功能并允许按LOB 设置这些功能,从而覆盖默认的LOB 设置。这需要往返服务器以使更改变成永久更改。
DBMS_SPACE.SPACE_USAGE:使现有SPACE_USAGE 过程超载,以返回有关LOB 空间使用情况的信息。它返回LOB 段中所有LOB 使用的块中的磁盘空间量。该过程仅可对使用ASSM 创建的表空间使用,并且不将属于BasicFiles 的LOB 块视为已使用的空间。
1.10 迁移到SecureFiles
使用LOB 接口超集,可轻松从BasicFile LOB 进行迁移。迁移到SecureFiles 有两种建议方法:分区交换和联机重新定义。
分区交换:
(1) 需要与表中最大分区相等的额外空间
(2) 可在交换期间维护索引
(3) 可将工作量分散到多个较小的维护窗口
(4) 要求表或分区脱机以执行交换
联机重新定义(建议做法)
(1) 不要求表或分区脱机
(2) 可并行进行
(3) 要求额外存储空间等于整个表,并且所有LOB 段均可用
(4) 要求重建所有全局索引
这些解决方案通常意味着使用输入LOB列中的数据所用磁盘空间两倍的空间。但是,使用分区和按分区执行这些操作有助于降低所需的磁盘空间。
1.11 SecureFiles 监视
为了显示SecureFiles 的使用情况,已对下列视图进行了修改:
(1) *_SEGMENTS
(2) *_LOBS
(3) *_LOB_PARTITIONS
(4) *_PART_LOBS
SQL> SELECT segment_name, segment_type,segment_subtype
2 FROM dba_segments
3 WHERE tablespace_name = 'SECF_TBS2'
4 AND segment_type = 'LOBSEGMENT'
5 /
SEGMENT_NAME SEGMENT_TYPE SEGMENT_SU
---------------------------------------------- ----------
SYS_LOB0000071583C00004$$ LOBSEGMENTSECUREFILE
二.示例
2.1 修改DB_SECUREFILE参数
在1.3 小节提到这个参数,用来控制SecureFiles的使用。具体可设的参数参考1.3节。
启用SecureFile功能,数据的compatible 参数必须大于11.0.0.0. db_SecureFile 参数是个动态参数,我们可以直接修改,而不用重启实例。
[oracle@dave admin]$ ora paramdb_securefile
Session altered.
NAME ISDEFAULT SESMO SYSMOD VALUE
---------------- --------- ----- -------------------------------------------------
db_securefile TRUE TRUE IMMEDIATEPERMITTED
[oracle@dave admin]$ ora param compatible
Session altered.
NAME ISDEFAULT SESMO SYSMOD VALUE
--------------- --------- ----- -------------------------------------------------
compatible FALSE FALSE FALSE 11.2.0.0.0
SQL> alter system setdb_securefile='FORCE';
System altered.
SQL> !ora param db_securefile
Session altered.
NAME ISDEFAULT SESMO SYSMOD VALUE
------------------ --------- -------------- -------------
db_securefile TRUE TRUE IMMEDIATE FORCE
SQL> alter system setdb_securefile='PERMITTED';
System altered.
SQL> !ora param db_securefile
Session altered.
NAME ISDEFAULT SESMO SYSMOD VALUE
------------------ --------- -------------- --------------
db_securefile TRUE TRUE IMMEDIATE PERMITTED
2.2 创建 SecureFile LOBs
完整语法参考:
2.2.1 基本类型
SQL> CREATE TABLE bf_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE AS BASICFILE;
Table created.
SQL> INSERT INTO bf_tab VALUES (1, 'MyCLOB data');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> CREATE TABLE sf_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE;
CREATE TABLE sf_tab (
*
ERROR at line 1:
ORA-43853: SECUREFILElobs cannot be used in non-ASSM tablespace "SYSTEM"
--这里报错,创建securefile,必须是ASSM表空间。
SQL> selectTABLESPACE_NAME,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;
TABLESPACE_NAME SEGMEN
-------------------- ------
SYSTEM MANUAL
SYSAUX AUTO
UNDOTBS1 MANUAL
TEMP MANUAL
USERS AUTO
EXAMPLE AUTO
DAVE AUTO
7 rows selected.
SQL> CREATE TABLE sf_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE tablespace dave;
Table created.
SQL> INSERT INTO sf_tab VALUES (1, 'MyCLOB data');
1 row created.
SQL> commit;
Commit complete.
2.2.2 LOB Deduplication 重复值
LOB 重复值相关的2个选项:
(1)DEDUPLICATE:不允许出现重复值。
(2)KEEP_DUPLICATES: 允许出现重复值。
SQL> create user dave identified by"dave" default tablespace dave temporary tablespace temp;
User created.
SQL> grant connect,resource to dave;
Grant succeeded.
SQL> conn dave/dave;
Connected.
SQL> CREATE TABLE keep_duplicates_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE keepdup_lob(
6 KEEP_DUPLICATES
7 );
Table created.
SQL> CREATE TABLE deduplicate_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE dedup_lob (
6 DEDUPLICATE
7 );
Table created.
SQL> DECLARE
2 l_clob CLOB := RPAD('X',10000, 'X');
3 BEGIN
4 FOR i IN 1 .. 1000 LOOP
5 INSERT INTOkeep_duplicates_tab VALUES (i, l_clob);
6 END LOOP;
7 COMMIT;
8
9 FOR i IN 1 .. 1000 LOOP
10 INSERT INTO deduplicate_tab VALUES (i, l_clob);
11 END LOOP;
12 COMMIT;
13 END;
14 /
PL/SQL procedure successfully completed.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'keep_duplicates_tab');
PL/SQL procedure successfully completed.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'deduplicate_tab');
PL/SQL procedure successfully completed.
SQL> COLUMN segment_name FORMAT A30
SQL> SELECT segment_name, bytes
2 FROM user_segments
3 WHERE segment_name IN ('KEEPDUP_LOB', 'DEDUP_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
DEDUP_LOB 1179648
KEEPDUP_LOB 28442624
2 rows selected.
SQL>
允许重复值的情况下,占用的空间要大很多。我们可以使用alter table 命令来将deplicates改成keep_duplicates:
SQL> ALTER TABLE deduplicate_tab MODIFYLOB(clob_data) (
2 KEEP_DUPLICATES
3 );
Table altered.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'deduplicate_tab');
PL/SQL procedure successfully completed.
SQL> COLUMN segment_name FORMAT A30
SQL> SELECT segment_name, bytes
2 FROM user_segments
3 WHERE segment_name IN ('KEEPDUP_LOB', 'DEDUP_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
DEDUP_LOB 25296896
KEEPDUP_LOB 28442624
SQL>
2.2.3 LOB Compression 压缩
SecureFIles的COMPRESS 选项允许在表或者分区级别进行压缩。 压缩的级别也分medium 和 high。
默认使用medium。 压缩会消耗一些资源,所以如果使用high 的压缩,那么可能会影响系统的性能。 SecureFiles的压缩对表的压缩是没有影响的。
SQL> CREATE TABLE nocompress_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE AS SECUREFILEnocompress_lob(
6 NOCOMPRESS
7 );
Table created.
SQL> CREATE TABLE compress_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE compress_lob (
6 COMPRESS HIGH
7 );
Table created.
SQL> DECLARE
2 l_clob CLOB := RPAD('X',10000, 'X');
3 BEGIN
4 FOR i IN 1 .. 1000 LOOP
5 INSERT INTO nocompress_tabVALUES (i, l_clob);
6 END LOOP;
7 COMMIT;
8
9 FOR i IN 1 .. 1000 LOOP
10 INSERT INTO compress_tab VALUES (i, l_clob);
11 END LOOP;
12 COMMIT;
13 END;
14 /
PL/SQL procedure successfully completed.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'nocompress_tab');
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STATS.gather_table_stats(USER,'compress_tab');
PL/SQL procedure successfully completed.
SQL> COLUMN segment_name FORMAT A30
SQL> SELECT segment_name, bytes
2 FROM user_segments
3 WHERE segment_name IN ('COMPRESS_LOB','NOCOMPRESS_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
COMPRESS_LOB 131072
NOCOMPRESS_LOB 28442624
SQL>
--使用压缩后,使用空间小很多。
将表compress_tab从压缩改成非压缩:
SQL> ALTER TABLE compress_tab MODIFY LOB(clob_data)(
2 NOCOMPRESS
3 );
Table altered.
SQL> EXECDBMS_STATS.gather_table_stats(USER, 'compress_tab');
PL/SQL procedure successfully completed.
SQL> COLUMN segment_name FORMAT A30
SQL> SELECT segment_name, bytes
2 FROM user_segments
3 WHERE segment_name IN ('COMPRESS_LOB','NOCOMPRESS_LOB');
SEGMENT_NAME BYTES
------------------------------ ----------
COMPRESS_LOB 26345472
NOCOMPRESS_LOB 28442624
--压缩的空间又释放出来了。
2.2.4 LOB Encryption 加密
SecureFileLobs 的加密依赖wallet 或者HardwareSecurity Model (HSM)来保存encryption key。 所以在创建加密的SecureFile之前,必须先创建并打开一个wallet。
2.2.4.1 创建wallet
在sqlnet.ora 文件里添加: ENCRYPTION_WALLET_LOCATION 和WALLET_LOCATION参数。
默认位置是:$ORACLE_BASE/admin/$ORACLE_SID/wallet。
--指定ORACLE WALLET的位置,这里使用ORACLE_HOME/network/admin,在sqlnet.ora里添加如下内容:
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/product/11.2.0/db_1/network/admin)
)
)
ENCRYPTION_WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/admin/dave/encryption_wallet)
)
)
SQLNET.WALLET_OVERRIDE = TRUE
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 0
--添加完之后,重启listener,使参数生效。
--创建wallet:包括设置密码、生成信任文件、并启动wallet
CONN / AS SYSDBA
-- 10g version
ALTER SYSTEM SET ENCRYPTION KEYAUTHENTICATED BY "myPassword";
-- 11g version
当实例重启后或者wallet被关闭后,必须重新open wallets,这样才能保护被加密的列:
-- 10g version
ALTER SYSTEM SET ENCRYPTION WALLET OPENAUTHENTICATED BY "myPassword";
-- 11g version
ALTER SYSTEM SET ENCRYPTION WALLET OPENIDENTIFIED BY "myPassword";
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
2.2.4.2 示例
SecureFile的ENCRYPT 在block-level上对LOBS的内容进行加密。可以使用USING 选项来指定使用哪种加密算法:3DES168, AES128, AES192,AES256,默认使用AES192进行加密。
当对SecureFile 进行加密后,NO SALT 选项不可用。加密是基于列来进行,如果是分区表,那么会影响所有的分区。
DECRYPT选项用来进行解密操作。 具体示例如下:
SQL> conn dave/dave;
Connected.
SQL> CREATE TABLE encrypt_tab (
2 id NUMBER,
3 clob_data CLOB
4 )
5 LOB(clob_data) STORE ASSECUREFILE encrypt_lob(
6 ENCRYPT USING 'AES256'
7 );
Table created.
--可以使用使用alert 来对已经存在的列进行加密或者解密操作,如果要更换加密算法的类型,必须使用REKEY 选项:
SQL> ALTER TABLE encrypt_tab MODIFY (
2 clob_data CLOB DECRYPT
3 );
Table altered.
SQL> ALTER TABLE encrypt_tab MODIFY (
2 clob_data CLOB ENCRYPT USING '3DES168'
3 );
Table altered.
SQL> ALTER TABLE encrypt_tab REKEY USING'AES192';
Table altered.
注意:
Exp/imp 工具不支持Encryption,所以要对加密的列进行传输,必须使用数据泵:expdp/impdp.
2.2.5 LOB Cache and Logging
BasicFile和SecureFile LOBs 都可以进行caching 和logging的设置,相关说明如下:
caching 值:
(1) CACHE - LOB data is placed in the buffer cache.
(2) CACHE READS - LOB data is only placed in the buffer cacheduring read operations, not write operations.
(3) NOCACHE - LOB data is notplaced in the buffer cache. This is the default optionfor BasicFile and SecureFile LOBs.
Basic的 logging 值:
(1) LOGGING - LOB creation andchanges generate full redo. This is the defaultsetting.
(2) NOLOGGING - The operations are not logged in the redo logs andare therefore not recoverable. This is useful during initial creation andduring large loads that can be replayed in the event of failure.
对与SecureFileLOBs多一个FILESYSTEM_LIKE_LOGGING选项,如果指定该选项,那么只对metadata 进行logging。
注意:
Cache 选项就意味着进行logging,所以如果指定了Cache,就不能指定logging 或者FILESYSTEM_LIKE_LOGGING.
相关示例:
CREATE TABLE caching_and_logging_tab (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILE(
NOCACHE
FILESYSTEM_LIKE_LOGGING
);
ALTER TABLE caching_and_logging_tab MODIFYLOB(clob_data) (
CACHE
);
2.2.6 使用PL/SQL APIs 对LOBs 属性进行查看与修改
2.2.6.1 package
DBMS_LOB 包可以查看BasicFile和SecureFile LOBs。 SETOPTIONS 过程和GETOPTIONS 函数查看compression, encryption anddeduplication 选项的修改。
CREATE TABLE securefile_tab (
id NUMBER,
clob_data CLOB
)
LOB(clob_data) STORE AS SECUREFILEsecurefile_lob(
encrypt
compress
);
INSERT INTO securefile_tab VALUES (1, 'Dave');
INSERT INTO securefile_tab VALUES (2, 'Oracle');
COMMIT;
SET SERVEROUTPUT ON
DECLARE
l_clob CLOB;
BEGIN
SELECT clob_data
INTO l_clob
FROM securefile_tab
WHERE id = 1
FORUPDATE;
DBMS_OUTPUT.put_line('Compression : ' || DBMS_LOB.getoptions(l_clob, DBMS_LOB.opt_compress));
DBMS_OUTPUT.put_line('Encryption : ' || DBMS_LOB.getoptions(l_clob, DBMS_LOB.opt_encrypt));
DBMS_OUTPUT.put_line('Deduplication: ' || DBMS_LOB.getoptions(l_clob,DBMS_LOB.opt_deduplicate));
ROLLBACK;
END;
/
这里返回:
Encryption : 2
Deduplication: 0
2.2.6.2 package
DBMS_SPACE包的SPACE_USAGE过程可以查看LOBs 占用磁盘空间信息。 该过程只适用与ASSM 表空间。
SET SERVEROUTPUT ON
DECLARE
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
DBMS_SPACE.SPACE_USAGE(
segment_owner => 'TEST',
segment_name =>'SECUREFILE_LOB',
segment_type => 'LOB',
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;
/
这个和我们的show_space 脚本是一样的。
2.2.7 Migrating to SecureFiles 从BasicFile迁移到SecureFiles
将列从BasicFile LOB迁移到SecureFilesLOB,可以使用如下方法:
(1) CREATE TABLE ... AS SELECT ...
(2) INSERT INTO ... SELECT ...
(3) Online tableredefintion.
(4) Export/Import
(5) Create a new column, update the new column with the values in theoriginal column, then drop the old column.
(6) Create a new column, update the new column with the values in theoriginal column, rename the table and create a view with the original name thatonly references the new column.
除了export/import 的方法,其他的方法都需要考虑转换LOB需要的磁盘空间问题。
Oracle 的Streams 不支持SecureFIles,所以不能使用Streams来迁移LOBs。
在1.10 小节里,也说明,在不考虑空间的情况下,推荐使用表的在线重定义来进行操作。对于在线重定义,我们在表转分区表的时候也用过。 参考如下连接的2.3 小节:使用在线重定义:DBMS_REDEFINITION。
---------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
Skype: tianlesoftware
QQ: tianlesoftware@gmail.com
Email:
Blog:
Weibo:
Twitter:
Facebook:
Linkedin: