Oracle 21c已经发布,并且依然遵循先云端后本地的模式。因此诸位如果想尝鲜的话,可以在OCI(Oracle Cloud Infrastructure)上搞一下。至于本地部署的版本,可能要等几个月才会发布了。
如果您想在OCI上搞而又不想花钱的话,可以申请一下OCI的always free,具体链接为:https://www.oracle.com/cloud/free/。
从本文开始,我将会发布一系列的文章,详细探讨21c的诸多新特性。当然,由于20c已经取消GA,因此21c也就包含了20c的全部新特性。
先从体系结构的重温开始吧。
数据库服务器

注:数据库体系结构之内容,源自:https://www.oracle.com/webfolder/technetwork/tutorials/architecture-diagrams/21/database-technical-architecture.html。
一个Oracle数据库,由至少一个数据库实例和一个数据库(注:19c数据库还支持Non-CDB架构,但是19c以后,将不再支持。以后所有版本的Oracle数据库,将只支持CDB架构。)组成。数据库实例包含内存的实使用管理,以及一组进程。CDB容器数据库则由被称之为数据文件的物理文件组成。当然,数据库在运行期间,还将会使用多个数据库系统文件。
单实例数据库由一个数据库实例和一个数据库组成。数据库与实例之间为1:1的关系。可以在同一台服务器上安装多个单实例数据库。该模式较为适合在同一台计算机上运行不同版本的Oracle数据库。
RAC数据库则由在单独的服务器上运行的多个实例组成。它们共享同一个数据库(即实例与数据库的关系为N:1)。这样的配置,旨在实现高可用、可伸缩性以及高性能。
监听器是数据库服务器进程,其用于接收客户端请求,建立与数据库实例之间的连接,然后将客户端连接移交给服务器进程处理。监听程序可以在数据库服务器上本地运行,也可以远程运行。RAC环境下就是远程运行的。
数据库实例

数据库实例包含一组Oracle后台进程和内存结构。内存中主要是系统全局区(SGA)和程序全局区(PGA)。后台进程负责对数据库中存储的数据(数据文件)进行操作,并使用内存结构来完成。数据库实例只存在于内存当中。
Oracle数据库还将会创建服务器进程,从而代表客户端程序处理与数据库的连接,并执行客户端工作。例如,对SQL语句的解析和执行,以及查询结果并将其返回给客户端等等。这种类型的服务器进程,也称之为前台进程。
系统全局区(SGA)

