ORACLE数据库技术实用详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 Oracle体系结构简介

事实上,我们通常所说的“数据库”,在各个关系型数据库(RDBMS)生产厂商之间来说,其概念是有很大区别的。在Oracle看来,其RDBMS产品应该称为Oracle服务器(Oracle Server)。它是一个用于管理信息的系统,通过对外提供一个开放、复杂、安全、集成的服务,从而使用户能够进行存储、检索及管理数据。

Oracle服务器由两大部分组成:一部分叫Oracle数据库;另一部分叫Oracle实例。

Oracle数据库

Oracle数据库是指位于硬盘上实际存放数据的文件,这些文件组织在一起,成为一个逻辑整体,即为Oracle数据库。因此,在Oracle看来,“数据库”是指硬盘上文件的逻辑组合,必须要与内存里的实例合作,才能对外提供数据管理服务。

Oracle实例

Oracle实例是指位于物理内存里的数据结构。它由一个共享的内存池以及多个后台进程所组成,共享的内存池可以被所有进程访问。用户如果要存取数据库(也就是硬盘上的文件)里的数据,必须通过实例才能实现,不能直接读取硬盘上的文件。

尽管我们经常将Oracle服务器与Oracle数据库这两个名词混用,但是我们要知道,这两者是有本质区别的。

Oracle服务器要想对外提供数据管理的服务,就必须先启动实例。实例启动时,会在内存里分配一块共享空间,这部分空间就叫做SGA。按照Oracle官方的说法,称为System Global Area,而我则更倾向于把SGA称为Shared Global Area。这样从这块内存区域的名字上就可以看出它是被所有进程共享的。分配SGA以后,Oracle会启动一组后台进程。这时我们就说数据库实例已经生成了。

实例启动以后,Oracle软件会将已启动的实例与某个数据库关联,这个过程叫做mount。当实例成功地mount到某个数据库时,接下来就可以打开该数据库所包含的物理文件。于是,用户就可以在这些文件里读写数据了。

任何一个时刻,一个实例只能与一个数据库相关联,一个实例只能mount或打开一个数据库。这种情况就是所谓的单实例数据库;而一个数据库同时可以被多个实例关联,被多个实例mount或打开。这种情况就是所谓的RAC数据库了。

Oracle数据库所包含的文件主要分为两大类:一类叫做关键文件(Key File);另一类叫做非关键文件(Non-key File)。如果丢失关键文件,Oracle数据库必须进行介质恢复(Media Recovery)以后才能继续使用。而如果丢失非关键文件,则只需要重建丢失的文件即可,不需要进行介质恢复,同时在重建之前,数据库仍然可以继续使用。

关键文件主要包含三类:

数据文件(datafile)

实际存放用户数据的地方。是数据库文件的主要组成部分。

联机日志文件(online redo log file)

存放了数据库里发生的所有变化过程。可以理解为有一部摄像机,将数据库里数据所发生的变化全都按照时间的先后顺序给拍下来了。在现实生活中,拍摄的内容是存放在录像带中,而在Oracle数据库中,则是存放在联机日志文件中。该文件主要用于数据库的恢复。

控制文件(control file)

存放了数据库的自我描述的信息,比如数据文件放在在哪里、联机日志文件放在哪里等。控制文件中还存放了当前数据库运行状态的信息。可以把控制文件想象为Oracle数据库的中枢神经,管理控制着整个数据库的正常运行。

非关键文件主要包含以下几类:

参数文件(parameter file)

包含启动实例时参照的各个参数信息。

密码文件(password file)

如果使用密码认证SYSDBA权限时,则该文件存放了以系统管理员身份登录数据库时所需的密码。

归档日志文件(archived redo log file)

该文件是联机日志文件的副本。当一个联机日志文件写满以后,我们可以选择将该写满了的联机日志文件复制到指定的路径,从而将数据库的变化永久保留下来。

告警文件和跟踪文件(alert file、trace file)

数据库认为比较重要的事件都会记录到告警文件和跟踪文件里。同时DBA也可以选择主动生成一些跟踪文件,用来跟踪指定事件的整个过程。

备份文件(backup file)

对数据库所包含的文件进行备份以后生成的文件。包括RMAN(专用的备份工具)所产生的特殊格式的备份文件以及用操作系统的复制命令生成的备份文件。

Oracle实例的总体结构如图1-1所示。它由SGA区和后台进程(每个椭圆形表示一个后台进程)组成。

