• 描述SecureFiles  如何提高大对象(LOB) 数据类型的性能


• 使用SQL 和PL/SQL API  访问SecureFiles 





  • 管理企业信息


组织需要有效且安全地管理许多类型的数据:


• 结构化:简单数据,对象关系数据


• 半结构化:XML 文档,文字处理文档


• 非结构化:介质、医学数据、映像




管理企业信息


如今,应用程序必须处理多种类型的数据,这些数据主要分为结构化、半结构化和非结构化数据。使用大对象(LOB)  的功能,可以将所有这些类型的数据存储在数据库中以及可从该数据库进行访问的操作系统(OS) 文件中。在关系数据库中保存对象关系数据时,文件系统所具有的简单性和性能使其非常适合于存储文件数据。





  • 现有LOB 实施中的问题


• LOB 大小限制


• 主要考虑“单写多读”数据


• 提供低并发性的DML 


• 用户定义的版本控制


• 统一CHUNK大小:


– 影响碎片


– 大小上限


• Oracle Real Application Clusters (RAC) 的可扩展性问题




现有LOB 实施中的问题


在Oracle8i 中,LOB 设计是基于下列假设做出的:


•LOB 实例化的大小预计为几个兆字节。


•LOB 通常被视为“单写多读”类型的数据。很少进行更新,所以可以为所有类型的更新(大型或小型)对整个块进行版本化。


• 预计很少有批处理会流式处理数据。预计不会出现联机事务处理(OLTP)  类型的工作量。


• 保留的还原量由用户使用PCTVERSION和RETENTION 参数进行控制。这是额外的管理工作。


• 在假设LOB 大小通常是统一的前提下,CHUNK大小是一个静态参数。CHUNK大小的上限是32 KB 。


• 预计Oracle RAC 中不会出现高并发性的写入。


自首次实施后,业务要求已发生了显著变化。现在LOB 的使用方式与关系数据的相似,用于存储各种大小的半结构化和非结构化数据。数据大小可以从几千字节(用于HTML 链接)到几兆兆字节(用于流视频)不等。在LOB 中存储所有文件系统数据的Oracle  文件系统会遇到类似OLTP  的高并发性访问。随着Oracle RAC 日益广泛的应用,必须解决Oracle RAC 的可扩展性问题。LOB 空间结构的现有设计不能满足这些新要求。





  • Oracle SecureFiles 


Oracle SecureFiles 重新设计了非结构化(文件)数据的处理方法,提供了以下全新的设计:


• 磁盘格式


– 可变块大小


• 网络协议


– 改进的输入/输出


• 版本化和共享机制


• 重做和还原算法


– 无用户配置


• 空间和内存增强功能




Oracle SecureFiles 


Oracle Database 11 g 将LOB 数据类型作为Oracle SecureFiles  进行了完全重新设计,显著改进了应用程序开发的性能、可管理性和易用性。新实施也提供了下一代高级功能,如智能压缩和透明加密。


使用SecureFiles  时,块大小介于Oracle  数据块大小到64 MB 之间。Oracle DB 尝试使数据集中在磁盘的相邻物理位置,从而将内部碎片降到最低。通过使用可变的块大小,SecureFiles  避免对不必要的大型LOB 数据块进行版本化。


SecureFiles  还提供了新的客户机/ 服务器网络层,从而允许在支持更高读写性能的服务器和客户机之间进行高速数据传输。SecureFiles  自动确定生成重做和还原的最有效方法,因而不需要用户定义参数。SecureFiles  自动确定是仅为更改生成重做和还原,还是通过生成完整的重做记录创建新版本。


由于SecureFiles  需要维护各种内存中统计信息以帮助有效地分配内存和空间,所以将其设计为可自适应的智能工具。这样,由于减少了很难使用不可预测的负荷进行优化的可优化参数数量,可管理性有所提高。





  • 启用SecureFiles  存储


可通过下列方法启用SecureFiles  存储:


• 使用DB_SECUREFILE 初始化参数,此参数可采用下列值:


– ALWAYS | FORCE | PERMITTED |   NEVER |  IGNORE


• 使用Enterprise Manager


• 使用ALTER SESSION |  SYSTEM 命令:


SQL> ALTER SYSTEM SET  db_securefile = 'ALWAYS';




启用SecureFiles  存储


使用DB_SECUREFILE 初始化参数,数据库管理员(DBA) 可确定SecureFiles  的使用情况,其中有效值为:


• ALWAYS :尝试将所有LOB 创建为SecureFile LOB,但是仅可将自动段空间管理(ASSM)  表空间外的任何 LOB 创建为BasicFile LOB 


• FORCE:强制将所有LOB 创建为SecureFile LOB 


• PERMITTED:允许创建SecureFiles (默认值)


