代码改变世界

oracle 10g 共享服务器搭建

2011-08-04 17:24  Tracy.  阅读(1212)  评论(0编辑  收藏  举报

oracle 10g 共享服务器搭建

1、原理
===================================================================
Oracle 专用模式(DEDICATED 共享模式(SHARE)

专用服务器(DEDICATED):一个客户端连接对应一个服务器进程
共享服务器(SHARE):多个客户端连接对应一个服务器进程,服务器端存在一个进程调度器来管理。它必须使用net services.也就是说必须配置tns。它适合用于高并发,事物量小,如果这个时候采用了共享模式,可以大大减少由于高度并发对于ORACLE服务器的资源消耗。

共享服务器体系:客户进程最终与一个调度程序连接,PMON进程注册了调度程序的位置和负荷,使监听器能够提交到负荷最小的调度程序。一个调度程序能并发地支持多重的客户连接。

专用服务器体系:每个客户进程与专用服务器进程连接。服务器进程没被任何另外的客户共享。

另:专用服务器体系结构不支持HTTP和IIOP客户,仅支持TTC客户。

一般我们以oracle默认的专用服务器方式就行了,没必要使用共享服务器模式。一个是我们是使用中间件(如:weblogic)去连oracle的,中间件本身有连接池机制,另外就是oracle的这个共享服务器方式也做的不够好了,有诸多缺点。

共享服务器具有以下一些缺点:
1)共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢。
2)存在人为死锁的可能,因为它是串行的,只要一个连接阻塞,则该服务器进程上的所有用户都被阻塞,并且极可能死锁。
3)存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待,而专用服务器,每个客户端是一个会话。
4)共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,并且SQL_TRACE没有意义(因为是共享而不是当前会话的)。

MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,但它却使用SGA的Large_Pool来分配UGA,拆东墙补西墙,所减少的内存是很少的。如果用户会话的连接和断开很频繁,数据库进程的创建和删除的开销会非常大,这种情况最好采用共享服务器模式(否则,应该使用连接池技术)。如果客户端一次连接终身使用(会话生命周期内),使用共享服务器模式的意义不大。因为大部分时间,一个会话就连接到一个服务器进程,无法共享服务器进程。

共享服务初始化参数的一些说明:

shared_servers :指定了当instance 启动的时候 shared server process 启动的数量,不要将这个参数设置得太大,否者启动数据库instance 的时候 就会花更多时间,Oracle启动过后会根据负载来动态调整shared_servers。如果为0,表示数据库没有启动共享服务模式。 这个参数是配置shared server 必须的,而且只有这个参数是必须的。

修改参数: alter system set shared_servers=1;

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_server_sesions: 指定了总共允许的的shared server session 的数量。如果设置了这个参数,那么就不要将这个值超过sessions,如果没有设置这个值,那么只要还有空闲的session,就可以被使用。设置这个值是为专有连接预留 user sessions.

dispatchers:配置 dispatcher process .如果不设置这个参数,只要设置了shared_servers ,oracle 也会自动设置一个基于tcp协议的dispatcher。还需要查看操作系统支持一个dispatcher能处理多少个connections

SQL> select * from v$dispatcher;

max_dispatchers: 设置同一时刻能够同时运行的dispatchers的数量,必须大于等于 dispatchers ,小于processes。这个参数也会被dispatchers覆盖。

circuits:指定了virtual circuits 的总数量。

关闭共享模式:

将shared_servers参数置为0,那么所有以共享方式连接到数据库都不能成功,但是未释放的共享连接会继续 保持连接,直到断开。如果将shared_servers 和max_shared_servers都设为0,那么共享连接将被终结。所有的共享方式连接都断开了的话,就可以使用alter system set dispatcher=’’; 将dispatcher清除,防止下次启动数据库又打开了共享连接方式。

判断oracle是共享模式还是专用模式方法:


1. show parameter shared_server; (注:8i应为:show parameter mts_servers;)
SQL> show parameter shared_server;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer 20
shared_server_sessions integer 330
shared_servers integer 1

2. 查看v$session 视图

SQL> Select username,server,program from v$session where username is not null;

USERNAME SERVER PROGRAM

------------------------------ --------- ---------------------------------------

SYS DEDICATED rman.exe

RMAN DEDICATED rman.exe

SYS DEDICATED rman.exe

SYS DEDICATED sqlplus.exe

SYS DEDICATED rman.exe

DAVE DEDICATED toad.exe

SYS DEDICATED toad.exe

3. 查看监听: lsnrctl service

C:\Users\Administrator.DavidDai>lsnrctl service

LSNRCTL for 32-bit Windows: Version 11.2.0.1.0 - Production on 26-6月 -2010 11:7:40 Copyright (c) 1991, 2010, Oracle. All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))

服务摘要..

服务 "orcl" 包含 1 个实例。

实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...

处理程序:

"DEDICATED" 已建立:34 已拒绝:0 状态:ready

LOCAL SERVER

服务 "orclXDB" 包含 1 个实例。

