您的位置:首页 > 数据库 > Oracle

共享模式和专有模式详解

2012-10-10 11:49 399 查看
转自:http://czmmiao.diandian.com/post/2012-04-15/18663503 专有模式和共享模式概述
专有模式:当一个用户请求连接到ORACLE的时候,ORACLE会专门的为这个user process 分配一个server process。
共享模式:一个server process可以服务多个user process.如果要使用这个功能,必须使用net services.也就是说必须配置tns。它适合用于高并发,事物量小,如果这个时候采用了共享模式,可以大大减少由于高度并发对于ORACLE服务器的资源消耗。缺点:由于它是用一个queue 来管理,所以只要有一个会话死了,那么后面的会话将等待,也就是该服务器进程上的所有用户将被阻塞,另外不能用共享模式执行批处理,大数据量的处理,不能应用于数据仓库。
专用服务器(DEDICATED): 每个客户进程与专用服务器进程连接。服务器进程没被任何另外的客户共享。 具体流程可参加下图



注意:专用服务器体系结构不支持HTTP和IIOP客户,仅支持TTC客户。
共享服务器(SHARED,也叫MTS Multi-Threaded Server):多个客户端连接对应一个服务器进程,服务器端存在一个进程调度器来管理。它必须使用net services.也就是说必须配置tns。它适合用于高并发,事物量小,如果这个时候采用了共享模式,可以大大减少由于高度并发对于ORACLE服务器 的资源消耗。 虽然MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,所减少的内存很 少。但是由于在MTS模式下使用SGA的Large_Pool来分配UGA,如果用户会话的连接和断开很频繁,数据库进程的创建和删除的开销会比专用模式 下小很多,如果不采用共享模式服务器,则应使用中间件的连接池技术。如果客户端一次连接终身使用(会话生命周期内),使用共享服务器模式的意义不大。因为大部分时间,一个会话就连接到一个服务器进程,无法共享服务器进程。
共享服务器体系:客户进程最终与一个调度程序连接,PMON进程注册了调度程序的位置和负荷,使监听器能够提交到负荷最小的调度程序。一个调度程序能并发地支持多重的客户连接。相信工作原理如下:
1.转发器Dispatcher接受到用户端的请求
2.请求被置入Request队列,并建立了类似电路的一条回路Circurt用来标识请求是来自哪个Client。
3.某个闲置的Server Process开始处理队列中的请求
4.SGA内存分配
5.将处理的结果置入Response队列
6.结果从Response Queue返回给Dispatcher
7.Dispatcher将结果最终返回给当初的Client
流程图如下



一般我们以oracle默认的专用服务器方式就行了,没必要使用共享服务器模式。一个是我们是使用中间件(如:weblogic)去连oracle的,中间件本身有连接池机制,另外就是oracle的这个共享服务器方式也做的不够好了,有诸多缺点。
共享服务器具有以下一些缺点:
1、共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢。
2、存在人为死锁的可能,因为它是串行的,只要一个连接阻塞,则该服务器进程上的所有用户都被阻塞,并且极可能死锁。
3、存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待,而专用服务器,每个客户端是一个会话。
4、共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,并且SQL_TRACE没有意义(因为是共享而不是当前会话的)。
5、不能执行DBA管理任务,如关闭数据库,备份、恢复等。
共享服务器和专用服务器的内存比较
假设一个应用程序访问Oracle的每个Session需要400KB的内存,每个服务进程的内存需要4MB,所分配的共享服务进程数为100个。现在有5000个客户连接,
则在Dedicated模式下:
内存=5000 * (400KB+4MB) = 22GB
Shared模式下:
内存=5000 * 400KB + 100 * 4MB = 2.5GB
共享服务初始化参数
shared_servers :指定了当instance 启动的时候 shared server process启动的数量,不要将这个参数设置得太大,否者启动数据库instance的时候就会花更多时间,Oracle启动过后会根据负载来动态调整 shared_servers。如果为0,表示数据库没有启动共享服务模式。 这个参数是配置shared server必须的,而且只有这个参数是必须的。
配置共享服务初始化参数:
1.设置shared_servers :指定了当instance 启动的时候 shared server process 启动的数量,不要将这个参数设置得太大,否者启动数据库instance 的时候 就会花更多时间,Oracle启动过后会根据负载来动态调整shared_servers。如果为0,表示数据库没有启动共享服务模式。 这个参数是配置shared server 必须的,而且只有这个参数是必须的。 如果将shared_servers参数置为0,那么所有以共享方式连接到数据库都不能成功,但是未释放的共享连接会继续保持连接,直到断开
2.设置max_shared_servers:ORACLE在同一个时刻最大能够使用的 shared server process.不要将这个参数设置小于 shared_servers,如果动态修改shared_servers大于max_shared_servers,ORACLE会覆盖 max_shared_servers的值,此时你需要修改max_shared_servers.同时也不能大于processes。这个参数是为了给 占用很大资源操作而设的(批处理),为了预留一些process 给DBA任务(rman备份)。 如果将shared_servers 和max_shared_servers都设为0,那么共享连接将被终结。所有的共享方式连接都断开了的话,就可以使用alter system set dispatcher=’’; 将dispatcher清除,防止下次启动数据库又打开了共享连接方式。
3.设置 shared_server_sesions: 指定了总共允许的的shared server session的数量。如果设置了这个参数,那么就不要将这个值超过sessions,如果没有设置这个值,那么只要还有空闲的session,就可以被 使用。设置这个值是为专有连接预留user sessions.
4.设置dispatchers:Dispatchers参数用于配置共享模式架构中dispatcher进程,共享模式只少需要一个 dispatcher进程。如果你没有指定dispatcher参数,但又把SHARED_SERVER设为非0值启用了共享模式,这样数据库会缺省创建 一个TCP协议的dispather,等同于设置为dispatchers="(PROTOCOL=tcp)",oracle 也会自动设置一个基于tcp协议的dispatcher。
如果还需要配置其它dispatcher,你可能通过指定以下属性:
ADDRESS:指定dispathers监听的网络地址,如(DESCRIPTION=(ADDRESS=...))
PROTOCOL:Specify the network protocol for which the dispatcher generates a listening endpoint. For example:(PROTOCOL=tcp)
DISPATCHERS:指定dispathers数量
CONNECTIONS:第个dispatcher最大允许的最大连接数
TICKS:启用连接池时,连接空闲超时时间,以10分钟为单位,1表示10分钟,2表示20分钟
POOL:是否起用连接池
SERVICE:指定dispathers注册的service
以上属性名称关键字,你可以用3位或3位以上的缩写,如你需要指定sessions=3,你可以写成ses=3,sess=3 或sessi=3类似方式
配置样例
配置2个TCP协议的dispatcher,指定端口为5000,地址为192.168.0.111和 3个TCPS协议的dispatcher
SQL> alter system set dispatchers="(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=5000))(DISPATCHERS=2)","(ADDRESS=(PROTOCOL=TCPS)(HOST=rac1))(DISPATCHERS=3)";
注意:dispatchers配置好后,就算监听不起,客户端也能通过dispatcher配置连接上数据库
5.设置 max_dispatchers:设置同一时刻能够同时运行的dispatchers的数量,必须大于等于 dispatchers ,小于processes。这个参数也会被dispatchers覆盖,如果dispatchers大于max_dispatchers。
6.circuits:指定了virtual circuits的总数量。
配置共享模式
具体步骤:
1. alter system set shared_servers=1;
2. 配置tnsnames.ora里的服务名,这里需要注意一定要配置SID ,不是SERVICE_NAME,如果不是配的SID会报ORA-12523: TNS 错误。
ORACLE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = bluo7)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = bluo7)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME = xxx)
)
)

