如何配置Oracle shared server环境
可以通过多种方法来配置shared server,包括创建数据库的时候指定参数、EM、修改初始化参数文件,还有可以通过Alter system进行修改,因为这些参数都是动态参数。
1) DISPATCHERS:指定调度器的数量、响应的协议等等。
其中最经常使用的两个属性值就是DISPATCHERS和PROTOCOL。
DISPATCHERS = “(PRO=TCP)(DIS=3)(PRO=IPC)(DIS=2)”
上面表示配置了3个TCP协议的调度器,2个IPC协议的调度器。那么,调度器的数量应该如何确定呢?主要考虑数据库最大的连接数和每个调度器服务的连接数,可以通过下面的公式进行计算:
调度器数量 = 数据库最大session数 /每个调度器服务的session数;
数据库的session数可以通过下面的视图获得:
1、 v$session:获得当前数据库的session数
SQL> select count(*) from v$session where username is not null;
2、 V$LICENSE:获得当前数据库的session数及数据库启动以来最大的session数
SQL> select sum(sessions_current) cur_sessions,sum(sessions_highwater) high_sessions from V$LICENSE;
比如数据库当前有500个TCP/IP session,每个调度器管理50个session,那么就需要10(500/50)个调度器。参数设置如下:
DISPATCHERS=”(PRO=TCP)(DIS=10)”
当然也可以根据数据库当前的负载,使用ALTER SYSTEM命令动态的增加或减少调度器的数据,如下:
ALTER SYSTEM SET DISPATCHERS=”(PRO=TCP)(DIS=5)”;
设置连接池:
DISPATCHERS="(PROTOCOL=tcp)(DISPATCHERS=1)(POOL=on)(TICK=1)(CONNECTIONS=500)(SESSIONS=1000)"
上面表示启动连接池,一个调度器的连接数最大为500个,sessions数目最大为1000个,并10分钟后自动断开未活动的连接。(TICK=1表示10分钟)
2) MAX_DISPATCHERS:设置最大的调度器数,可以动态调整
ALTER SYSTEM SET MAX_DISPATCHERS=10;
3) SHARED_SERVERS:设置数据库启动时启动的最小SHARED_SERVER数,默认值库1。设置为0表示不使用SHARED_SERVER。
ALTER SYSTEM SET SHARED_SERVERS = 5;
4) SHARED_SERVER_SESSIONS:设置ORACLE SHARED SERVER的最大session数。
当连接到SHARED SERVER的session数超过此值的话,将报错:
ERROR:
ORA-00018 maximum number of sessions exceeded
不过当数据库session超过此值的时候,仍然可以通过专用服务器连接进行连接。
ALTER SYSTEM SET SHARED_SERVER_SESSIONS = 5;
5) MAX_SHARED_SERVERS:设置最大的SHARED_SERVER数。如果未给此参数附值,那么SHARED_SERVER数库无限制。
ALTER SYSTEM SET MAX_SHARED_SERVERS = 20;
下面谈谈ORACLE SHARED SERVER环境的管理:
1)从监听获得信息
D:\>lsnrctl services
LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 21-APR-2004
20:50:35
Copyright (c) 1991, 2004, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MJW01)
(PORT=1521)))
Services Summary...
Service "PL***tProc" has 1 instance(s).
Instance "PL***tProc", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0
LOCAL SERVER
Instance "MJW", status READY, has 3 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
"D001" established:11 refused:1 current:1 max:1002 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
(PORT=4152))
"D000" established:15 refused:3 current:2 max:1002 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
(PORT=3845))
The command completed successfully
上面的信息表明当前数据库拥有两个调度器,分别库"D000"和"D001",与"D000"建立连接的总共有15个,拒绝掉的有3个,当前活动的连接有2个;与"D001"建立连接的总共有11个,拒绝掉的有1个,当前活动的连接有1个。
2)从动态性能图获得信息:
V$DISPATCHER:显示当前调度器的一些信息,包括调度器的状态(等待还是繁忙)、当前的连接数、历史的连接数等等。
V$DISPATCHER_CONFIG:显示调度器的一些配置参数。
V$SHARED_SERVER:显示当前数据库SHARED SERVER的一些状态信息
V$SHARED_SERVER_MONITOR:显示当前数据库SHARED SERVER的一些统计信息,包括SHARED SERVER的最大连接数,会话数及启动的SHARED SERVER数等等。
同时,在ORACLE SHARED SERVER环境中,也可以配置专用服务器连接,但只有当你是使用Localnaming方法的时候才可以,如果你是使用Hostnaming方法的话则不可以。有几个方法进行配置,如下:
1、 手工修改Tnsname文件
ora10g =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.172)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora10g)
)
)
2、通过Oracle net manager进行配置
3)对于配置了ORACLE SHARED SERVER的数据库,有一些参数需要值得我们的关注:
1、LARGE POOL SIZE
在ORACLE SHARED SERVER环境中,ORACLE 将UGA存放在LARGE POOL中,而在没有LARGE POOL或者LARGE POOL太小的数据库中,UGA将存放于SHARED POOL中,这样将影响到数据库其它的性能。所以LARGE POOL的大小也值得我们考究。LARGE POOL最小为300K,最大为2G(不同操作系统可能有所不同)。一般来讲,在ORACLE SHARED SERVER环境中,一个连接将占用1-3M的内存,不过要看会话做了哪些操作。我们可以通过下面的语句获得数据库启动以来,最大的UGA值:
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
------------------------------------
244416
可以看到,ORACLE分配的最大UGA库240K,如果数据库同时支持100个并发连接,那么可以将LARGE POOL设置库23M(240K*100)。如果LARGE POOL设置过小,可能遇到下面的错误:
ORA-04031: unable to allocate 490 bytes of shared memory
("large pool","MWEIS","session heap","define var info")
可以通过ALTER SYSTEM命令进行动态修改。
ALTER SYSTEM SET LARGE_POOL_SIZE = 51200000 SCOPE=SPFILE;
2、 调度器数目
可以通过查询V$DISPATCHER视图来查看调度器的状态:
SQL> desc v$dispatcher;
Name Type Nullable Default Comments
--------- ------------- -------- ------- --------
NAME VARCHAR2(4) Y
NETWORK VARCHAR2(128) Y
PADDR RAW(4) Y
STATUS VARCHAR2(16) Y
ACCEPT VARCHAR2(3) Y
MESSAGES NUMBER Y
BYTES NUMBER Y
BREAKS NUMBER Y
OWNED NUMBER Y
CREATED NUMBER Y
IDLE NUMBER Y
BUSY NUMBER Y
LISTENER NUMBER Y
CONF_INDX NUMBER Y
SQL> Select name, (busy / (busy + idle))*100
2 "Dispatcher % busy Rate"
3 From V$DISPATCHER
4 /
NAME Dispatcher % busy Rate
---- ----------------------
D000 0.0052861386871346
如果繁忙的百分比超过50%,那么可以考虑增加调度器,可以使用下面的语句动态修改:
ALTER SYSTEM SET DISPATCHERS=“(PRO=TCP)(DIS=2)”;
3、 调度器响应时间
可以通过查看V$QUEUE 和 V$DISPATCHER来获得连接等待调度器响应的时间:
SELECT decode(sum(totalq),0,’No Responses’,
Sum(wait)/sum(totalq)) “Average Wait time”
FROM V$QUEUE q, V$DISPATCHER d
WHERE q.type = ‘DISPATCHER’
AND q.paddr = d.paddr;
Average Wait Time
------------------
.0413
4、 连接等待shared server处理请求的时间
Select decode(totalq,0,’No Requests’) “Wait Time”,
Wait/totalq || ‘ hundredths of seconds’
“Average Wait time per request”
from V$QUEUE
where type = ‘COMMON’
Wait Time Average Wait time per request
-------- -----------------------------------
.023132 hundredths of a second
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
服务器端:设置shared_servers大于0即可
客户端:tnsnames.ora中,添加参数(server=shared);如果是dedicated,则(server=dedicated)
Dedicated方式:
INTRANET =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hpdl580-5.nbbyd.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = intranet.nbbyd.com)
)
)