一、概述
大型软件需要有好的架构支撑,此处描述oracle体系结构,从运行期的进程/线程、内存体系结构和静态的文件描述。本来我想按照五种架构视图的运行架构和数据架构来写的,但是想想怕这么写不够严谨,所以还是按照Kyte大叔的分类来写吧。
二、数据库和实例
数据库是磁盘上存储的文件的集合。
实例是运行期的一组后台进程/线程和共享内存的集合。注意此处是后台进程,专用服务器不属于后台进程,但是为什么共享服务器属于呢?Oracle运行时候以多进程还是以多线程的形式运行,跟不同操作系统的实现版本有关的,Linux上是多进程,Window上是多线程。后续以多进程术语描述其运行期进程/线程,大家知道不同os实现不同就行。
数据库可以同时有多个实例连接,而实例在生存周期内只能管理一次数据库。
别的dbms中的数据库的概念跟oracle中数据库的概念本身就有些不同,mysql创建一个数据库是一个很简短的过程,而Oracle却很漫长,为何?
三、专用服务器和共享服务器
客户端,如sqlplus发起一次客户请求,服务端会有进程来接受并处理客户的请求。监听连接请求的是TNS监听程序,但是在监听到客户连接请求后,后续的交互过程TNS监听程序就不在干预。按照后续处理方式的不同,处理客户请求的进程分为专用服务器(Dedicated Server)和共享服务器(Shared Server)。
专用服务器连接时,为每一个用户连接请求启动一个进程,并处理这个客户端后续所有的请求,看起来就像这个客户端独占了到服务器的一个通道一样。
共享服务器连接下,客户端跟共享服务器是多对多的方式进行交互,一个客户端的的请求可能由多个服务器来处理,一个服务器进程可以处理多个客户端的请求,当然每次请求由一个服务器进程处理,每个服务器进程每次只能处理一个客户请求。当请求发到调度程序时候,调度程序把请求放入到SGA的请求队列,等待空闲的共享服务器来请求队列获取请求并进行处理。处理后,会把结果放入到SGA中的响应队列,调度程序拿响应信息返回给响应的客户端。
四、客户端连接服务器的过程
客户端连接服务器的时候,会根据连接标识符,也叫TNS服务名到%ORCLE_HOME%\NETWORK\ADMIN\ tnsname.ora 文件查找对应的主机ip和端口号以及协议,然后发起连接
C:> sqlplus scott/tiger@orc11gr2
此处连接标示符为orc11gr2,到我的目录下查找到的连接信息为:
ORC11GR2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = yymt)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orc11gr2)
)
)
如果连接的时候没有连接描述符则到注册表如下路径下查找ORACLE_SID的键值
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1
找到对应的主机和端口后,就发起一个连接请求,此处为tcp请求,发给服务器上的TNS监听程序,监听程序接收到请求后,根据是共享服务器还是专用服务器来进行不同的后续处理。
这个连接标识符也可以用其他方式来解析,如Oracle Internet目录,这是一个分布式LDAP服务器等,起作用相当于解析主机名的DNS。不过tnsname.ora通常只适用于大多数中到小型安装,这种情况下这个配置文件的副本不是太多。
4.1、专用服务器连接
如果是专用服务器连接,监听程序则创建一个新的进程来处理后续的客户请求。创建的进程就是专用服务器进程。
4.2、共享服务器连接
如果是共享服务器连接,监听程序则返回一个调度程序的端口号给客户端,客户端后续请求都通过该端口号跟调度程序通信。当请求发到调度程序时候,调度程序把请求放入到SGA的请求队列,等待空闲的共享服务器来请求队列获取请求并进行处理。处理后,会把结果放入到SGA中的响应队列,调度程序拿响应信息返回给响应的客户端。
一个数据库服务器可以同时存在专用服务器连接和共享服务器连接。总体的运行情况如下:
通过什么方式知道当前数据库是共享服务器连接还是专用服务器连接呢?
1、新连接一个sqlplus客户端前后系统里oracle相关进程或线程的数量
2、其他的方法呢?