实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...

处理程序:

"D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1022 状态: ready

DISPATCHER <machine: DAVIDDAI, pid: 10884>

(ADDRESS=(PROTOCOL=tcp)(HOST=DavidDai)(PORT=58400))

命令执行成功

4.查看TNSNAMES.ora 文件。如:

ORCL =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = DavidDai)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)

)

)

这里是以DEDICATED 专用模式连接 orcl 实例。写上 (SERVER = SHARED) 则是使用共享服务器模式,但是这时shared_server_process需要打开,要不然会出错连不上oracle。要是这段放空没写,那么系统会根据服务器模式自动调节,不过根据实测结果,就算服务器是定义成共享服务器模式,shared_server_process没打开的情况下,在v$session中查到的连接依然是SERVER = DEDICATED。所以基本上我们这段话我们都是可以放空着不写的,但是有时候要连上我们的共享服务器模式的数据库,放空有可能系统认为要用共享服务器方式去连,那时就要声明 SERVER = DEDICATED采用专用服务器方式去连接。

在数据库启动的时候,如果没有指定shared_servers,但是设置了dispatchers,那么ORACLE就认为启动了shared server ,并且设置shared_servers为1. 在数据库启动的时候,没有设置shared_servers,没有设置dispatchers,即使以后修改了dispatchers,也不能启动shared server,必须从新启动数据库。


另外,Background process ,以及通过本地连接进来的,只能是DEDICATED .比如说sqlplus user/pass形式
如果数据库没有配置共享服务器,那么客户端只能以DEDICATED方式连接数据库.

ORA-12545 连接因对象主机或对象不存在而失败.

ORA-12545:

Connect failed because target host or object does not exist

Cause:

The address specified is not valid, or the program being connected to does not exist.

Action:

Ensure the ADDRESS parameters have been entered correctly; the most likely incorrect parameter is the node name. Ensure that the executable for the server exists (perhaps "oracle" is missing.) If the protocol is TCP/IP, edit the TNSNAMES.ORA file to change the host name to a numeric IP address and try again.

根据上面的要求修改,还是不行,后来修改了HOST文件,在其中增加了服务器的主机对应IP地址,问题得以解决.

WINDOWS XP的HOST文件在c:windows\system32\drivers\etc 下面.文件名就叫HOST,没有扩展名.

# Copyright (c) 1993-1999 Microsoft Corp.

127.0.0.1 localhost

10.85.10.80 DAVIDDAI

In Dedicated Server Mode, there is a dedicated server process for each user process.

Select this option when the number of total clients is expected to be small, or when database clients will make persistent, long-running requests to the database. In Shared Server Mode, several client connections share a database-allocated pool of resources. Use this mode when a large number of users need to connect to the database. It is also useful when database memory is limited and for better performance, since you can have more client connections to the database than in dedicated server mode with the same memory. If you choose shared server mode, you must also indicate the number of server processes you want to create when an instance is started up. For more information about setting this parameter, click Help.

arge_pool_size : 指定大型池的分配堆的大小,它可被共享服务器用作会话内存,用作并行执行的消息缓冲区以及用作RMAN备份和恢复的磁盘I/O缓冲区。如果不设置MTS, large_pool_size在10MB~30MB就可以了;若设置MTS,就需要依据 session最大数量和 sort_ares_size 等参数增大large_pool_size 值。注意,一般是不必使用MTS,尤其在同时在线用户数小于500的情况下。

share_pool_size:它指定共享池的大小,共享池包含:共享游标、存储的过程、控制结构和并行执行消息缓冲区等对象,较大的值用于改善多用户系统的性能,但不能盲目将shared_pool_size设置过大,因为shared_pool_size 过大会增加管理负担和latch 的开销,超过500M可能是危险的,达到1G可能造成CPU的严重负担,甚至导致系统瘫痪。如果shared_pool_size 超过350M还命中率不高,可以试着从应用上找原因。

initdw.ora init.ora shared_pool_size


2、服务器模式的设置

============================================================================================

启用专用服务器
------------------------
dedicated servers不需要专门的设置,这个是oracle的默认选项。
启用共享服务器

------------------------
要切换到共享模式,可以使用以下步骤:
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: 监听程序无法找到需要的服务器类型的可用句柄”;

和共享服务器相关的参数如下:
max_shared_servers --最大服务器进程数
SHARED_SERVER_SESSIONS --指定可以同时运行的最大的共享服务会话数
dispatchers --协议,调度程序数,每个调度程序的最大连接数
max_dispatchers --最大调度程序数
shared_servers --服务器进程数
CIRCUITS --指定网络会话层出入的总的虚拟回路

3、判断数据库使用的连接模式
========================================================================
查看当前数据库服务器的运行情况有一下几种办法:
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 ; --有记录说明当前有使用共享模式的连接,无记录则不能判定服务器模式

