oracle体系结构概述

阅读更多
本系列主要参考《Oracle Database 9i/10g/11g编程艺术》第二版  -Thomas kyte著

书中有段话:
通常解决问题有简单方案和复杂方案,而选择后者居多,这并不是故意,只是出于无知。

此书推荐
引用
“针对不同数据库写不同的程序,而不是写一个可随意移植到不同数据库的程序,代价高而且不能充分利用不同数据库的特性。”
这与通常使用通用ORM框架不同,实际上一般也就是小型程序才完全采用ORM框架。

1.oracle体系结构概述
1.1 定义数据库和实例
在oracle领域中有两个词很容易混淆,这就是“ 实例”instance和“ 数据库”database。作为oracle术语,这两个词定义如下:
数据库:物理操作系统文件或磁盘的集合。使用oracle的自动存储管理(Automatic Storage Management, ASM)或RAW分区时,数据库可能不作为操作系统中单独的文件,但定义仍然不变。

实例一组Oracle后台进程/线程以及 一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里可以维护易失的,非持久性内容(有些可以刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。有点程序和进程的关系。

这两个词有时可以互换使用,不过二者的概念完全不同。实例和数据库之间的关系是: 数据库可以由多个实例装载和打开,而实例可以在任何时间点装载和打开一个数据库。实际上准确地讲,实例在其整个生存期中最多能装载和打开一个数据库。
实例就是一组操作系统进程以及一些内存。这些进程可以操作数据库;而数据库只是一个文件集合(包括数据文件,临时文件,重做日志文件和控制文件)。在任何时刻,一个实例只能有一组相关的文件(与一个数据库关联)。

1.2 SGA和后台进程
下图以最简单的形式展示了Oracle实例和数据库。Oracle有一个很大的内存块,称为系统全局区(SGA),在这里他会做以下工作:
<Oracle-1> oracle体系结构概述_第1张图片
1. 维护所有进程需要访问的多种内部数据结构;
2. 缓存磁盘上的数据,另外重做数据写至磁盘之前先在这里缓存;
3. 保存已解析的sql计划等等。

Oracle有一组附加到SGA的进程,附加机制因操作系统而异。在Unix环境中,这些进程会物理地附加到一个很大的共享内存段,这是操作系统中分配的一个内存块,可以由多个进程并发地访问(通常要使用shmget()和shmat())。在windows中,这些进程只是使用C调用(malloc())来分配内存,因为他们实际上是一个大进程中的线程,所以会共享相同的虚拟内存空间。
Oracle还有一组供数据库进程/线程读写的文件(只允许Oracle进程读写这些文件)。这些文件保存了所有的表数据、索引、临时空间、重做日志等。

1.3 连接oracle
Oracle服务器处理请求有两种最常见的方式,分别是 专用服务器(dedicated server)连接共享服务器(shared server)连接。要想登陆数据库并在数据库中真正做事情,必须先连接,下面会说明建立连接时客户端和服务器会发生什么。

1.3.1 专用服务器
按最常用的配置连接Oracle,如下图所示:
<Oracle-1> oracle体系结构概述_第2张图片

登录时,Oracle总会为客户创建一个新的进程。这通常称为专用服务器配置,因为这个服务器进程会在客户的 会话生存期中专门为客户服务。 对于每个会话,都会出现一个新的专用服务器,会话与专用服务器之间存在一对一的映射。按照定义,这个专用服务器不是实例的一部分。连接数据库的程序会通过某种网络通道(如socket)与这个专用服务器直接通信,并由这个服务器进程接收和执行sql。如果必要,他会读取数据文件,并在数据库的缓存中查找需要的数据。

1.3.2 共享服务器
Oracle还可以接受另一种方式的连接,这称为共享服务器(shared server)。如果采用这种方式,就不会对每条用户连接创建另外的线程或新的unix进程。

在共享服务器中, Oracle使用一个 "共享进程”池为大量用户提供服务。 共享服务器实际上就是一种连接池机制。利用共享服务器,我们不必为10000个数据库会活创建10 000个专用服务器(这样进程或线程就太多了) .而只需建立很少的一部分进程/线程,顾名思义,这些进/线程将由所有会话共享。这样Oracle 就能让更多的用户与数据库连接,否则很难连接更多用户。采用共享服务器模式.共享进程通常与数据库一同启动,使用ps 命令可以看到这个进程.

共享服务器连接和专用服务器连接之间有一个重大区别。 与数据库连接的客户进程不会与共享服务器直接通信,但专用服务器则不然,客户进程会与专用服务器直接通信。之所以不能与共享服务器直接对话,原因就在于这个服务带进程是共享的。为了共享在这些进程,还需要另外一种机制.通过这种机制才能与服务器进程"对话”. Oracle 使用一个或一组称为调度程序(dispatcher, 也称分派程序)的进程。客户进程通过网络与一个调度程序进程通信。这个调度程序进程将客户的请求放入SGA 中的请求队列(这也越SGA 的用途之一) . 第一个空闲的共享服务器会得到这个请求,并进行处理(例如,请求可能是update T set x=x+5 where Y = 2)。完成这个命令后,共享服务器会把响应放在原调度程序(即接收请求的调度程序)的响应队列中。 调度程序进程一直在监听这个队列,发现有结果后,就会把结果传给客户。从概念上讲,共享服务器请求的流程如下图所示:
<Oracle-1> oracle体系结构概述_第3张图片

1.3.3 服务器模式的选择(此部分至1.3.6小节参考http://www.itpub.net/thread-1714191-1-1.html)
1. 合适选用共享服务器的情景:
  (1)前台客户端数量比较多。
  (2)服务器内存限制比较大。
用户若在一些老的服务器上部署Oracle数据库的话,因为其主板对内存的升级有所限制,所以,为了得到一个不错的数据库性能,往往采用共享服务器模式。如此,即时同时访问数据库的用户有所增加,其内存也不会有多大的影响。可以大大的降低内存的压力。

2.某些特定功能要求采用共享服务器模式。
  比较典型的,如Oracle数据库服务器的连接共享、连接集中与负载均衡技术等等。他们必须在共享模式下才能够运行。
   负载均衡用来在群集环境下实现多机共享数据库,以保证应用的高可用性。同时可以自动实现并行处理以及均分负载,还能够实现数据库在故障时的容错和无断点恢复。所以,在一些对于性能与稳定性要求比较高的应用场景中,如银行中,往往都会采用负载均衡技术。此时,数据库管理员在配置数据库的时候,就需要考虑采用共享服务器模式。

3. 共享服务器好处
(1、减少操作系统进程/线程数
    在一个有上千用户的系统上,如果操作系统力图管理数千个进程,可能很快就崩溃了。如果使用共享模式,可以有效的管理活动的部分用户,效率大大提高,操作系统可以避免了上下文切换。
(2、刻意的限制并发度
   如果并发数过大,到一定程度,即使用户量再增加,每秒中完成的相应事物也不会增加。吞吐量到达一定峰值后会下降。利用共享服务器,可以把系统并发度限制到合理的数量上。
(3、减少系统所需的内存
   可以减少所需内存量,但是在自动PAG内存管理以后,意义不是很大。

1.3.4 服务器模式的设置
1. 启用专用服务器
dedicated servers不需要专门的设置,这个是oracle的默认选项。
2. 启用共享服务器
要切换到共享模式,可以使用以下步骤:
A.设置初始化参数 SHARED_SERVERS 大于0,可以使用alter system命令动态的设置也可以在spfile里面修改初始化参数SHARED_SERVERS 的值大于0,然后shutdown  oracle,然后restart oracle  即可启动共享模式,其他的共享服务器参数可以不用设置
  参考语句:
  alter system set shared_servers = 1 scope=both ;
  alter system set max_shared_servers = 5 scope=both ;

B.设置dispatchers 参数,可以采用下面的方法设置:
  alter system set dispatchers="(PROTOCOL=TCP) (SERVICE=yzdbXDB)(SERVICE=yzdb)";

  前面表示的是协议,后面的service 分别指定要采用共享服务器模式的服务名称。oracle文档上说该步骤不是必须做的,但是我在实际中发现如果只是设置了shared_server参数,而把dispatches参数设置为空的话,不能启动共享服务器,使用上面的模式指定只启动某个服务的共享模式,如果要设置所有服务都使用共享模式,则设置为:
  alter system set dispatchers='(PROTOCOL=TCP)';

C.在客户端的tnsnames.ora 的tns设置中,在 CONNECT_DATA 设置一项中增加 (server=shared )一项,即可使用共享服务器连接。
  如果服务器端没有启动共享服务器模式,而客户端使用shared方式连接的话,会出现错误提示:
  “ORA-12520: TNS: 监听程序无法找到需要的服务器类型的可用句柄”;

关闭调度进程:
首先要查询到DISPATCHERS的NAME: SELECT NAME,NETWORK FROM V$DISPATCHER;
然后关闭调度进程:ALTER SYSTEM SHUTDOWN IMMEDIATE 'D000';

1.3.5 判断数据库使用的连接模式
1. 查看当前数据库服务器的连接模式
查看当前数据库服务器的运行情况有一下几种办法:
A.从v$session里面查看:
SQL> select distinct server from v$session ;  
SQL>
SERVER
---------
DEDICATED
NONE
SQL>
如果显示的除了dedicated,还有NONE,则说明当前启动了共享服务器,并且server为none的会话正使用共享服务器连接,
同时,如果只显示有dedicated,则不能说明服务器就一定工作在专用服务器下面,此时只能说明有可能启动了共享模式,但是无连接。


可以使用下面的语句查询采用共享服务器的会话信息:
select saddr,program ,server from v$session;
SQL> /
SADDR    PROGRAM                                          SERVER
-------- ------------------------------------------------ ---------
296FB24C plsqldev.exe                                      NONE
296FFD1C [email=oracle@B851]oracle @B851[/email] (q001)                               DEDICATED
29705AA0 [email=oracle@B851]oracle @B851[/email] (q000)                               DEDICATED

B.查询视图:
在网上有的资料上说只要查询下面三个视图,有记录则说明启动了共享模式,经过验证,具体情况如下:
select * from v$shared_server; ---有记录,且STATUS字段为WAIT(COMMON),则说明启动共享;
status为TERMINATED或者无记录,则说明没有启动共享服务器
select * from v$dispatcher; --有无记录都不能说明启动共享服务器,只能说明是配置了dispatchers参数
select * from V$CIRCUIT ; --有记录说明当前有使用共享模式的连接,无记录则不能判定服务器模式

2. 客户端建立的连接模式
A.当服务器采用专用服务器模式时,客户端只能使用专用模式连接,也就是在connect_data数据中只能使用 server=dedicated。
B.当服务器采用共享服务器模式时,客户端可以选择建立共享还是专用连接,connection,只要在 connect_data 中指定server=dedicated or server=shared

大多数情况下我们更倾向或习惯专用模式,两种模式下,对sga等分配都会有不同,所以如果转换成mts模式,别忘了sga也是需要调整的。最典型的是 mts模式需要较大的large_pool_size。如果真想转换还是仔细看看oracle关于mts的文档。共享连接只是把连接SESSION信息放 在LARGE POOL,所以LARGE POOL要大一些。而专用连接的SESION信息放在PGA。

1.3.6 禁用共享服务器模式
禁用的实验:
alter system set shared_servers = 0 ;
alter system set max_shared_servers = 0 ;
在已经建立共享模式的客户端执行查询,一直处于等待,查看视图:
SQL> select circuit,saddr,status,queue from v$circuit;
CIRCUIT  SADDR    STATUS           QUEUE
-------- -------- ---------------- ----------------
27434010 296F8CE4 NORMAL           COMMON
2743471C 296FB24C NORMAL           NONE
2 rows selected.

SQL> select program,saddr,server,status from v$session
where saddr in ('296F8CE4','296FB24C');

PROGRAM                                          SADDR    SERVER    STATUS
------------------------------------------------ -------- --------- --------
plsqldev.exe                                     296F8CE4 NONE      INACTIVE
plsqldev.exe                                     296FB24C NONE      INACTIVE
2 rows selected.SQL> 恢复参数值:
SQL>

alter system set shared_servers = 1;
System altered.
SQL> alter system set max_shared_servers = 5;
System altered.
SQL>

前台的查询恢复正常,查看视图:
SQL> select circuit,saddr,status,queue from v$circuit;
CIRCUIT  SADDR    STATUS           QUEUE
-------- -------- ---------------- ----------------
27434010 296F8CE4 NORMAL           NONE
2743471C 296FB24C NORMAL           NONE
2 rows selected.
SQL>
  • <Oracle-1> oracle体系结构概述_第4张图片
  • 大小: 97.4 KB
  • <Oracle-1> oracle体系结构概述_第5张图片
  • 大小: 71.5 KB
  • <Oracle-1> oracle体系结构概述_第6张图片
  • 大小: 73.7 KB
  • 查看图片附件

你可能感兴趣的:(数据库,实例,专用服务器连接,共享服务器连接)