配置共享服务器模式

--======================

-- 配置共享服务器模式

--======================

 

一、服务器的两种模式:专用服务器模式、共享服务器模式

    1.共同点:

        两者完成相同的任务,即处理所有指定的SQL操作。假定从客户端提交一个任意查询(DQL)到数据库服务器不论是专用模式还是共享

        模式都将对给出的SQL查询进行语法分析并生成执行计划放置到共享池(如果共享池中已有,则省略该步骤)。接下对变量等执行绑定

        过程,绑定完毕后开始执行。如果数据缓冲区已有该数据的数据块则直接返回给客户端,否则从数据文件中读取数据。

        两者都是完成四个过程:SQL语句-->分析-->绑定-->执行-->返回结果

       

    2.Oracle 数据库服务器中的几类进程

        用户进程   -->位于客户端,比如服务器位于Unix系统,客户端为Winxp,用户进程实际上处于Winxp系统

        服务器进程 -->位于服务器端,响应客户端的请求,通常为大量消耗CPU资源的进程,比如执行排序、聚合、联结等等

        后台进程   -->位于服务器端,负责后台数据的读写、归档、监控等等(DBWnLGWRCKPTPMONSMONARCn)

       

    3.专用服务器模式:

        是一个一对一的模式,即一个客户端产生一个服务器进程(在通Oracle Net成功连接之后)

        该类服务器进程通过TCPTCPS等直接建立连接,且此类服务器进程不为实例所有

        该类服务器进程一旦建立,直到退出和关闭该会话相关的资源才被释放

       

        建立服务器进程的过程(参照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_sizesga_target则使用SGAlarge 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.两种模式对SGAPGA的影响

        专用服务器模式

            用户会话的数据保存在PGA

                SGA(Shared pool and other memory structers)

                PGA(Stack spaceUser session dataCursor State)

        共享服务器模式

            用户会话的数据保存在SGA

                SGA(User session dataCursor stateShared pool and other memory structers)

                PGA(Stack space)

               

二、配置共享服务器

    1.必须要配置的参数

        dispatchers  --为指定的协议指定调度进程的个数

            dispatchers='(protocol=tcp)(dispatchers=2)(protocol=ipc)(dispatchers=1)'

            上面将为实例指定TCP协议启用个dispatchersIPC协议启用个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.oraconnect_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.128Program 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 3368dispatchers进程

            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

        此外在任何情况下,始终应当设置processessessions

        对于未使用缺省端口的侦听器,应当设置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 冷备份

 

SPFILE错误导致数据库无法启动

 

Oracle 用户、对象权限、系统权限

 

Oracle 角色、配置文件

 

  Oracle 联机重做日志文件(ONLINE LOG FILE)

 

  Oracle 控制文件(CONTROLFILE)

 

  Oracle 表空间与数据文件

 

Oracle 归档日志

 

 

 

 

       

       

       

   

 

posted @ 2010-11-23 17:02  生活不是用来挥霍的  阅读(373)  评论(0编辑  收藏  举报