Oracle Database 12c 具有丰富的、强大的体系结构。Oracle数据库的体系结构决定了Oracle如何使用网络、磁盘和内存。
1、存储结构
Oracle数据库的储存结构分为物理储存结构和逻辑储存结构,这两种储存结构既相互独立又相互联系。对于DBA而言,必须对这两种储存结构有清晰的理解,并且要清楚在一个具体数据库应用系统中,这两种储存结构的具体应对关系,否则就不能进行正常的管理操作、数据库备份与恢复、性能优化等。
1.1、数据文件
Oracle数据库有一个或多个物理的数据文件。数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地储存在数据库的数据文件中。
数据文件其特点如下:
- 每一个数据文件只与一个数据库相联系
- 一个表空间可包含一个或多个数据文件,一个数据文件只能属于一个表空间
- 当数据库容量越界时,数据文件能够自动扩展。
进行数据库操作时,系统将从数据文件中读取数据,并储存在Oracle的内存缓冲区中。新建或更新的数据不必立即写入到数据文件中,而是把数据临时存放到内存中,由数据库写入进程(DBWR)决定在适当的时间一次性写入到数据文件中。这样可以大大降低访问磁盘的次数,从而提高系统性能。
1.2、表空间
表空间是数据库的逻辑划分,一个数据库在逻辑上由多个表空间组成。表空间相当于一个容器,用于将不同类型的数据组织在一起。表空间中的数据在物理上是储存在数据文件中的,一个表空间对应一个或多个数据文件。如果表空间只包含一个数据文件,那么所有数据都将存储在这个数据文件中。如果表空间对应多个数据文件,那么数据将被划分为几部分,分别存放在这些数据文件中。
2、数据库实例
Oracle数据库系统指具有管理Oracle数据库功能的计算机系统。每一个运行的Oracle数据库都对应一个Oracle实例,一个Oracle实例为存取和控制数据库的软件机制。当数据库服务器上的一个数据库启动时,Oracle将分配一块内存区间,叫做系统全局区(SGA),并启动一个或多个Oracle进程。因此实例是一组内存结构和后台进程的集合。
用户访问数据库的操作是通过实例来完成的。实例通过后台进行与数据库中的文件进行交互,将用户修改过的或新增加的数据写入文件,而用户对数据的所有访问都是在实例的内存结构中进行的。数据位于内存中,用户读写内存的速度要比直接读写磁盘快得多,而且内存中的数据可以在多个用户之间共享,故引入实例在某个方面可以提高数据访问的并发性。
当数据库服务器启动时,首先启动实例,然后加载并打开数据库。当用户访问数据库时,数据库服务器便为用户进程启动一个服务器进程,负责处理用户进程的所有请求,例如讲用户访问的数据从数据文件读到内存中。只有数据管理员才能启动实例,并打开数据库。数据库被打开后,数据库管理员可以将数据库关闭,此时用户就无法访问数据库中的数据。
为了区分不同的实例,每个实例都有一个系统标识符SID,通常SID与数据库同名。每个服务器进程的命名也与SID相匹配。
3、内存结构
内存结构是Oracle数据库体系结构中最为重要的部分之一,内存也是影响数据库性能的主要因素。在Oracle数据库中,服务器内存的大小直接影响数据库的运行速度,特别是多个用户连接数据库时,服务器必须有足够的内存支持,否则有的用户可能连接不到服务器,或查询速度明显下降。
当时实例启动时,系统为实例分配了一段内存空间,并启动若干后台进程。内存空间分成不同的部分,分别用来储存不用的信息,具体如下:
- 程序代码
- 连接会话的信息
- 进程通信和共享的相关信息
- 程序运行过程中的信息(例如当前查询的状态等)
- 缓冲区中的数据,如用户要访问的数据、重做日志等。这部分也叫作SGA
当用户发出一条SQL语句时,首先由服务器进程对用户的SQL语句进行语法分析并执行,然后将数据从数据文件读入到系统的数据缓存区,修改后的数据由服务器进程写回到数据文件中。按照系统对于内存的使用方法不同,Oracle数据库的内存可以分为系统全局区(SGA)和程序全局区(PGA)
3.1、Oracle具有下列基本的内存结构
- 软件代码区
- 系统全局区,包括数据库缓冲储存区、日志缓冲区和共享池
- 程序全局区,包括栈区和数据区
- 排序区
其中软件代码区用于储存正在执行的或考研执行的程序代码。软件区是只读,可安装成共享或非共享。Oracle系统程序是可共享的,以致多个Oracle用户可存取它,而不需要在内存有多个副本。用户程序可以共享也可以不共享。
排序需要内存空间,Oracle利用该内存排序数据,这部分空间成为排序区。排序区存在于请求排序的用户进程的内存中,该空间的大小为排序数据量的大小,可增长,但受初始化参数SORT_AREA_SIZER限制。
4、进程结构
进程是操作系统中的一个机制,它可执行一系列的操作步骤。在有些操作系统中称为作业或任务。Oracle是一个多进程的系统,每个进程都执行特定的任务。通过把Oracle和数据库应用程序的工作分解成不同的进程,多个用户和应用程序就可以同时连接到一个数据库实例,而且使系统保持出色的性能。
Oracle系统中的进程可以分为两大类:
-
用户进程:运行应用程序或Oracle工具
-
Oracle进程:运行Oracle服务器代码。Oracle进程包括服务器进程和后台进程。
服务器进程用于处理连接到数据库实例的用户进程的请求。服务器进程完成以下主要工作:
- 分析并运行应用程序中的SQL语句
- 如果需要的数据块不在SGA中,则把它从数据文件中读取到SGA的共享数据库缓冲区中。
- 返回应用程序需要的结果
为了实现系统的最佳性能,并协调多个用户,在多进程Oracle系统中使用一些附加进程,称为后台进程。在许多操作系统中,后台进程在例程启动时自动建立。一个Oracle例程可以有许多后台进程,但它们不是一直存在的。
5、数据字典
数据字典是一种系统表,是Oracle存放有关数据库信息的地方,主要用于描述数据。数据字典在数据库被创建时自动产生,并且由数据库服务器本身进行维护和更新。在数据字典中存储了以下信息:
- 数据库对象信息,如表、视图、索引、同义词、储存过程、约束、包等各种对象
- 数据库的物理结构和逻辑结构信息
- 安全信息,如权限、角色、完整性约束等信息
- 实例运行时的性能和统计信息
- 审计信息
数据字典是一个较复杂的表,其所有者是SYS用户,为了便于用户访问,Oracle提供了许多数据字典视图。这些数据字典视图建立在数据字典基表上。数据字典视图的结构可以通过在SQL*Plus中执行DESC命令来查看。
Oracle中的数据字典一般可分为静态和动态两种。静态数据字典主要用在用户访问数据字典时不会发生改变;但是动态数据字典依赖于数据库运行的性能,反映了实例的实际运行情况,所以在访问这类数据字典的信息时往往是动态变化的。
详情请参考文献资料 ---《Oracle Database 12c实用教程》