实际查询如下(启动共享服务器的情况):
SQL> select * from v$shared_server;
NAME PADDR STATUS MESSAGES BYTES BREAKS CIRCUIT IDLE BUSY REQUESTS
---- -------- ---------------- ---------- ---------- ---------- -------- ---------- ---------- ----------
S000 2961ACA0 WAIT(COMMON) 735 611520 3 00 561435 1857 149
S001 2961CED8 TERMINATED 2 260 0 00 3001 3030 1

SQL> select CIRCUIT,DISPATCHER,SERVER,WAITER,SADDR,STATUS,BYTES from v$circuit ;
CIRCUIT DISPATCH SERVER WAITER SADDR STATUS BYTES
-------- -------- -------- -------- -------- ---------------- ----------
2743471C 2961A6EC 00 00 296FB24C NORMAL 10364

SQL> select name,paddr,created,bytes from v$dispatcher;
NAME PADDR CREATED BYTES
---- -------- ---------- ----------
D000 2961A6EC 7 612551

SQL>

注意上述视图之间的联系,v$circuit 中的saddr和v$session 中的saddr是相等的

C.查询监听器的状态:
LSNRCTL> service
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=B851)(PORT=1542)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0
LOCAL SERVER
Service "yzdb" has 1 instance(s).
Instance "yzdb", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "yzdb_XPT" has 1 instance(s).
Instance "yzdb", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
The command completed successfully
LSNRCTL>

其中的DEDICATED 表示当前服务器处于专用服务器模式

如果启动共享服务器,则得到的状态是
----------------------------------------
LSNRCTL> service
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=B851)(PORT=1542)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0
LOCAL SERVER
Service "yzdb" has 1 instance(s).
Instance "yzdb", status READY, has 2 handler(s) for this service...
Handler(s):
"D000" established:3 refused:0 current:3 max:1022 state:ready
DISPATCHER <machine: B851, pid: 30561>
(ADDRESS=(PROTOCOL=tcp)(HOST=B851)(PORT=60606))
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "yzdbXDB" has 1 instance(s).
Instance "yzdb", status READY, has 0 handler(s) for this service...
Service "yzdb_XPT" has 1 instance(s).
Instance "yzdb", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
The command completed successfully
LSNRCTL>
可以看出此时,yzdb服务启动了共享模式,但是同时也支持专用模式
在实际的使用中还发现有趣的现象,如果把shared_servers 和 max_shared_servers 同时设置成0,
但是保持 dispatcher 参数的值不变,则再查看监听时,出现下面的情况:
Service "yzdb" has 1 instance(s).
Instance "yzdb", status READY, has 2 handler(s) for this service...
Handler(s):
"D000" established:0 refused:0 current:0 max:1022 state:blocked
DISPATCHER <machine: H851, pid: 30561>
(ADDRESS=(PROTOCOL=tcp)(HOST=H851)(PORT=60606))
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
..................

此时的共享进程还在,但是状态为阻塞

4、客户端建立的连接模式
==============================================================================
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。

5、禁用共享服务器模式(使用oracle的原话)
==============================================================================
You disable shared server by setting SHARED_SERVERS to 0. No new client can connect in shared mode. However, when you set SHARED_SERVERS to 0, Oracle Database retains some shared servers until all shared server connections are closed. The number of shared servers retained is either the number specified by the preceding setting of SHARED_SERVERS or the value of the MAX_SHARED_SERVERS parameter, whichever is smaller. If both SHARED_SERVERS and MAX_SHARED_SERVERS are set to 0, then all shared servers will terminate and requests from remaining shared server clients will be queued until the value of SHARED_SERVERS or MAX_SHARED_SERVERS is raised again.

---如果同时把SHARED_SERVERS and MAX_SHARED_SERVERS 都设置成0,则共享服务器将关闭,并且保留的共享服务器的
请求将进入队列等待,一直到这两个参数的值重新被设置

To terminate dispatchers once all shared server clients disconnect, enter this statement:

ALTER SYSTEM SET DISPATCHERS = '';

禁用的实验:
-------------------------
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>

6、和共享服务器相关的视图(使用oracle原话)
==============================================================================
View Description
--------------------------------
V$DISPATCHER Provides information on the dispatcher processes, including name, network address, status, various usage statistics, and index number.
V$DISPATCHER_CONFIG Provides configuration information about the dispatchers.
V$DISPATCHER_RATE Provides rate statistics for the dispatcher processes.
V$QUEUE Contains information on the shared server message queues.
V$SHARED_SERVER Contains information on the shared servers.
V$CIRCUIT Contains information about virtual circuits, which are user connections to the database through dispatchers and servers.
V$SHARED_SERVER_MONITOR Contains information for tuning shared server.
V$SGA Contains size information about various system global area (SGA) groups. May be useful when tuning shared server.
V$SGASTAT Contains detailed statistical information about the SGA, useful for tuning.
V$SHARED_POOL_RESERVED Lists statistics to help tune the reserved pool and space within the shared pool.

http://download.oracle.com/docs/cd/B10500_01/network.920/a96580/mts.htm#447168