配置共享服务器模式
--======================
-- 配置共享服务器模式
--======================
一、服务器的两种模式:专用服务器模式、共享服务器模式
1.共同点:
两者完成相同的任务,即处理所有指定的SQL操作。假定从客户端提交一个任意查询(DQL)到数据库服务器不论是专用模式还是共享
模式都将对给出的SQL查询进行语法分析并生成执行计划放置到共享池(如果共享池中已有,则省略该步骤)。接下对变量等执行绑定
过程,绑定完毕后开始执行。如果数据缓冲区已有该数据的数据块则直接返回给客户端,否则从数据文件中读取数据。
两者都是完成四个过程:SQL语句-->分析-->绑定-->执行-->返回结果
2.Oracle 数据库服务器中的几类进程
用户进程 -->位于客户端,比如服务器位于Unix系统,客户端为Winxp,用户进程实际上处于Winxp系统
服务器进程 -->位于服务器端,响应客户端的请求,通常为大量消耗CPU资源的进程,比如执行排序、聚合、联结等等
后台进程 -->位于服务器端,负责后台数据的读写、归档、监控等等(DBWn、LGWR、CKPT、PMON、SMON、ARCn等)
3.专用服务器模式:
是一个一对一的模式,即一个客户端产生一个服务器进程(在通Oracle Net成功连接之后)
该类服务器进程通过TCP或TCPS等直接建立连接,且此类服务器进程不为实例所有
该类服务器进程一旦建立,直到退出和关闭该会话相关的资源才被释放
建立服务器进程的过程(参照Expert Oracle Database Architecture: 9i and 10g Programming Techniques and Solutions)
-->①Client Connection Request -->②Listener -->③fork()/exec() -->④Server Process-->①
客户端发出连接请求到侦听器,建立连接之后,调用fork()和exec()产生一个Server Process,接下来该服务器进程直接和客
户端进程通信
对于Win平台,Listener进程请求数据库进程为新的连接创建一个新的线程,一旦该线程被创建,客户端将重定向到新线程进行
直接连接
--查看服务器后台建立的服务器进程
[oracle@robinson udump]$ ps -ef | grep oracleorcl -->local=no表示非本地客户端进程,=yes为本地客户端进程
oracle 5454 4723 0 19:08 ? 00:00:01 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 5488 1 0 19:10 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle 5533 1 0 19:30 ? 00:00:00 oracleorcl (LOCAL=NO)
4.共享服务器模式:
配置共享模式后,在实例在启动时,多出了两类新的进程类型:调度进程(Dispatcher)和共享服务器进程(Shared server processes)
可以使用一个或多个调度进程(d001,d002,d003...)
也可以使用一个或多个共享服务器进程(snnn,snnn,snnn)
此外会在SGA共享池内开辟部分空间来用作队列的存储,包含请求队列、响应队列
如果配置了large_pool_size或sga_target则使用SGA的large pool 来处理所有队列
共享服务器模式强制使用Oracle Net,而不论客户端与服务器是否处于同一台主机
当使用共享模式的连接时,服务器上的所有本地连接(包括sysdba建立的连接)都会得到一个专用服务器,使用IPC进行连接
在专用模式下,同一台主机的本地连接同样使用Oracle Net,且使用的网络协议为IPC
当从客户端连接到服务器时候,不能显示的看到有新的进程产生,而是通过Dispatcher进程进行通讯,由shared_server进程处理
其过程如下
-->①Client Connection Request -->②Listener -->③Dispatcher -->④Request Queue
-->⑤Shared Server -->⑥Response Queue -->⑦Dispatcher -->①Client Connection Request
客户端发出连接请求,Listener侦听并将请求转交给调度进程(Dispatcher),调度进程则将所需完成的任务
放入SGA中开辟的请求队列中,接下来空闲的共享服务器进程处理这些任务并将结果放置到各自的响应队列之中
调度进程轮询检查是否有完成的任务,如有,则将结果返回给对应的客户端
注意:当客户端通过Listener连接到Dispatcher后,Dispatcher将随机分配服务器上的一个端口号,
Listener将该端口号返回给客户端,接下来客户端将断开与Listener的连接而直接与dispatcher建立连接
对于会话的保持,客户端与调度进程(dispatcher)的连接必须是持久的,而与Listener的连接是短暂的
所有调度进程共享一个公共的输入队列,但是每个调度进程都具有自己的响应队列
使用共享服务器模式的优点
减少了实例中的进程数
增加了更多并发用户的数量
实现动态负载均衡
减少了空闲服务器进程数量
降低了对内存的使用
5.两种模式对SGA和PGA的影响
专用服务器模式
用户会话的数据保存在PGA中
SGA(Shared pool and other memory structers)
PGA(Stack space、User session data、Cursor State)
共享服务器模式
用户会话的数据保存在SGA中
SGA(User session data、Cursor state、Shared pool and other memory structers)
PGA(Stack space)
二、配置共享服务器
1.必须要配置的参数
dispatchers --为指定的协议指定调度进程的个数
dispatchers='(protocol=tcp)(dispatchers=2)(protocol=ipc)(dispatchers=1)'
上面将为实例指定TCP协议启用个dispatchers,IPC协议启用个dispatchers
2.可选的配置参数
shared_servers --指定实例启动时至少启动共享服务器进程的个数
max_shared_servers --在负荷增大时启动共享服务器进程的最大个数,当负荷减少则进程动态减少到启动时的个数
--该参数缺省为processes参数值的八分之一
max_dispatchers --指定dispatchers允许同时启用的最大个数,alter system set max_dispatchers=4
local_listener --告知实例其应当注册的侦听器的地址
large_pool_size --在共享服务器模式下,该参数可以减轻共享池的使用
circuits --指定请求队列和响应队列中可用回路的总数量
shared_server_sessions --用于指定共享服务器进程所允许会话数的总和,建议该参数值小于sessions参数值
--设定该参数将为专用服务器保留可用的会话数(sessions-shared_server_sessions)
processes --该参数限制能够连接SGA的操作系统进程数(或Windows线程数),针对操作系统而言
sessions --允许连接到Oracle的会话总数,针对Oracle 而言,该参数值是全局的sessions数目
--设置dispatchers参数
SQL> alter system set dispatchers='(protocol=tcp)(dispatchers=2)' scope=spfile;
System altered.
--查看设定后的参数
SQL> show parameter dispatchers;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (protocol=tcp)(dispatchers=2)
max_dispatchers integer
SQL> show parameter shared_ser
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer
shared_server_sessions integer
shared_servers integer 1
--设定后需要重新启动数据库,下面查看重新启动后的后台进程,包括了两个dispatchers进程d000,d001和一个共享服务器进程s000
SQL> ho ps -ef | grep ora
oracle 6080 1 0 21:09 ? 00:00:00 ora_d000_orcl
oracle 6082 1 0 21:09 ? 00:00:00 ora_d001_orcl
oracle 6084 1 0 21:09 ? 00:00:00 ora_s000_orcl
--修改最大的dispatchers的数目
SQL> alter system set max_dispatchers=3;
System altered.
SQL> show parameter dispatchers;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (protocol=tcp)(dispatchers=2)
max_dispatchers integer 3
--修改共享服务器的数目和最大可用数目
SQL> alter system set shared_servers=3;
System altered.
SQL> alter system set max_shared_servers=6;
System altered.
SQL> show parameter shared_servers;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer 6
shared_servers integer 3
--查看v$circuit视图,有一个dispatcher提供了共享模式服务
SQL> select dispatcher,saddr,circuit from v$circuit;
DISPATCH SADDR CIRCUIT
-------- -------- --------
35221F0C 35317110 331F7AA4
3.配置使用多种连接方式
当配置了共享服务器之后,客户端请求连接到共享服务器,如果dispatchers未注册到listener,则请求将由专用服务器来处理
如果希望将特定的客户端总是使用共享服务器模式进行连接,则可以配置tnsnames.ora中connect_data项,为其增加(server=shared)
如果dispatchers不可用,则从客户端的连接请求将被拒绝
--下面是客户段tnsnames.ora配置文件修改后的内容
# tnsnames.ora Network Configuration File: F:/oracle/product/10.2.0/client_1/NETWORK/ADMIN/tnsnames.ora
# Generated by Oracle configuration tools.
list2 = --该网络服务名中的内容未使用server参数,则表示既可以使用dedicated,也可以使用shared server模式
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradb.robinson.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl.robinson.com)
)
)
shared = --使用shared server模式
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradb.robinson.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl.robinson.com)
(SERVER=shared)
)
)
dedicated = --使用dedicated 模式
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradb.robinson.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl.robinson.com)
(SERVER=dedicated)
)
)
SQL> select circuit,dispatcher,saddr,status from v$circuit;
no rows selected
--接下来打开多个Dos窗口,从Windows客户端使用下列不同的方式连接到客户端
SQL> conn sys/redhat@list2 as sysdba --任意连接方式
Connected.
SQL> conn scott/tiger@shared --使用shared server模式
Connected.
SQL> conn hr/hr@dedicated --使用dedicated 模式
Connected.
SQL> conn system/redhat@list2 --任意连接方式
Connected.
--再次查看v$circuit视图,三条记录分别对应除hr帐户之外的不同客户端
SQL> select circuit,dispatcher,saddr,status from v$circuit;
CIRCUIT DISPATCH SADDR STATUS
-------- -------- -------- ----------------
331F7AA4 35221F0C 35315D38 NORMAL
331F81C4 352224C8 35313588 NORMAL
331F88E4 352224C8 35310DD8 NORMAL
--查看网络连接状态
[oracle@oradb ~]$ netstat -anp | more
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:29639 0.0.0.0:* LISTEN 3368/ora_d001_orcl
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:1521 0.0.0.0:* LISTEN 3409/tnslsnr
tcp 0 0 0.0.0.0:46001 0.0.0.0:* LISTEN 3366/ora_d000_orcl
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:763 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:59892 127.0.0.1:1521 ESTABLISHED 3344/ora_pmon_orcl
tcp 0 0 192.168.1.128:1521 192.168.1.188:1306 ESTABLISHED 3426/oracleorcl
tcp 0 0 192.168.1.128:1521 192.168.1.188:1309 ESTABLISHED 3368/ora_d001_orcl
tcp 0 0 192.168.1.128:1521 192.168.1.188:1310 ESTABLISHED 3368/ora_d001_orcl
tcp 0 0 192.168.1.128:1521 192.168.1.188:1303 ESTABLISHED 3366/ora_d000_orcl
tcp 0 0 127.0.0.1:1521 127.0.0.1:59892 ESTABLISHED 3409/tnslsnr
tcp 0 0 :::22 :::* LISTEN -
tcp 0 0 ::ffff:192.168.1.128:22 ::ffff:192.168.1.188:1273 ESTABLISHED -
udp 0 0 127.0.0.1:41602 0.0.0.0:* 3372/ora_s001_orcl
udp 0 0 127.0.0.1:32134 0.0.0.0:* 3374/ora_s002_orcl
udp 0 0 127.0.0.1:53130 0.0.0.0:* 3368/ora_d001_orcl
udp 0 0 127.0.0.1:6549 0.0.0.0:* 3366/ora_d000_orcl
udp 0 0 0.0.0.0:64552 0.0.0.0:* -
udp 0 0 127.0.0.1:23891 0.0.0.0:* 3370/ora_s000_orcl
--从上面可以看出客户端.168.1.188连接到了服务器.168.1.128且Program name 为d000,d001等即连接到了dispatcher
--92.168.1.128:1521 192.168.1.188:1306 ESTABLISHED 3426/oracleorcl 这个进程即为dedicated 产生的服务器进程
--查看进程
SQL> ho ps -ef | grep 3368
oracle 3368 1 0 09:56 ? 00:00:00 ora_d001_orcl --PID 3368为dispatchers进程
oracle 3479 3341 0 10:38 pts/0 00:00:00 /bin/bash -c ps -ef | grep 3368
--查看listener中的注册及来自客户端的连接情况
SQL> ho lsnrctl services
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 12-OCT-2010 10:40:11
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oradb.robinson.com)(PORT=1521)))
Services Summary...
Service "orcl.robinson.com" has 1 instance(s).
Instance "orcl", status READY, has 3 handler(s) for this service...
Handler(s):
"D001" established:2 refused:0 current:2 max:1022 state:ready --此处D001为两个连接提供了服务
DISPATCHER <machine: oradb.robinson.com, pid: 3368> --这里是pid号
(ADDRESS=(PROTOCOL=tcp)(HOST=oradb.robinson.com)(PORT=29639)) --这里是产生的随机端口号
"D000" established:1 refused:0 current:1 max:1022 state:ready --此处同上
DISPATCHER <machine: oradb.robinson.com, pid: 3366>
(ADDRESS=(PROTOCOL=tcp)(HOST=oradb.robinson.com)(PORT=46001))
"DEDICATED" established:1 refused:0 state:ready --此处产生了一个dedicated连接
三、监视共享服务器
监视共享服务器用到的视图
v$circuit
v$session
v$dispatcher
v$shared_server
v$shared_server_monitor
v$queue
--执行下面的查询来获得共享服务器的相关信息
select c.dispatcher,c.server, /*c.status,*/ c.queue,
s.username,s.status, /*s.server,*/ s.process,s.terminal,s.program, --s.event,
d.name,/*d.network,*/ d.idle,d.busy
from v$circuit c
join v$session s
on c.dispatcher = s.paddr
join v$dispatcher d
on d.paddr = s.paddr
DISPATCHER SERVER QUEUE USERNAME STATUS PROCESS TERMINAL PROGRAM NAME IDLE BUSY
352224C8 35224CEC SERVER SYSTEM INACTIVE 1448:3452 ROBINSON_XP sqlplus.exe D001 229708 5
352224C8 35222A84 SERVER SYSTEM INACTIVE 1448:3452 ROBINSON_XP sqlplus.exe D001 229708 5
352224C8 0 NONE SYSTEM INACTIVE 1448:3452 ROBINSON_XP sqlplus.exe D001 229708 5
35221F0C 35223040 SERVER SCOTT INACTIVE 3632:2244 ROBINSON_XP sqlplus.exe D000 229697 14
35221F0C 0 NONE SCOTT INACTIVE 3632:2244 ROBINSON_XP sqlplus.exe D000 229697 14
SQL> select * from v$shared_server; --从v$shared_serve视图中获得相关信息
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT IDLE BUSY REQUESTS
---- -------- ---------------- ---------- ---------- ---------- -------- ---------- ---------- ----------
S000 35222A84 WAIT(RECEIVE) 90 28223 0 331F88E4 63696 181019 39
S001 35223040 WAIT(RECEIVE) 1016 731342 3 331F9E44 227329 17377 53
S003 35224CEC WAIT(RECEIVE) 508 293481 2 331F9004 30553 12871 7
SQL> select * from v$shared_server_monitor; --从v$shared_server_monitor中获得相关信息
MAXIMUM_CONNECTIONS MAXIMUM_SESSIONS SERVERS_STARTED SERVERS_TERMINATED SERVERS_HIGHWATER
------------------- ---------------- --------------- ------------------ -----------------
6 6 2 2 4
四、总结:
1.当配置了使用共享服务器模式,即设定了dispatchers,则应当设定下列实例参数
shared_servers(指定dispatchers后缺省被置为)
large_pool_size
此外在任何情况下,始终应当设置processes和sessions
对于未使用缺省端口的侦听器,应当设置local_listener
对于客户端连接到数据库可以通过修改客户端配置文件tnsnames.ora来指定连接时使用专用或共享模式
在connect_data中增加该选项:server=dedicated | shared
对于本地客户端连接到数据库则使用的是专用服务器模式
如果在客户端sqlnet.ora中指定了参数USE_DEDICATED_SERVER=on 则该设置将覆盖连接描述符中的server=dedicated |share
SQL> conn sys/redhat@shared as sysdba --从客户端使用共享模式连接
Connected.
SQL> shutdown immediate --共享模式不支持远程关闭数据库
ORA-00106: cannot startup/shutdown database when connected to a dispatcher
SQL> conn sys/redhat@dedicated as sysdba --从客户端使用专用模式连接
Connected.
SQL> shutdown immediate; --专用模式支持远程关闭数据库
Database closed.
Database dismounted.
ORACLE instance shut down.
2.何时使用专用模式
下列三种情况适用于专用服务器模式
提交事务的为批处理
启动关闭或执行恢复使用sysdba时
在层架构中,专用模式具有更好的性能
3.何时使用共享模式
多用于管理许多完成短事务会话的OLTP系统
4.一般情况下模式的选择
当并发数为几百左右或多于一千,则应当考虑使用共享服务器,当过多的上下文转接会导致操作系统性能退化
当并发数少于一百,则一般使用专用服务器模式
五、更多
Oracle 联机重做日志文件(ONLINE LOG FILE)