1.3 Oracle 12c新特性
Oracle数据库管理与维护实战
纵观甲骨文全球大会和甲骨文公司的各种资讯,我们可以发现云计算和大数据是两个重要的主题,Oracle 12c则融合了这两大主题。与以往的Oracle数据库相比,Oracle 12c在16个方面进行了更新。本节将详细介绍Oracle 12c数据库中的16个新特性。
1.3.1 支持多线程模式
在Oracle 12c中,Oracle引入了多线程模式,允许在Windows平台之外的UNIX、Linux等系统使用多线程模式。结合多进程与多线程模式,Oracle 12c数据库极大地提升了进程管理的性能。
关于Oracle 12c数据库中的进程,如表1-2所示。
要使Oracle 12c处于多线程模式,我们必须将兼容性设置为12.0.0.0以上,且设置初始化参数THREADED_EXECUTION为TRUE。启用该功能的步骤如下。
(1)关闭所有实例。
(2)修改初始化参数THREADED_EXECUTION的值。
SQL> startup upgrade
SQL> alter system set threaded_execution=true scope=spfile;
(3)重启所有实例。
1.3.2 加强Defaults功能
Oracle 12c中加强了默认值(Default)的功能,主要体现在如下方面。
支持序列作为默认值;
如果插入NULL时,也可以指定默认值;
加强了默认值作为Identity的能力;
在Oracle 11g中,默认值的值必须是非空列,Oracle 12c中却可以通过METADATAONLY default值指定新增列的默认值。
1.3.3 更新了多种数据类型长度限制
Oracle 12c中为了使数据类型与PL/SQL中的变量类型一致,通过OUT OF LINE的CLOB,扩展VARCHAR2、NVARCHAR2和RAW类型的长度到32K。而在之前版本中,这三个类型的长度则是2000B。
如果要使用扩展后的数据类型,我们必须将兼容性设置为12.0.0.0以上,且设置初始化参数MAX_STRING_SIZE为EXTENDED,同时还要注意这些类型不支持CLUSTER表和索引组织表。启用该功能的步骤如下。
(1)关闭所有实例。
(2)修改初始化参数MAX_STRING_SIZE的值。
SQL> startup upgrade
SQL> alter system set max_string_size = extended;
(3)重启所有实例。
(4)最后创建表来测试VARCHAR2、NVARCHAR2等类型的长度。
1.3.4 增强PL/SQL性能
Oracle 12c中,为了提高SQL语句调用的性能,加强了SQL Engine和PL/SQL Engine这两种代码引擎之间的交互,可以直接在SQL中嵌入PL/SQL对象并且运行。
通过WITH语句在SQL中定义一个函数,例如下面的例子所示。
with
function Is_Number
(x in varchr2) return varchar2 is
Plsql_Numb_Error exception;
Pragma exception_init(Plsql_Num_Error, -06502)
begin
……
end Is_Number;
select rownum,x,is_number(x) is_num from t
1.3.5 实现Native TOP N查询
正由于Oracle 12c实现了“Native TOP N”查询,大大简化了Oracle数据库中的分页实现。在Oracle 12c版本数据库之前,翻页查询需要使用rownum的方式进行SQL嵌套查询编写,非常复杂;而“Native TOP N”查询允许使用Offset / Limit等限定进行Top N查询。该查询的语法结构如下。
OFFSET <offset> [ROW | ROWS]
FETCH [FIRST | NEXT]
[<rowcount> | <percent> PERCENT] [ROW | ROWS]
[ONLY | WITH TIES]
为了便于用户掌握该特性,我们通过两种方式来实现返回经过排序后TOP 5%的记录,旧版本的查询语句如下。
SQL> select employee_id,last_name,salary
from(select employee_id,last_name,salary,
row_number() over (order by salary) rn,
count(*) over () total
form employee)
where rn<=ceil(total*5/100);
新版本的查询语句如下。
SQL> select object_id,object_name from eygle order by object_id
fetch first 5 rows only;
通过上述两段SQL语句的对比,我们可以发现,新版本的分页实现简化了许多。
1.3.6 加强行模式匹配
Oracle 12c中提供了新的模式匹配子句match_recognize,该语句通过使用正则语法提供类似分析函数的功能,从而实现在行间进行匹配判断并进行计算。
1.3.7 增加Adaptive Plans
Adaptive Plans,翻译为自适应执行计划,该特性的增加主要是为了克服列倾斜问题,同时它也是一种非常神奇的特性。因为拥有自适应功能的执行计划,所以优化器可以在运行时自动适配一个性能不良的执行计划,并避免在后续仍选择该性能糟糕的计划。
当SQL优化器支持Adaptive Plans特性后,执行一个关于Join(连接)SQL语句的具体流程如下:
(1)发布用户语句。
(2)SQL优化器基于现有统计生成一个“Nested Loops”执行计划,同时生成可选的 “Hash Join”子计划并存放到cursor。
(3)Oracle 12c数据库在执行“Nested Loops”之前先读取要Join表的行,并暂存于内存中。
(4)当表的行很少,做出决策依旧采用“Nested Loops”计划。
(5)当表的行达到一定阀值,做出决策采用“Hash Join”子计划。
1.3.8 改进分区特性
为了提高Oracle 12c数据库的性能,该版本的数据库对分区进行了调整,主要提供了异步维护全局索引的drop和Truncate分区操作,还增加了Interval-Reference分区方式。详细调整如下。
Interval-Reference分区方式:该分区方式把Oracle 11g中的Interval分区和Reference分区方式相结合,当主表自动增加一个分区后,所有的子表、孙子表、重孙子表、重重孙子表等都可以随着外接列新数据增加,自动创建新的分区。
Truncate和Exchange分区及子分区:无论是Truncate还是Exchange分区,在主表上执行的操作,都可以在级联的子表、孙子表、重孙子表、重重重……孙子表上同时执行。对于Truncate分区而言,所有表的操作在同一个事务中,如果中途失败,会回滚到命令执行之前的状头。这两个功能通过关键字Cascade实现。
在线移动分区:为了提高分区整体可用性,缩短了分区维护时间,提供了“Move Online”关键字。该关键字可以实现在移动过程中,对表和被移动的分区执行查询、DML语句以及分区的创建和维护操作,同时整个移动过程对应用透明。
多个分区同时操作:实现对多个分区同时进行维护操作,即可以将多个分区Merge到一个新的分区中,也可以将一个分区SPLIT成多个分区。为了让多个分区同时操作自动并行完成,需要通过FOR语句指定操作的每个分区,如果为RANGE分区,也可以通过TO语句来指定处理分区的范围。
异步全局索引维护:对于非常大的分区表而言,维护全局索引是一件非常痛苦的事情,该特性则解决了这个问题。在具体使用时,即使是几亿条记录的全局索引,在分区维护操作,仍然是VALID状态,索引不会失效,不过索引的状态是包含OBSOLETE数据,当维护操作完成,索引状态恢复。
部分本地和全局索引:通过使用该特性,可以极大地增加灵活性。如果在分区表的部分分区上建立索引,当通过索引列访问全表数据时,一部分分区可以通过索引扫描,另一部分分区通过全分区扫描,这样可以减少对历史数据的索引量。
由于Oracle 12c数据库在分区上做了很大的改进,最明显的效果就是在该版本数据库中进行在线重命名和在线迁移不再需要复杂的过程。
对于在线重命名,需要首先把表空间置为只读模式,然后通过使用“ALTER DATABASE MOVE DATAFILE”这样的SQL语句对数据文件进行在线重命名。而当该数据文件传输时,终端用户可以执行查询、DML以及DDL方面的任务。同样数据文件可以在存储设备间迁移,如从非ASM迁移至ASM。
对于在线迁移,需要注意的是,当指定了ONLINE语句,所有的DML操作可以在没有任何中断的情况下,在参与在线迁移的分区或子分区上执行;但是如果在离线迁移状态下,DML操作是不允许的。
1.3.9 增强数据优化
为了增强数据优化功能,系统提供了ILM(数据生命周期管理)功能。该功能中的“数据库热图”(Database Heat Map),不仅可以在视图中直接显示数据的利用率,而且还可以发现“最热的数据”。同时Oracle 12c中也可以自动实现数据的在线压缩和数据分级,其中数据分级不仅可以在线将数据文件定时转移到归档文档,而且还可以在线将数据表定时转移至归档文件;而在线压缩则实现在线的数据压缩。
1.3.10 加强应用连续性
Oracle 12c之前RAC(实时应用集群)的FAILOVER(故障转移)只支持SESSION和SELECT级别,而对于DML操作无能为力。当设置为SESSION级别时,进行到一半的DML操作会自动回滚;当设置为SELECT级别时,虽然FAILOVER可以不中断查询,但是对于DML操作却不支持自动回滚,必须要手工回滚。而Oracle Database 12c中则实现了事务的FAILOVER。
1.3.11 引入临时UNDO段
所谓临时UNDO(Temporary Undo Segments),就是将临时段中UNDO独立出来,放到TEMP表空间中,该特性是专门为临时表设置的。
每个Oracle数据库包含一组与系统相关的表空间,例如SYSTEM、SYSAUX、UNDO & TEMP,并且它们在Oracle数据库中的作用都非常重要。在Oracle 12c之前,UNDO记录由临时表产生并存储在UNDO表空间中,其实这更类似于一个通用或持久的表撤销记录。而在Oracle 12c中由于信息不会写入UNDO日志,UNDO表空间的开销得以减少并且产生的UNDO数据会更少。使用临时UNDO的优点如下。
使用临时UNDO可以降低对UNDO表空间的占用。
使用临时UNDO可以减少REDO产生的数量,提高DML的速度;
使用临时UNDO可以在“Active Data Guard”配置中的Standby数据库里直接在临时表上执行DML操作。
如果要启用临时UNDO段,必须将兼容性设置为12.0.0.0以上,并且设置初始化参数SET TEMP_UNDO_ENABLED为TRUE。
1.3.12 支持PDB
PDB,全称为Oracle Pluggable Database(可组装式数据库,PDB),它是Oracle 12c中引人瞩目的新特性,主要是为计算而生。在Oracle 12c版本数据库以前,Oracle数据库是通过Schema来进行用户模式隔离的,而现在可组装式数据库可以让此前意义上的多个数据库一起共存。
我们可以发现,Oracle PDB体系结构由一个容器数据库(CDB)和多个可组装式数据库(PDB)构成。PDB包含独立的系统表空间和SYSAUX表空间等,但是所有PDB共享CDB的控制文件、日志文件和UNDO表空间。各个PDB之间互访需要通过DB Link进行,就仿佛是多个数据库一样。
正是由于Oracle 12c具有PDB这个新特性,该版本数据库也被称为多租户数据库。也就是说,在云平台上,不同租户可以在同一个大的CDB数据库中运行,而彼此数据(PDB)与应用又完全隔离。显然这个特性对Oracle推出的数据库云平台必不可少。
注意,Oracle 12中的PDB特性所面临的最大问题仍然是安全问题。如果某个PDB的用户获得了意外的权限提升,则所有用户的数据都可能被暴露。
1.3.13 提供CDB容器
Multitenant Environment,直译为多租户环境,它是Oracle 12c数据库众多新特性中的一
个亮点,同时也是跟PDB关系最紧密的一个特性。在Oracle 12c数据库所提供的多租户环境中,可以创建一个多租户的容器(Oracle Container Database,CDB),CDB则可以用来管理多个用户创建的可组装式数据库(Oracle Pluggable Database,PDB)。其实这些PDB可以直接为用户服务,它们主要包含了Schemas Objects等信息。
CDB容器的架构图如图1-2所示,主要包含Root、Seed和PDB组件,它们的详细介绍如下。
Root组件:也称作CDB$ROOT,主要负责存储元数据和通用账户信息。在具体配置时,通用账户能访问所有的PDB,但是一个CDB中只能有一个Root组件。
Seed组件:也称作PDB$SEED,是创建PDB数据库的模板库。因为该模板库具有只读属性,所以不能直接修改该模板里面的数据。最后需要注意一个CDB容器中也只能有一个Seed组件。
PDB组件:跟以前使用的数据库一样,只不过叫可组装式数据库,是用户可以直接使用的数据库。
上面所介绍的就是一个CDB里的所有组件,每个组件称作一个容器(Container),并且每个容器都有一个唯一ID和名称。
为了了解CDB、PDB、PDB$SEED、CDB$ROOT等之间的关系,用户需要掌握多租户环境的体系结构,如图1-3所示。
1.3.14 支持表级别恢复
在Oracle 12c数据库中,用户可以通过RMAN工具直接从备份集中恢复单张、多张表和表分区到某个时间点或SCN。这样有一个好处,即当恢复的数据比较少而备份非常大时,该特性能减少工作量。
当Oracle实例由于逻辑损坏、误删除等操作带来数据丢失时,用户可以使用表级别恢复来实现数据找回,具体步骤如下。
(1)检查恢复表在哪个备份中,并且选择合适的备份。
(2)创建辅助数据库并把该辅助数据库临时设置为某个时间点。为了创建成功,用户需要指定一个路径来存放该辅助数据库。
(3)创建包含恢复后表数据的export_dump_file。
(4)(可选)将步骤(3)导出的export_dump_file导入目标数据库。
(5)(可选)重命名导入后的表名称。
以下是在RMAN中应用表或分区恢复的限制和约束。
SYS用户的表无法恢复。
SYSTEM和SYSAUX表空间内的表无法恢复。
含有NOT NULL约束的表不能使用REMAP工具进行恢复。
1.3.15 支持网络恢复
在Oracle 12c数据库中,用户不仅可以通过RMAN工具执行表级别的恢复,而且还可以网络执行数据文件的备份和恢复。这样有一个好处,当需要同步主数据库和备用数据库时,用户只需要在两者之间用一个服务名重新获得或恢复数据文件、控制文件、参数文件、表空间或整个数据库即可。通过这种方式,用户可以防止主数据库上数据文件、表空间的丢失,或是没有真正从备份集恢复数据文件。
1.3.16 增添了Flex ASM
Oracle 12c数据库为了配合云战略,专门增加了Flex ASM特性。所谓Flex ASM,跟前面介绍的PDB非常相似,为什么怎么说?这是因为在Oracle 12c数据库之前,8个节点的RAC(Real Application Clusters,实时应用集群)需要8个ASM(自动存储管理)实例,即一个RAC节点需要一个ASM实例。Oracle 12c数据库中则只需要2~3个ASM实例,没有ASM实例的那些RAC节点可以直接安装个客户端,这样就可以远程连接到具有ASM实例的节点。
注意,Oracle 12c数据库中的Flex ASM功能需要用户手动启用才能生效,否则RAC的模式还是和Oracle 11g中没有差别。