4.1.2 实例的组成

当数据库服务器启动时,首先启动实例,然后加载并打开数据库。当用户访问数据库时,数据库服务器便为用户进程启动一个服务器进程,负责处理用户进程的所有请求,例如将用户访问的数据从数据文件读到内存中。

在计算机的内存中不仅要存储数据库中的数据,还要存储数据字典的信息、重做日志以及经过解析的SQL代码等。实例中的这部分内存结构叫做系统全局区(SGA, System Global Area)。

SGA是实例中最重要的组成部分,一个实例只有一个SGA。SGA中的数据可以在多个用户进程之间共享。SGA由若干个缓存和缓冲池组成,不同类型的数据存储在不同的缓存和缓冲池中。SGA的大小可以定制,通过在参数文件中为各个缓存和缓冲池分别指定大小,可以确定SGA的大小。

用户对数据的操作实际上是在SGA中进行的,当启动数据库服务器时,首先启动实例,然后数据库被打开。当用户进程向服务器进程发出请求时,服务器进程将用户请求的数据读到SGA中,用户对数据的所有访问直接在SGA中完成,其他用户进程也可以在SGA中访问相同的数据。当关闭实例时,未保存的数据写入数据文件中,SGA被撤销,所有的数据从SGA中清除。

当用户访问数据库时,实例为用户进程启动一个服务器进程,并分配一段内存区,用来保存用户进程的私有信息和控制信息,这段内存区叫做进程全局区(PGA, Process Global Area)。

SGA是所有用户进程共享的,只要实例被启动,无论是否有用户访问数据库,SGA都存在。而PGA是用户进程私有的,当用户进程向数据库服务器发出请求时,实例为用户进程分配PGA,当用户进程结束时,PGA自动释放。

由此可见,实例中的内存结构包括SGA和PGA两部分。SGA是所有用户共享的,它在实例的运行过程中一直存在。严格地说,PGA并不属于实例,它是服务器进程的一部分,是用户进程私有的,是一种临时的内存结构。

Oracle允许成千上万个用户同时访问数据库,并提供了一种巧妙的机制来保证用户对数据的安全、高效访问。在Oracle实例中包含一组后台进程,它们负责完成复杂的数据访问和维护工作。在Oracle实例中可以启动以下后台进程:SMON, DBWR, PMON, CKPT, LGWR, ARCH, RECO。其中有些进程是必须启动的,而另外一些是可选的。在默认情况下实例将启动SMON、DBWR、PMON、CKPT和LGWR等五个后台进程。

实例的组成如图4.2所示。在接下来的几节中,我们将分别对实例的内存结构和后台进程进行详细的介绍。

figure_0160_0033

图 4.2 实例的组成