图1-1 Oracle实例的总体结构

SGA本身是一块内存区域,根据作用的不同,在该区域里又可以再次细分为多个不同的内存池。

共享池(Shared pool)

Shared pool的主要作用在于提高SQL语句以及PL/SQL代码的执行效率。在该池里会缓存曾经执行过的SQL语句,以及SQL语句的执行计划;同时还缓存执行过的PL/SQL代码块,以及从PL/SQL源代码编译后得到的Oracle能够执行的机器码(也叫P code)。另外,该区域还包括在编译SQL语句或PL/SQL代码时所参照的数据字典的信息。

注 意 所谓数据字典就是指描述数据的数据,比如表的名字、列的名字、用户的权限等。

大池(Large pool)

Large pool是一个可选的内存池,其主要在于分担shared pool的压力。在某些情况下,比如备份恢复操作、I/O从属进程、并行查询等,如果没有配large pool的话,则这些操作所需要的内存就会从shared pool里进行分配,这时会增加shared pool的负担。

Java池(Java pool)

用于存放Java程序的调用方法。

数据块缓冲区(Database buffer cache)

用于缓存曾经读取过的数据,同时如果用户要修改某个数据,也都是先在该区域里进行修改,然后再写入数据文件的。通常来说,这是SGA里最大的内存区域。我们应该尽可能延长数据驻留在该区域里的时间,这样的话,下次访问同样的数据时就可以直接读取内存,而无须读磁盘上的数据文件了。

重做日志缓冲区(Redo log buffer)

这块区域里的数据就是联机日志文件的数据来源。数据库里的变化都是先存放在这块区域,然后再被写到联机日志文件里去的。

流池(Stream pool)

数据库中的流在工作时所需要用到的内存区域。

对于Oracle实例的另一个组成部分,也就是后台进程来说,我们可以把它们理解为一系列的程序,它们驻留在内存里。只要满足某种条件(比如每隔一定时间等)就会启动,去做某些事情。主要的后台进程包括以下五个。

系统监控(System Monitor,SMON)进程

其主要任务是在实例启动时,判断该实例上次是否是正常关闭的,如果是非正常关闭的,则进行实例恢复。另外,它还会合并相邻的可用空间等。

进程监控(Process Monitor,PMON)进程

其主要作用是监控用户的进程。如果某个连上来的用户由于某种原因非正常终止了,则PMON会负责清理该用户所占用的资源,比如事务锁、用户占用的内存等。

数据库写(Database Writer,DBWn)进程

其主要作用是将buffer cache里那些被更新过、但是还没有写入数据文件的数据写入数据文件。在图1-1中,我们可以看到数据从buffer cache,经由DBWn进程,最终写入数据文件里。这里的n表示可以有多个数据库写进程。DBWn是一个底层的进程,用户不能主动唤醒该进程。

日志写(Log Writer,LGWR)进程

将log buffer里的内容写入联机日志文件。

检查点(Checkpoint,CKPT)进程

检查点进程启动时,会唤醒DBWn进程,并将检查点位置(Checkpoint position)写入控制文件以及数据文件的头部(所谓数据文件的头部就是指数据文件的开始部分,大概占用几十KB的空间,这部分的空间不会存放用户的数据,而是存放有关数据文件的信息,比如数据文件何时创建等)。

注 意 检查点进程是一个非常重要的进程,同时其工作原理也非常复杂。具体介绍会在第5章中进行详细说明。

上面所描述的这五个进程对于Oracle实例的正常工作来说都是必需的,也就是说,其中任何一个进程停止工作的话,Oracle实例都将强制关闭,从而使Oracle服务器停止对外服务。

除了上述的五个进程以外,还有一个进程也是大部分生产库中都应该启动的,叫做归档进程(ARCn),这是个可以启动也可以不启动的进程。该进程的作用在于将当前写满了的联机日志文件复制到指定的目录中,这也就是所谓的归档。通过归档,我们就能够将数据库的变化永久保留下来。在图1-1中,我们可以看到,当LGWR进程将log buffer中的数据写入当前的联机日志文件时,如果发现该日志文件写满了,导致无法再写入了,则LGWR会切换到下一个可用的联机日志文件上去接着写,这个过程叫做日志切换(log switch)。如果数据库配置了ARCn进程,则当LGWR进行日志切换时,会唤醒ARCn进程对当前已经写满的日志文件进行归档。这里和DBWn一样,也有个n,同样表示数据库可以启动多个ARCn进程来进行归档。