• NEVER:禁止创建SecureFiles


• IGNORE :禁止创建SecureFiles ,并忽略使用SecureFiles  选项强制创建BasicFiles 而导致的任何错误




如果指定了NEVER,则任何指定为SecureFiles  的LOB 均被创建为BasicFiles。如果对BasicFiles 使用任何SecureFiles  特定的存储选项和功能(如压缩、加密和取消重复),则会导致异常错误。将对任何未指定的存储选项使用BasicFiles 默认值。如果指定了ALWAYS ,则系统中创建的所有LOB 均会被创建为SecureFiles 。必须在ASSM  表空间中创建LOB ,否则会发生错误。将忽略所有指定的BasicFiles 存储选项。可以使用ALTER SYSTEM 命令更改所有存储的SecureFiles  默认值,如幻灯片中所示。


也可以通过单击“Server (服务器)”选项卡中的“Initialization Parameters (初始化参数)”链接来使用Enterprise Manager 设置参数。





  • SecureFiles:高级功能


• Oracle SecureFiles 提供了下列高级功能:


– 智能LOB 压缩


– 取消重复


– 透明加密


• 这些功能利用了数据库的安全性、可靠性和可扩展性。




SecureFiles:高级功能


Oracle SecureFiles  实施也提供了下一代高级功能,如智能压缩和透明加密。压缩功能支持显式压缩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 后不会出现功能降低。





  • SecureFiles:存储选项


• MAXSIZE:指定最大LOB 段大小


• RETENTION:指定要使用的保留策略


– MAX :达到 MAXSIZE之前保留旧版本。


– MIN :至少将旧版本保留 MIN 秒。


– AUTO:默认值


– NONE:尽可能重用旧版本。


• 下列存储子句不适用于SecureFiles:


– CHUNK 、PCTVERSION 、FREEPOOLS、FREELISTS 和FREELIST GROUPS




SecureFiles:存储选项


MAXSIZE是新的存储子句,用于控制SecureFiles  的物理存储属性。MAXSIZE指定与存储子句级别相关的最大段大小。


RETENTION 指定SecureFiles  的以下项:


• MAX 在达到段MAXSIZE后重新使用旧版本。


• MIN 在指定的最短时间内保留旧版本。


• AUTO 是默认设置,主要对空间和时间进行折中使之达到平衡。这是自动确定的。


• NONE 尽可能重用旧版本。


使用ALTER TABLE 语句更改RETENTION 仅影响该语句执行后创建的空间。


对于SecureFiles ,不再需要指定CHUNK、PCTVERSION、FREEPOOLS、FREELISTS 和FREELIST GROUPS。为了与现有脚本相兼容,将对这些子句进行分析但不解释它们。





  • 创建SecureFiles 


CREATE TABLE  func_spec(


id number, doc CLOB ENC RYPT USING 'AES128' ) 


LOB(doc) STORE AS SECUREFILE


DEDUPLICATE LOB CACHE NOLOGGING);




CREATE TABLE  test_spec (


id number, doc  CLOB) 


LOB(doc) STORE AS SECUREFILE


COMPRESS HIGH KEEP_DUPLICATES CACHE NOLOGGING);  




CREATE TABLE design_spec (id number, doc  CLOB) 


LOB(doc) STORE AS SECUREFILE (ENCRYPT);  




CREATE TABLE  design_spec (id number, 


doc  CLOB ENCRYPT) 


LOB(doc) STORE AS SECUREFILE;  




创建SecureFiles 


可使用CREATE TABLE语句中的存储关键字SECUREFILE创建带有LOB 列的SecureFiles 。早期数据库版本中的LOB 实施现在被称为BasicFiles。将LOB 列添加到表


时,可以指定是将其创建为SecureFiles  还是BasicFiles。如果没有指定存储类型,LOB 将创建为BasicFiles 以确保向后兼容性。


在幻灯片的第一个示例中,创建了一个名为FUNC_SPEC 的表,用于将文档存储为SecureFiles 。在该示例中您指定不希望存储LOB 的重复内容、读取时将高速缓存LOB ,


并且对LOB 执行更新时不生成还原。此外,您还指定将使用AES128 加密算法对存储在doc 列中的文档进行加密。与DEDUPLICATE 相反,KEEP_DUPLICATES可用在ALTER语句中。


第二个示例中,您要创建一个名为TEST_SPEC 的表,用于将文档存储为SecureFiles 。对于此表,您指定可以存储重复内容、LOB 将以压缩格式存储,并且将高速缓存LOB 而不进行记录。HIGH 压缩设置需要进行更多的工作,但可提供更有效的数据压缩。默认压缩是MEDIUM 。压缩算法在服务器端实施,允许对LOB 数据进行随机读取和写入,可以通过ALTER语句对其进行更改。