SHARED_SERVER =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 16.178.115.186)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 16.178.115.186)(PORT = 1522))
)
(CONNECT_DATA =
(SID = robinson)
(SERVER = SHARED)
)
)
3.使用共享的方式连接到数据库 conn sys/oracle@shared_server as sysdba,但是这个时候不能关闭数据库,也不能打开数据库,不能备份和恢复。
4.查看共享方式连接数据库状态
select count(*),server from v$session where username is not null gorup by server;
这里的server字段中的none值表示会话没有活动,dedicated表示通过专用服务器连接,通过shared表示共享服务器连接
使用lsnrctl service查看
$ lsnrctl service
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 15-APR-2012 15:28:22
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=1521))(CONNECT_DATA=(SID=orcl)(SERVER=SHARED)))
Services Summary...
Service "orclXDB" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Handler(s):
"D000" established:1 refused:0 current:0 max:1022 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=61882))
常见问题
1、large_pool_size这个参数我该设为多大呢?
当large_pool_size的大小能够满足所有的共享服务进程所需的内存就可以了,当然如果内存够用的话可以适当的加大一点,如下的语句便可以得出自实例启动来MTS连接所用的内存的最大数量,可以看出来是200多M。
SELECT sum(value) "Max MTS Memory Allocated"
FROM v$sesstat ss, v$statname st
WHERE name = 'session uga memory max'
AND ss.statistic#=st.statistic#
Max MTS Memory Allocated
------------------------
214457296
2、如何判断我dispatcher的数量是不是够用呢?
用如下的语句,当dispatcher的繁忙比率超过50%的时侯,你就要考虑增加Dispatcher的数量了,用Alter system动态却可完成。
SELECT name, (busy / (busy + idle))*100 "Dispatcher % busy Rate"
FROM V$DISPATCHER
3、如何判断共享服务进程是不是够用呢?
使用如下的语句来确定每次请求的平均等待时间,监测Average Wait time per reques这个值,当这个值持续增长时你该考虑增加shared servers了。
SELECT decode(totalq,0,'No Requests') "Wait Time",
Wait/totalq ||'hundredths of seconds' "Average Wait time per request"
FROM V$QUEUE
WHERE type = 'COMMON'
4、如何在MTS配置的Server请求Dedicate的连接着?
你在Tnsnames.ora中做服务名配置时加入SRVR=DEDICATED这个选项就可以了,示例如下:
billing =
(DEscrīptION =
(
ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = ks3)(PORT = 1521))
)
(
CONNECT_DATA =
(SERVICE_NAME = billing)
(SRVR = DEDICATED)
)
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息