SGA是一个包含Oracle数据库实例和控制信息的内存区域。所有的服务器进程和后台进程共享SGA。在启动数据库实例时,将会显示为SGA分配的内存容量。SGA包含如下结构:
共享池:用于缓存可以在用户之间共享的各种结构。例如,共享池将会缓存已解析的SQL、PL/SQL代码,系统参数,以及数据字典信息。共享池几乎会参与数据库中发生的所有操作。例如,如果用户执行SQL语句,那么将会在共享池内发生一系列的相应动作。
闪回缓冲区:为SGA中的可选组件。当您启用闪回数据库特性后,数据库将启动名称为RVWR(Recovery Writer)的后台进程。RVWR定期将已修改的数据块从db buffer cache中复制到闪回缓冲区,然后再将该区域内的数据写入闪回数据库日志。该缓冲区以循环的方式进行复用。
db buffer cache:用于存储从数据文件中读取的数据块副本的内存区域。该缓冲区是主要使用的内存区域,用于缓存当前或者最近使用过的数据块。连接到数据库实例的所有用户,共享对该区域的访问。
数据库智能闪存缓冲区(Database Smart Flash cache):在Solaris或者Oracle Linux上运行的数据库db buffer cache的扩展内存(可选)。它能够为数据库提供2级缓存。无论是针对DW应用,还是OLTP应用,该扩展缓存都可以提高数据的响应速度和整体吞吐量。该区域可以驻留在一个或者多个闪存设备上。这些设备均使用固态存储。数据库智能闪存通常比其他内存更便宜,但是又比磁盘快了一个数量级。
重做日志缓冲区:也是SGA中循环复用的一个缓冲区。该区域用来保存有关对数据库所做的更改信息。信息存储在重做条目(redo entry)中。重做条目包含了DML、DDL或者数据库内部操作对数据库所进行的更改的必需信息。如有必要,重做条目可用于数据库恢复。
Large pool:一个可选的内存区域,在需要比共享池还大的内存分配时使用。large pool主要为如下用途提供内存服务:共享服务器连接模式下的用户全局区(UGA)、Oracle XA(用于事务和多个数据库交互,即分布式事务)、并行执行语句使用的消息队列缓冲区、RMAN使用的1/O缓冲区,以及延迟插入。
In-Memory区:内存结构中的可选组件(由12.1版本开始引入)。使得对象(表、分区,以及其他类型)能够以列的形式缓存在内存当中。与传统的磁盘存储格式相比,这种存储格式,使得扫描、联接以及聚合等的执行速度要快得多。因此能够提供快速的报表查询和DML操作性能。故而更适用于OLAP类(即在数列上查询多行,而不是在多列上查询数行)的应用。
Memoptimize Pool:可选组件,用于为基于键值的查询(Fast Lookup)提供高速和可伸缩性。memoptimize pool包含两个部分:memoptimize 缓冲区和hash索引。Fast Lookup通过使用hash索引,可以快速访问memoptimize 缓冲区中指定表(使用MEMOPTIMIZE FOR READ 进行设置的表)的数据块,从而避免了物理的I/O操作。该区域是与db buffer cache完全隔离的区域。hash索引是在配置memoptimize行存储时自动创建的,由Oracle自动维护。
Shared I/O pool(SecureFile):专用于SecureFile(11g开始引入)大对象上的大型I/O操作。LOB是一种特定的数据类型,用于保存大量数据。SecureFile是一个LOB的存储参数,能够实现重复数据的加密、压缩,以及去重等高级功能。
Streams pool:面向Oracle Streams、Data Pump和GoldenGate应用的专用内存区域。Streams pool用于缓冲队列消息,并为Oracle Streams的捕获和应用进程提供内存服务。除非特别配置,否则该池的大小从0开始。一旦您使用了Oracle Streams,该池的大小将会根据需要动态增加。
Java pool:用于缓存Java虚拟机(JVM)中所有特定于会话的Java代码和数据。Java pool的使用方式与其他内存区域不同,具体取决于Oracle数据库的运行模式(可参考:https://docs.oracle.com/en/database/oracle/oracle-database/21/cncpt/memory-architecture.html#GUID-51234BB8-1976-4670-8BC5-BB0E3D3BA12D)。
Fixed SGA:为oracle内部使用的区域,其中包含关于数据库和实例的一般状态信息,以及各进程之间传递的消息。
程序全局区(PGA)

PGA则是一个非共享的内存区域,其中包含了专门由服务器进程和后台进程使用的数据及控制信息。Oracle数据库会创建服务器进程,以代表客户端程序处理与数据库的连接。在专用服务器连接模式下,将会为每个服务器和启动的后台进程创建一个PGA。每个PGA包含堆栈空间、hash区、位图合并区,以及用哪用户全局区(UGA)。当终止与之相关联的服务器或者后台进程时,PGA将会被释放。
在共享服务器连接模式下,多个客户端用户共享服务器进程。UGA将会被移入large pool,因此PGA只包含堆栈空间、hash区,以及位图合并区。
在专用服务器连接模式下,PGA则包含如下组件:
SQL工作区:排序区为需要进行排序的函数使用,例如ORDER BY和GROUP BY等。
会话内存:会话变量用于缓存用户的登录信息,以及数据库会话所需的其他信息。OLAP pool则管理OLAP数据页,数据页等同于数据块。
私有SQL区:该区域缓存关于已解析的SQL语句信息,以及其他特定于会话的信息。当服务器进程执行SQL或者PL/SQL代码时,进程就会使用该私有SQL区来存储绑定变量的值、查询的执行状态信息,以及查询执行工作区。并且相同或者不同会话中的多个私有SQL区均可以指向SGA中的单个执行计划。持久区中包含绑定变量的值,运行时区则包含查询执行的状态信息。游标是私有SQL区中特定区的名称,或者句柄。您可以将游标视作客户端的指针,或者是服务器端的状态。因为游标与私有SQL区紧密相关,所以有时候这些术语可以互换。
堆栈空间:用于缓存会话变量和数组的内存空间。
hash区:用于执行表的hash联接。
位图合并区:用于合并从多个位图索引的扫描中检索到的数据。
后台进程

后台进程是数据库实例的一部分,用于执行数据库操作,处理用户请求,以及维护数据库等任务。每个后台进程执行一项单独的任务,但是会与其他进程协同工作。在启动数据库实例时,Oracle数据库会自动创建后台进程。具体是哪些后台进程,则取决于数据库当前正在使用的功能。启动数据库实例时,强制后台进程将会自动启动,可选的后台进程您可以稍后根据需要进行启动。
所有典型的数据库配置中都存在着强制后台进程。默认情况下,这些进程在以最低配置的初始化参数文件开始的读写数据库实例中运行,只读数据库则会禁用其中一些进程。强制后台进程包括PMON、PMAN、LREG、SMON、DBWn、CKPT、MMON、MMNL,RECO,以及LGWR。
大多数可选的后台进程,往往特定于具体的任务或者功能。一些常见的可选后台进程包括ARCn、CJQ0、RVWR、FBDA,以及SMCO。
辅助进程则是代表其他进程执行工作的后台进程。例如dispatcher进程(Dnnn),以及共享服务器进程(Snnn)。