上面的第三和第四个示例会产生相同结果:使用默认的AES192 加密创建具有SecureFilesLOB 列的表。





  • 使用Enterprise Manager 创建SecureFiles 


使用Enterprise Manager 创建SecureFiles 


可以使用Enterprise Manager 通过“Schema(方案)”选项卡中的“Tables (表)”链接创建SecureFiles 。单击“Create(创建)”按钮后,可以针对要存储为SecureFile 的列单击“Advanced Attributes(高级属性)”按钮输入任一 SecureFiles  选项。


考虑到向后兼容性,仍然支持早期版本中的LOB 实施,现在将其称为BasicFiles。如果将LOB 列添加到表中,则可以指定是将其创建为SecureFile 还是BasicFile 。如果没有指定存储类型,LOB 将创建为BasicFiles 以确保向后兼容性。


可以为高速缓存选项选择下列值:


• CACHE:为了提高访问速度,Oracle  将LOB 页置于缓冲区高速缓存中。


• NOCACHE:作为STORE AS 子句中的参数,NOCACHE指定不将LOB 值置于缓冲区高速缓存中。


• CACHE READS :仅在读取操作期间(而非写入操作期间),才将LOB 值置于缓冲区高速缓存中。


NOCACHE是SecureFile 和BasicFile LOB 的默认值。





  • 共享I/O  池


Oracle DB 加强的数据安全管理_高速缓存


为了支持共享内存(与程序全局区(PGA)  相对)的大型 I/O,Oracle Database 11 g 中新增了共享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 Real Application Clusters 中,LOB 高速缓存为每个已访问的LOB 保留一个锁定。





  • 更改SecureFiles 

Oracle DB 加强的数据安全管理_数据_02




更改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语法更新加密算法或加密密钥。结合使用其它选项,在块级别执行加密可以提高性能(可能为最小的加密量)。





  • 访问SecureFiles  元数据


数据层接口与BasicFiles 的接口相同。


Oracle DB 加强的数据安全管理_oracle_03




访问SecureFiles  元数据


DBMS_LOB 程序包:LOB 继承取消重复、加密和压缩的LOB 列设置,也可使用LOB 定位器API  在每个 LOB 级别上进行配置。但是不能使用LONG API  配置这些 LOB 设置。必须为这些功能使用以下DBMS_LOB 程序包附加函数:


• DBMS_LOB.GETOPTIONS:可使用此函数获得设置。返回与基于选项类型的预定义常量相对应的整数。


• DBMS_LOB.SETOPTIONS:此过程设置功能并允许按LOB 设置这些功能,从而覆盖默认的LOB 设置。这需要往返服务器以使更改变成永久更改。


DBMS_SPACE.SPACE_USAGE:使现有SPACE_USAGE 过程超载,以返回有关LOB 空间使用情况的信息。它返回LOB 段中所有LOB 使用的块中的磁盘空间量。该过程仅可对使用ASSM  创建的表空间使用,并且不将属于BasicFiles 的LOB 块视为已使用的空间。





  • 迁移到SecureFiles 




使用LOB 接口超集,可轻松从BasicFile LOB 进行迁移。迁移到SecureFiles  有两种建议方法:分区交换和联机重新定义。


分区交换


• 需要与表中最大分区相等的额外空间


• 可在交换期间维护索引


• 可将工作量分散到多个较小的维护窗口


• 要求表或分区脱机以执行交换


联机重新定义(建议做法)


• 不要求表或分区脱机


• 可并行进行


• 要求额外存储空间等于整个表,并且所有LOB 段均可用


• 要求重建所有全局索引


这些解决方案通常意味着使用输入LOB 列中的数据所用磁盘空间两倍的空间。但是,使用分区和按分区执行这些操作有助于降低所需的磁盘空间。





  • SecureFiles 迁移:示例


Oracle DB 加强的数据安全管理_oracle_04




SecureFiles  迁移:示例


可以使用幻灯片中的示例将BasicFile LOB 迁移到SecureFile LOB。


首先,使用BasicFiles 创建表。该示例使用的是分区表。


然后,在表中插入数据。


之后,创建具有相同分区数的临时表,但是这次使用SecureFiles 。请注意,此临时表具有相同的列和类型。


最后一部分演示了如何使用DBMS_REDEFINITION过程通过先前创建的临时表重新定义表。





  • SecureFiles  监视


为了显示SecureFiles  的使用情况,已对下列视图进行了修改:


• *_SEGMENTS 


• *_LOBS  


• *_LOB_PARTITIONS  


• *_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$$    LOBSEGMENT          SECUREFILE





  • 小结




• SecureFiles  提高LOB 性能


• SQL 和PL/SQL API  访问SecureFiles