天天看点

Oracle体系结构-概述

一、数据库和实例

数据库是磁盘上存储的数据集合,实例是一组后台进程和共享内存。实例只能装载并打开一个数据库,数据库可以由一个或多个实例(使用RAC)装载和打开。

二、SGA和后台进程

Oracle体系结构-概述

1、SGA

Oracle有一个很大的内存块,称为系统全局区(SGA),做以下工作:

a)维护所有进程需要访问的多种内部数据结构;

b)缓存磁盘数据,另外重做数据写入磁盘数据前先在这里缓存;

c)保存已解析的SQL计划;

等等。

2、后台进程

Oracle有一组“附加到”SGA的进程,附加机制因操作系统而异。在Unix环境,这些进程会物理地附加到一个很大的共享内存段,这是操作系统中分配的一个内存块,可以由多个进程并发地访问(通常要使用shmget()和shmat())。

在Windows中,这些进程只是使用C调用(malloc())来分配内存,因为它们实际上是一个大进程中的线程,所以会共享相同的虚拟内存空间。Oracle还有一组供数据库进程/线程读写的文件(只允许Oracle进程读写这些文件)。这些文件保存了所有的表数据、索引、临时空间、重做日志等。

三、连接Oracle

Oracle服务器处理请求有两种最常见的方式:专用服务器连接和共享服务器连接。要想登录数据库并在数据库中真正做事情,必须先连接。

1、专用服务器

在专用服务器连接里面,当用户登录Oracle的时候会创建一个新的进程,这个服务器进程会在用户的会话生存期中专门为用户服务。对于每个会话,都会出现一个新的专用服务器,会话与专用服务器之间存在一对一的映射。这个专用服务器不是实例的一部分,客户端进程会通过某种网络通道(如TCP/IP socket)与这个专用服务器直接通信,并由这个服务器进程接受和执行用户的SQL。如有必要,它会读取数据文件,并在数据库的缓存中查找我要的数据。也许它会完成用户的更新语句,也可能会运行用户的PL/SQL代码。这个服务器进程的主要目标就是对用户提交的SQL调用做出响应。专用服务器请求的流程如下:

Oracle体系结构-概述

2、共享服务器

共享服务器的正式说法是多线程服务器(Multi-Threaded Server)或MTS。如果采用这种方式,就不会对每条用户连接创建另外的线程或新的UNIX进程。在共享服务器中,Oralce使用一个“共享进程”池为大量用户提供服务。共享服务器实际上就是一种连接池机制。

共享服务器连接与专用服务器连接之间有一个重大区别,与数据库连接的客户进程不会与共享服务器直接对话,原因就在于这个服务器进程是共享的。为了共享这些进程,还需要另外一种机制,通过这种机制才能与服务器进程“对话”。为此,Oracle使用了一个或一组称为调度器(dispatcher,也称分派器)的进程。客户进程通过网络与一个调度器进程通信。这个调度器进程将客户的请求放入SGA中的请求队列(这也是SGA的用途之一)。第一个空闲的共享服务器会得到这个请求,并进行处理。处理完成后,共享服务器会把响应放在原调度器(即接收请求的调度器)的响应队列中。调度器进程一直在监听这个队列,发现有结果后,就会把结果传给客户。共享服务器请求的流程如下:

Oracle体系结构-概述

3、TCP/IP连接的基本原理

这里将分析网络上最常见的一种情形:在TCP/IP连接上建立一个基于网络的连接请求。在这种情况下,客户在一台机器上,而服务器驻留在另一台机器上,这两台机器通过一个TCP/IP网络连接。客户率先行动,使用Oracle客户软件(Oracle提供的一组应用程序接口,或API)建立一个请求,力图连接数据库。例如:客户可以发出以下命令:

sqlplus scott/[email protected]
           

这里,客户端是程序SQL*PLUS,scott/tiger为用户名/密码,orcl是一个TNS服务名。TNS代表透明网络底层(Transparent Network Substrate),这是Oracle客户中处理远程连接的“基础”软件,有了它才有可能建立对等通信。TNS连接串告诉Oracle软件如何与远程数据库连接。一般地,你的机器上运行的客户软件会读取一个tnsnames.ora文件。这是一个纯文本的配置文件,通常放在$ORACLE_HOME/network/admin目录下。例如以下配置:

tns_orcl =
(DESCRIPTION =
    (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
        (SERVICE_NAME = orcl)
    )
)
           

根据这个配置信息,Oracle客户端软件可以把我们使用的TNS连接串tns_orcl映射到某些有用的信息,也就是主机名、主机监听器进程接受监听连接的端口、数据库服务名等等。服务名表示具有公共属性、服务级阈值和优先级的应用组。提供服务的实例数量对应用是透明的,每个数据库实例可以向监听器注册,表示要提供多个服务。所以,服务就映射到物理的数据库实例,并允许DBA为之关联阈值和优先级。

3.1 通过专用服务器连接

如果建立一条专用服务器连接,监听器进程就会为我们创建一个专用服务器。在UNIX上,这是通过fork()和exec()系统调用做到的(在UNIX中,要在初始化之后创建新进程,唯一的办法就是通过fork())。这个新的专用服务器进程继承了监听器建立的连接,现在就与数据库物理地连接上了。在Windows上,监听器进程请求数据库进程为连接创建一个新线程。一旦创建了这个线程,客户就会“重定向”到该线程,相应地就能建立物理连接。如下图所示:

Oracle体系结构-概述

3.2 通过共享服务器连接

另一方面,如果我们发出共享服务器连接请求,监听器的表现会有不同。监听器进程知道实例中运行了哪些调度器。接受到连接请求后,监听器会从可用的调度器池中选择一个调度器进程。监听器会向客户返回连接信息,其中说明了客户如何与调度器进程连接;如果可能的话,还可以把连接“转发”给调度器进程(这依赖于不同的操作系统和数据库版本,不过实际效果是一样的)。监听器发回连接信息后,它的工作就结束了,因为监听器一直在特定主机的特定端口上运行,而调度器会在服务器上随意指派的端口上接受连接。监听器要知道调度器指定的这些随机端口号,并为我们选择一个调度器。客户再与监听器断开连接,并与调度器直接连接。现在就与数据库有了一个物理连接。如下图所示:

Oracle体系结构-概述

完毕。