oracle共享与专用模式的动态转换及区别

时间:2021-02-02 03:41:43
  一直没对专用于共享的互换搞清楚,找到了这篇文章
http://blog.csdn.net/tianlesoftware/archive/2010/06/26/5695784.aspx
,让我实践了一把,确实明白了许多。以下大多是转自该链接的,将其收藏,供以后方便查找学习。

共享与专用服务器的区别:

专用服务器DEDICATED:一个客户端连接对应一个服务器进程

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

 

 

共享服务器具有以下一些缺点:

1)共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢。

2)存在人为死锁的可能,因为它是串行的,只要一个连接阻塞,则该服务器进程上的所有用户都被阻塞,并且极可能死锁。

3)存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待,而专用服务器,每个客户端是一个会话。

4)共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,并且SQL_TRACE没有意义(因为是共享而不是当前会话的)

MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,但它却使用SGALarge_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覆盖。

关闭调度进程:
    首先要查询到DISPATCHERS的NAME: SELECT NAME,NETWORK FROM V$DISPATCHER;
    然后关闭调度进程:ALTER SYSTEM SHUTDOWN IMMEDIATE 'D000';

circuits(虚拟回路):指定了virtual circuits 的总数量。
     SQL> select * from V$CIRCUIT;


关闭共享模式:
    将 shared_servers 参数置为0(alter system set shared_servers=0;),那么所有以共享方式连接到数据库都不能成功,但是未释放的共享
    连接会继续 保持连接,直到断开。如果将 shared_servers 和 max_shared_servers 都设为0(alter system set 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     0  
shared_server_sessions               integer     
shared_servers                       integer     0  --为0表示专用模式

2.  查看v$session 视图
SQL> Select username,server,program from v$session where username is not null;

USERNAME     SERVER    PROGRAM
--------- --------- -------------------
GWM            NONE    
SYS            SHARED        plsqldev.exe
SYS            SHARED        plsqldev.exe
SYS            DEDICATED      sqlplus.exe  --专用模式

3. 查看监听: lsnrctl service
$ lsnrctl service

LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production on 08-MAR-
2011 14:28:08

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary...
Service "telemt" has 1 instance(s).
  Instance "telemt", status READY, has 2 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:6 refused:0 state:ready
         LOCAL SERVER
      "D000" established:51 refused:0 current:3 max:1022 state:blocked
         DISPATCHER <machine: ossdb2, pid: 504060>
         (ADDRESS=(PROTOCOL=tcp)(HOST=loopback)(PORT=53932))
Service "telemt_XPT" has 1 instance(s).
  Instance "telemt", status READY, has 2 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:6 refused:0 state:ready
         LOCAL SERVER
      "D000" established:51 refused:0 current:3 max:1022 state:blocked
         DISPATCHER <machine: ossdb2, pid: 504060>
         (ADDRESS=(PROTOCOL=tcp)(HOST=loopback)(PORT=53932))
The command completed successfully

4.查看TNSNAMES.ora 文件。如:
IGISDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 134.74.21.51)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = telemt)
      (SERVER = DEDICATED)
    )
  )

    这里是以DEDICATED 专用模式连接 telemt 实例。写上 (SERVER = SHARED) 则是使用共享服务器模式,但是这时shared_server_process需要
打开(即oracle服务器的shared_servers参数要设置为共享模式),要不然会出错连不上oracle(ora-12520:TNS:监听程序无法为请求的服务器类型找
到可用的处理程序)。
    要是这段放空没写,那么系统会根据服务器模式自动调节,不过根据实测结果,就算服务器是定义成共享服务器模式,shared_server_process没打
开的情况下,在v$session中查到的连接依然是SERVER = DEDICATED。所以基本上我们这段话都是可以放空着不写的,但是有时候要连上我们的共享服务
器模式的数据库,放空有可能系统认为要用共享服务器方式去连,因此最好声明 SERVER = DEDICATED 采用专用服务器方式去连接。

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