Oracle数据库从入门到运维实战
上QQ阅读APP看书,第一时间看更新

1.1 实例的体系结构

当用户访问数据库时,需要在操作系统中运行相关的应用程序,如SQL*Plus,启动用户进程。用户进程通过实例访问数据库。实例和数据库组成了数据库服务器,一个数据库服务器中至少有一个实例。在单机环境中,实例和数据库是一一对应的,一个实例只能和一个数据库建立关联关系,一个数据库也只能被一个实例加载。在RAC环境中,一个数据库可以对应多个实例,用户进程可以通过任何一个实例访问数据库。

在本节将主要介绍“实例的概念”及“实例的构成”。

1.1.1 实例的概念

实例(Instance)是一组内存结构和后台进程的集合。当用户访问数据库时,在数据库服务器端首先要启动一个实例,在内存中分配一定的存储空间,并启动一些后台进程。内存空间的作用是存储与用户访问有关的重要数据,后台进程的功能是监视系统的运行状态,并负责在实例和数据库之间交换数据。在支持线程的操作系统中,这些后台进程以线程的方式运行。

用户访问数据库的操作是通过实例来完成的。实例通过后台进程与数据库中的文件进行交互,将用户修改过的或新增加的数据写入文件,而用户对数据的所有访问都是在实例的内存结构中进行的。引入实例的好处是显而易见的:数据位于内存中,用户读/写内存的速度要比直接读/写磁盘快得多,而且内存中的数据可以在多个用户之间共享,从而提高了数据访问的并发性。

Oracle适用于大型的应用系统,如果有成千上万个用户同时访问数据库时,采用并发能力不强的数据库是件不可思议的事情。由此可见,Oracle的实例对于数据库的性能是多么的重要。

1.1.2 实例的构成

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

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

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

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

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

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

由此可见,实例中的内存结构包括SGA和PGA两部分。SGA是所有用户共享的,它在实例的运行过程中一直存在。严格地说,PGA并不属于实例,它是服务器进程的一部分,是用户进程私有的,是一种临时的内存结构。Oracle允许成千上万个用户同时访问数据库,并提供了一种巧妙的机制来确保用户对数据的安全、高效访问。在Oracle实例中包含一组后台进程,它们负责完成复杂的数据访问和维护工作。在Oracle实例中可以启动以下后台进程:SMON(系统监视进程)、DBWR(数据库写进程)、PMON(监控和管理进程)、CKPT(检查点进程)、LGWR(日志写进程)、ARCH(归档日志进程)、RECO(恢复进程)。其中有些进程是必须启动的,而另外一些是可选的。在默认情况下,实例将启动SMON(系统监视进程)、DBWR(数据库写进程)、PMON(监控和管理进程)、CKPT(检查点进程)、LGWR(日志写进程)和ARCH(归档日志进程)6个后台进程(参照图1-1)。

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

图1-2