Oracle 基于客户 - 服务器结构。Oracle 服务器由 数据库 (原始数据加上日志和控制文件)和 实例(服务器上负责存取数据库的进程和系统内存)组成。一个实例仅能与一个数据库相连。数据库由 逻辑结构 和 物理结构 组成,逻辑结构如数据库模式,物理结构包括形成 Oracle 数据库的文件。
Oracle 的逻辑数据库结构
在逻辑层,Oracle 包含表空间、模式、数据块 以及 区间 / 段。
表空间
一个 Oracle 数据库被划分为若干个逻辑存储单元,称为表空间(tablespace)。可以用表空间将相关的逻辑结构组织在一起。例如,表空间会把一个应用程序的所有对象组织在一起,以简化某些管理操作。
每个 Oracle 数据库都包含一个名为 SYSTEM 的表空间,它是在创建数据库时自动生成的。SYSTEM 表空间通常会包含整个数据库的系统目录表(在 Oracle 中,称为 数据字典)。一个小型数据库可能只需要一个 SYSTEM 表空间,但最好在创建一个表空间,用以与数据字典分开存放用户数据,从而减少字典对象和模式对象因同名数据文件带来的冲突。
一个创建表空间的语句:
CREATE TABLESPACE user_data
DATAFILE 'DATA3.ORA' SIZE 100K
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
然后可以通过如下语句将表与指定的表空间相连:
CREATE TABLE PropertyForRent (propertyNo VARCHAR2(5) NOT NULL, ...)
TABLESPACE user_data;
如果在创建新表时没有指定表空间,则会用到创建用户账户时与用户相连的默认空间。
用户、模式和模式对象
用户(有时称为用户名)是数据库中定义的一个名称,他可以连接或访问对象。模式 是模式对象的一个命名集合,如表、视图、索引、簇集和过程,它与特定的用户相连。模式和用户的概念有助于 DBA 管理数据库的安全。
为了对数据库进行存取,用户必须首先运行一个数据库应用程序(如 Oracle Forms 或 SQL*Plus),然后用数据库中已经定义的一个用户名来连接。在创建一个数据库用户时,将会相应地为该用户创建一个同名的模式。在默认状态下,一旦用户与数据库相连接,用户就可以对模式中的所有对象进行存取。因为用户只与同名模式相连,所以 “用户” 和 “模式” 这两个词可以互换(注意,表空间与模式之间不存在任何关系:在统一模式中的对象可以放在不同的表空间中,一个表空间也可以保存不同模式中的对象)。
数据块、区间和段
数据块 是 Oracle 可使用,或者说可分配的最小存储单元。一个数据块与物理磁盘空间中一定数量的字节相对应。可以在创建 Oracle 数据库时设置数据块的大小。数据块大小可以是操作系统中块大小的倍数(须在系统的最大操作范围内),这样可以避免不必要的 I/O 操作。数据块的结构如下:
- 标题:包含块地址和段类型等一般信息。
- 表目录:包含将数据放在此块的表的相关信息。
- 行目录:包含该数据块中的行的相关信息。
- 行数据:包含实际的表数据行。行可以跨块存放。
- 空闲空间:分配给新插入的行或更新行时需要的额外空间。自 Oracle8i 以来,Oracle能自动管理空闲空间,尽管还有一个手动管理选项。
逻辑数据库空间的第二个层次称为 区间(extent)。区间是一定数量的连续数据块,用来存储某种特定类型的信息。区间之上的层次就是段。段是区间的集合,用来存储某个逻辑结构。例如,每个表的数据都存在他自己的数据段中,而每个索引的数据则存在它自己的索引段中。当某个段的现有的区间已满时,就由 Oracle 动态地分配新空间。因为区间是根据需要分配的,所以包含在段中的区间在磁盘上可能连续也可能不连续。
Oracle 的物理数据库结构
Oracle中主要的物理数据库结构是数据文件、重做日志文件和控制文件。
数据文件
每个 Oracle 数据库都有一个或多个物理数据文件。逻辑数据库结构(如表和索引)中的数据是以数据文件这样的物理形式存储的。一个或多个数据文件形成一个表空间。最简单的 Oracle 数据库可能只有一个表空间和一个数据文件。更复杂的数据库可能会包含四个表空间,每个表空间中有两个数据文件,因此总共有八个数据文件。
重做日志文件
每个 Oracle 数据库都有一个由两个(或更多)重做日志文件所构成的集合,它记录了对数据进行的所有更改,其目的是便于以后的恢复。某个故障可能使得修改了的数据未能永久的写入数据文件,那么可从重做日志中获取这个修改,从而防止丢失工作。
控制文件
每个 Oracle 数据库都有一个控制文件,它包含了所有其他文件(这些文件都参与了数据库的组成)的一个列表,例如,数据文件和重做日志文件。为了更好地对数据进行保护,最好有多个控制文件(可以将多个副本写入多个设备中)。同样,最好也保存多个重做日志文件的副本。
Oracle 实例
Oracle 实例由 Oracle 进程和对数据库中的信息进行存取所需的共享内存组成,其中,Oracle 使用共享内存对数据和索引进行高速缓存,并对共享程序代码进行存储。共享内存可以划分为不同的内存结构,其中最基本的就是系统全局区(System Global Area, SGA)和程序全局区(Program Global Area,PGA)。
-
系统全局区
SGA 是共享内存的一片区域,用来存储某个 Oracle 实例的数据和控制信息在 Oracle 实例开始时分配 SGA,关闭时回收 SGA。SGA中的信息由下列内存结构组成,其中的每个结构都有固定的大小,并且都在实例启动时创建:数据库高速缓冲区
它包含了数据库最近使用过的数据块。这些数据块可以是已修改但还没写入磁盘的数据(脏块),也可以是没被修改过的数据,还可以是修改后已写入磁盘的数据(干净块)。存储最近使用过的数据块可以使大多数活跃的数据缓冲在内存,从而减少I/O,提高系统的性能。共享池
它包含了一些共享的内存结构,如库高速缓存(library cache)中的共享 SQL 区和数据字典中的内部信息。共享 SQL 区中包含 SQL 查询的分析树和执行规划。如果多个应用程序都用到了同一个 SQL 语句,那它们都能对共享 SQL 区进行存取,从而减少了所需的内存数量,也减少了查询处理所需的分析和执行时间。大池
这是一片可选的内存区,用于大片内存分配(例如,缓冲恢复管理器(RMAN)的大量 I/O 内容)。Java 池
这片区域存储所有会话专有 Java 代码和 Java 虚拟机内的数据。流池
这片区域用于存储缓冲的队列消息并为 Oracle 流提供内存。Oracle流使信息流(如数据库事件和数据库变化)能被管理并潜在的传播到其他的数据库。固定 SGA
这是一个内部管理区,它包含各种各样的数据,如关于数据库状态和 Oracle 实例的信息,以及 Oracle 进程间通信的信息,比如锁信息等。
程序全局区
PGA 是共享内存的一片区域,用来存储一个 Oracle 进程的数据和控制信息。PGA 由 Oracle Database 在一个 Oracle 进程开启时创建。每个服务器进程和后台进程都有一个 PGA。其大小和内容由 Oracle 服务器的安装选项决定。客户进程
每个客户进程都代表一个客户与 Oracle 服务器的一个连接(例如,使用 SQL*Plus 或是 Oracle Forms 应用程序)。客户进程操纵着用户输入、与 Oracle 服务进程的通信及显示客户所需的信息,如果需要,还可以将这些信息转换为更有效的形式。Oracle 进程
Oracle (服务器)进程根据客户需求执行相应功能。Oracle 进程可以分成两类:服务器进程(处理相连的用户进程所发出的请求)和后台进程(执行异步 I/O,并提供了更大并行性,从而提高了系统的性能和可靠性)。图中给出了如下的后台进程:
数据库写回器(DBWR)
DBWR 进程负责将已修改的(脏的)数据块从 SGA 高速缓存区写回到磁盘的数据文件中。一个 Oracle 实例至多有 10 个 DBWR 进程,从 DBW0 ~ DBW9 依次命名,用来处理多个数据文件的 I/O 。Oracle 采用了一种称为先写日志的技术,这就意味着,每当需要释放缓冲区时,DBWR 进程就会批量的执行写出,而不用等到事务的提交点。日志写回器(LGWR)
LGWR 进程负责将日志从日志缓冲区写回到重做日志文件中。检查点(CKPT)
检查点是一个事件,在这个事件中,所有已修改的数据库缓冲区都会由 DBWR 写回到数据文件中。CKPT 进程负责通知最近的检查点一致。CKPT 进程是可选的,如果将其省略,则由 LGWR 进程来完成它的工作。系统监视器(SMON)
当实例从一个出错点重新开始时,由 SMON 进程负责对系统事故进行恢复。因系统崩溃而终止的事务的恢复也包括在内。SMON 还充当了数据库的磁盘碎片整理程序,它可以将数据文件中的空闲区间进行整合。进程监视器(PMON)
PMON 进程负责跟踪对数据库进行存取的用户进程,并在系统崩溃后对其进行恢复。它将清除所有的一流资源(如内存),并释放由故障进程所加的锁。归档器(ARCH)
当在线的重做日志文件被写满时,由 ARCH 进程负责将它们复制到归档器上。系统最多可设定10个 ARCH 进程,依次命名为 ARC0 ~ ARC9。其余的归档器进程可以在有读写指令时由 LWGR 启动。恢复器(RECO)
RECO 进程负责清除出错的或者是挂起的分布事务。锁管理服务器(LMS)
如果采用了 Oracle Real Application Cluster 选项,则由 LMS 进程负责实例间的加锁操作。闪回写和恢复写(FWRW)
当设置闪回或遇到保证还原点,FWRW 进程将闪回数据写入闪回恢复区的闪回数据库日志。闪回工具使管理员和用户能回看和操纵单个 SQL 语句、段和服务的累加的统计数据。MMON 进程负责包括每小时收集一次统计信息并产生一个 AWR 快照在内的许多工作。易处理性监控 Lite(MMNL)
这个进程负责将 SGA 中 Active Session History(ASH)缓冲区里的统计数据写入磁盘。当 ASH 满时 MMNL 写入磁盘。
在前面的描述中大多使用了 “进程” 这个词,目前一些系统会在实现中用线程取代进程。