一个运行着的Oracle数据库可以看做一个Oracle服务器,Oracle服务器提供一个开放的、全面的、完整的信息管理平台,它由数据库和实例组成。Oracle实例是访问数据库的一种方法,一次可以打开且只能打开一个数据库,负责数据库相应操作并与用户交互,它由SGA内存结构和管理数据库的后台进程组成。SGA即System Global Area的缩写,系统全局区作为Oracle实例的基本组成部分,在实例启动的时候分配。SAG主要有数据高速缓冲区(Database Buffer Cache)、共享池(Shared Pool)、重做日志缓冲区(Redo Log Cache)、大型池(Large Pool)、Java池(Java Pool)、流池(Streams Pool)和其他结构(如固定SGA和锁管理等)组成。
其中,共享池用于存储最近执行的SQL语句和最近使用的数据字典数据。这些SQL语句可以是用户进程提交的,也可以是从数据字典读取的(在存储过程的情况中)。数据库缓冲区高速缓存用于存储最近使用的数据,这是通过最近最少使用LRU算法来实现的,并使用参数DB_BLOCK_SIZE确定主块的大小,在32位系统中,块缓冲区高速缓存最大可达到1.7G,在64位系统上,块缓冲区高速缓存最大可达到10G。块缓冲区高速缓存的大小可以使用ALTER SYSTEM动态调整。重做日志缓冲区用于跟踪服务器和后台进程对数据库所做的更改,它的主要目的是为了恢复,其中的重做条目包含了重做的信息,该缓冲区可以通过LOG_BUFFER来定义其大小。大型池是在共享服务器环境下的一个可选区域,它可以减轻共享池的负担,与共享池不同的是它不使用LRU列表。
一个Oracle进程是根据其进程类型来完成信息请求、执行一系列步骤或者是特定任务的,包括用户进程和数据库进程两种类型。用户进程是在一个数据库用户或一个批处理连接到DB时启动的;数据库进程又分为服务器进程和后台进程,服务器进程连接到Oracle实例,在用户建立会话时启动,后台进程在启动Oracle实例时启动。注意连接是用户进程与数据库实例之间的通信路径,会话是用户通过用户进程到数据库实例的特定连接。
用户进程是一个请求与服务器交互的程序,它必须先建立一个连接,并不能与服务器直接进行交互。服务器进程则能够与Oracle服务器直接进行交互,它是为用户进程服务的进程,分为专用服务进程和共享服务进程。专用服务进程是一个服务进程对应一个用户进程,共享服务进程是一个服务进程对应多个用户进程,轮流为用户进程服务。Program Global Area(PGA)是用来保存与用户进程相关的内存段,PGA总是由进程或线程在本地分配,其他进程与线程无法访问。User Global Area(UGA)是保存会话登录等与会话相关信息的内存区,对于专用服务器进程,UGA在PGA中分配。对于共享服务器,UGA在SGA的Large pool中分配。PGA/UGA一般保存了用户的变量、权限、堆栈、排序(Sort)空间等信息。影响PGA/UGA最大的也就是Sort信息,由初始化sort_area_size决定,由于Sort信息分配在UGA中,所以共享服务器中能更好地利用内存。
后台进程负责维护物理数据库和内存结构之间的关系,根据配置情况,Oracle实例可以包含多个后台进程,但是每个进程都必须包含以下几个必需的后台进程:数据库写入进程(DBWn)负责将更改的数据从数据库缓冲区高速缓存写入数据文件;日志写入进程(LGWR)将重做日志缓冲区中注册的更改写入重做日志文件;系统监视进程(SMON)检查数据库的一致性,如果有必要还会在数据库打开时启动数据库的恢复;过程监视器(PMON)负责在一个Oracle进程失败时清理资源;检查点进程(CKPT)负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
系统改变号(System Change Number)是一个贯穿数据库全局的概念,它是由系统内部维护的序列号。当系统需要更新的时候自动增加,它是系统中维持数据一致性和顺序恢复的重要标志。查询语句不会使SCN增加,就算是同时发生的更新,数据库内部对应的SCN也是不同的。这样一来就保证了数据恢复时候的顺序。