SQL> alter system set shared_server_sessions =10;
alter system set dispatchers='(PROTOCOL=TCP)(DISPATCHERS=3)';
alter system set max_dispatchers=5;
show parameter dispatcher
--dispatchers string (PROTOCOL=TCP)(DISPATCHERS=3)
--max_dispatchers integer 5 ----共享服务器模式下调度进程最大数量。
补充:
-将SHARED_SERVERS转换为0后,数据库并不能立即进入专用服务器模式,需要等待当前所有基于共享服务器模式的连接结束后,数据库才转换为专用服务器模式。
-将SHARED_SERVERS设为0的同时,参数MAX_SHARED_SERVERS也设为0,则数据库立即进入专用服务器模式。
-将SHARED_SERVERS设置为大于0,而没有配置参数DISPATCHERS,那么数据库将自动创建一个基于TCP协议的调度进程。
-shared_server_sessions=共享服务器模式下能够同时运行的用户会话数。
三、监控共享服务器
1、v$shared_server_monitor——共享服务器进程的信息
SQL> select * from v$shared_server_monitor;
MAXIMUM_CONNECTIONS MAXIMUM_SESSIONS SERVERS_STARTED SERVERS_TERMINATED SERVERS_HIGHWATER
------------------- ---------------- --------------- ------------------ -----------------
3 3 2 0 3
2、v$shared_server——可以查看服务器进程的状态
SQL> select * from v$shared_server;
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT IDLE BUSY REQUESTS
---- -------- ---------------- ---------- ---------- ---------- -------- ---------- ---------- ----------
S000 48E1ACB0 WAIT(RECEIVE) 116 44699 0 46E076FC 6114114 9192 48
S001 48E1CEE8 WAIT(COMMON) 0 0 0 00 241441 0 0
S002 48E1E004 WAIT(COMMON) 0 0 0 00 241438 0 0
3、v$dispatcher——调度器进程的信息
SQL> select name,network,paddr,status,idle,busy from v$dispatcher;
NAME NETWORK PADDR STATUS IDLE BUSY
---- ------------------------------------------------------- -------- ------ ---------- ----------
D000 (ADDRESS=(PROTOCOL=tcp)(HOST=R54X32O10R2)(PORT=51177)) 48E1A6FC WAIT 6209322 4
D001 (ADDRESS=(PROTOCOL=tcp)(HOST=R54X32O10R2)(PORT=55354)) 48E1E5B8 WAIT 326096 0
D002 (ADDRESS=(PROTOCOL=tcp)(HOST=R54X32O10R2)(PORT=34671)) 48E1EB6C WAIT 326091 2
--补充:调度程序进程的速率统计表;
SQL> select name from V$DISPATCHER_RATE;
D000
D001
D002
--补充:关闭调度进程
SQL> alter system shutdown immediate 'D002 ';
4、v$shared_server_monitor——共享服务器会话信息
SQL> select SID,SERIAL#,PADDR,USERNAME,OSUSER,PROGRAM from v$session where username is not null;
SID SERIAL# PADDR USERNAME OSUSER PROGRAM
---------- ---------- -------- --------- --------------- -----------------------------------
140 61 48E1E5B8 SCOTT Administrator sqlplus.exe
144 198 48E1C380 SYS oracle sqlplus@R54X32O10R2 (TNS V1-V3)
147 213 48E1ACB0 SYS Administrator sqlplus.exe
5、V$CIRCUIT——包含有关虚拟回路的信息
SQL> col PRESENTATION for a16
SQL> select circuit,dispatcher,server,waiter,queue,presentation,pcircuit from v$circuit;
CIRCUIT DISPATCH SERVER WAITER QUEUE PRESENTATION PCIRCUIT
-------- -------- -------- -------- ---------------- ---------------- --------
46E076FC 48E1EB6C 48E1ACB0 48E1ACB0 SERVER TTC 00
46E07E08 48E1E5B8 00 00 NONE TTC 00
6、V$QUEUE——包含有关shared server message queues的信息
SQL> select * from V$QUEUE;
PADDR TYPE QUEUED WAIT TOTALQ
-------- ---------- ---------- ---------- ----------
00 COMMON 0 3 48
48E1A6FC DISPATCHER 0 0 15
48E1E5B8 DISPATCHER 0 0 14
48E1EB6C DISPATCHER 0 3 30
7、V$SERVICES displays the services in the database
SQL> col NETWORK_NAME for a22
select NAME,NETWORK_NAME from v$services;
orclXDB orclXDB
orcl orcl
SYS$BACKGROUND
SYS$USERS
8、服务等待事件与调优有关,动态注册
SQL> col STAT_NAME for a35 有物理读,逻辑读
select STAT_NAME,value from v$service_stats where SERVICE_NAME='SYS$USERS';
parse count (total) 28720
parse time elapsed 30474434
execute count 297868
sql execute elapsed time 150960203
session logical reads 1400665
physical reads 4233
physical writes 211
user commits 396
9、V$SGA:包含各个系统全局区(SGA)组的容量信息;
SQL> select * from V$SGA;
Fixed Size 1221276
Variable Size 192941412
Database Buffers 486539264
Redo Buffers 7163904
10、V$SGASTAT:关于DGA的详细统计信息,用于协调共享服务器;
SQL> select distinct pool from V$SGASTAT;
java pool shared pool large pool
11、V$SHARED_POOL_RESERVED:共享存储池的信息
02.02-客户机配置为共享连接并登陆
一、在Windows上tnsnames.ora配置中添加(SERVER = SHARED)
# tnsnames.ora Network Configuration File: C:\app\Administrator\product\11.2.0\client_2\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.135)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(SERVER = SHARED)
)
)
二、客户机端:使用tnsnames.ora中的共享配置登陆
1、在远程Windows机器上通过默认监听登陆
c:\> sqlplus sys/oracle@TEST as sysdba
set pagesize 0
select sid,username,server from v$session where sid=(select distinct sid from v$mystat);
159 SYS SHARED--用户进程请求到的服务器进程类型=共享
2、列出所有通过监听登陆的用户
SQL> set linesize 999
select '--'||username,server,program from v$session where username is not null;
--SCOTT NONE sqlplus.exe
--SYS DEDICATED sqlplus@R54X32O10R2 (TNS V1-V3)
--SYS SHARED sqlplus.exe
02.03-补充:共享服务器基础知识
一、用户很多时使用共享服务器模式的特点
1、连接可以共享
2、一个server进程可以服务多个user进程,可节省内存等资源
3、配置共享模式后,多出了两类进程
可以使用一个或多个Dispatcher进程(d001,d002,d003...)
也可以使用一个或多个Shared server进程(snnn,snnn,snnn)
4、用户会话的数据保存在SGA中
-在SGA共享池内开辟部分空间来用作队列的存储,包含请求队列、响应队列
-如果配置了large_pool_size或sga_target则使用SGA的large pool 来处理所有队列
5、共享服务器模式强制使用Oracle Net,而不论客户端与服务器是否处于同一台主机
6、当使用共享模式的连接时,服务器上的所有本地连接都会得到一个专用服务器,使用IPC进行连接
7、不能执行DBA管理任务,如批处理和批量加载,数据仓库操作、备份、恢复、Log Miner、单独启动和关闭实例等。
8、service handler是dispatcher:调度器进程直接与客户端会话进行通信,共享服务进程并不作为服务处理器。
调度器将来自客户端的连接请求放入共享池中的请求队列(仅一个请求队列)中,然后由空闲的共享服务进程对连接请求进行处理,把结果放到响应队列中(每dispatcher对应一个响应队列),处理结果再由调度器返回给客户端会话。
$ lsnrctl services listener
Service "orcl" has 1 instance(s).
Instance "orcl", status READY, has 4 handler(s) for this service...
Handler(s):
"DEDICATED" established:19 refused:0 state:ready
LOCAL SERVER
"D001" established:1 refused:0 current:1 max:1022 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=R54X32O10R2)(PORT=55354))
"D000" established:1 refused:0 current:0 max:1022 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=R54X32O10R2)(PORT=51177))
"D002" established:2 refused:0 current:1 max:1022 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=R54X32O10R2)(PORT=34671))
二、共享连接建立后:SQL请求处理的过程
0、监听程序探测到用户进程请求后
-验证用户进程提供的用户名和口令,
-验证通过后将该用户进程分配给一个Dispatcher调度进程
1、Dispatcher接受到用户端的请求(在整个会话期间,用户始终与同一个调度程序相连)
2、用户提交一条SQL语句,调度进程对SQL语句进行处理,然后将处理结果和调度程序ID放入位于SGA中的一个“Request Queue”中,并建立了类似电路的一条回路Circurt用来标识请求是来自哪个Client。
3、某闲置的Server Process从“Request Queue” 中取出一条处理后的SQL,并对该SQL解析和执行,得到它所请求的数据。
Request Queue说明:
-所有调度器共享一个公共的输入Request Queue
-共享服务器监视请求队列以查看是否有新的请求。
-有一个会话死了,该服务器进程上的所有用户将被阻塞
4、共享服务器进程将处理结果放入SGA中的“Response Queue”中(每个调度器都有自己的输出队列Response Queue)。
用户请求完成后,将释放共享服务器进程,于是该进程可为请求队列中的另一个用户请求服务。
5、Dispatcher定期检查“Response Queue”中的Dispatcher ID,有自己送出请求的则把处理结果则取出(返给Dispatcher)
6、Dispatcher将结果最终返回给当初的Client进程
02.04-补充:共享服务器和专用服务器的内存比较
-假设一个应用程序访问Oracle的每个Session需要400KB的内存,
-每个服务进程的内存需要4MB,
-所分配的共享服务进程数为100个。现在有5000个客户连接,
1、在Dedicated模式下——内存=5000 * (400KB+4MB) = 22GB
2、在Shared模式下———内存=5000 * 400KB + 100 * 4MB = 2.5GB