天天看點

配置共享伺服器模式

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

-- 配置共享伺服器模式

一、伺服器的兩種模式:專用伺服器模式、共享伺服器模式

    1.共同點:

        兩者完成相同的任務,即處理所有指定的SQL操作。假定從用戶端送出一個任意查詢(DQL)到資料庫伺服器不論是專用模式還是共享

        模式都将對給出的SQL查詢進行文法分析并生成執行計劃放置到共享池(如果共享池中已有,則省略該步驟)。接下對變量等執行綁定

        過程,綁定完畢後開始執行。如果資料緩沖區已有該資料的資料塊則直接傳回給用戶端,否則從資料檔案中讀取資料。

        兩者都是完成四個過程:SQL語句-->分析-->綁定-->執行-->傳回結果

    2.Oracle 資料庫伺服器中的幾類程序

        使用者程序   -->位于用戶端,比如伺服器位于Unix系統,用戶端為Winxp,使用者程序實際上處于Winxp系統

        伺服器程序 -->位于伺服器端,響應用戶端的請求,通常為大量消耗CPU資源的程序,比如執行排序、聚合、聯結等等

        背景程序   -->位于伺服器端,負責背景資料的讀寫、歸檔、監控等等(DBWn、LGWR、CKPT、PMON、SMON、ARCn等)

    3.專用伺服器模式:

        是一個一對一的模式,即一個用戶端産生一個伺服器程序(在通Oracle Net成功連接配接之後)

        該類伺服器程序通過TCP或TCPS等直接建立連接配接,且此類伺服器程序不為執行個體所有

        該類伺服器程序一旦建立,直到退出和關閉該會話相關的資源才被釋放

        建立伺服器程序的過程(參照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_size或sga_target則使用SGA的large 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.兩種模式對SGA和PGA的影響

        專用伺服器模式

            使用者會話的資料儲存在PGA中

                SGA(Shared pool and other memory structers)

                PGA(Stack space、User session data、Cursor State)

        共享伺服器模式

            使用者會話的資料儲存在SGA中

                SGA(User session data、Cursor state、Shared pool and other memory structers)

                PGA(Stack space)

二、配置共享伺服器

    1.必須要配置的參數

        dispatchers  --為指定的協定指定排程程序的個數

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

            上面将為執行個體指定TCP協定啟用個dispatchers,IPC協定啟用個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.    

        max_dispatchers                      integer     3

    --修改共享伺服器的數目和最大可用數目

        SQL> alter system set shared_servers=3;

        SQL> alter system set max_shared_servers=6;

        SQL> show parameter shared_servers;

        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.ora中connect_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模式

              (SERVER=shared)

        dedicated =  --使用dedicated 模式

              (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模式

            SQL> conn hr/hr@dedicated              --使用dedicated 模式

            SQL> conn system/redhat@list2          --任意連接配接方式

        --再次檢視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.128且Program 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 3368為dispatchers程序

            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

        此外在任何情況下,始終應當設定processes和sessions

        對于未使用預設端口的偵聽器,應當設定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  --從用戶端使用共享模式連接配接

            SQL> shutdown immediate                --共享模式不支援遠端關閉資料庫

            ORA-00106: cannot startup/shutdown database when connected to a dispatcher

            SQL> conn sys/redhat@dedicated as sysdba  --從用戶端使用專用模式連接配接

            SQL> shutdown immediate;                --專用模式支援遠端關閉資料庫

            Database closed.

            Database dismounted.

            ORACLE instance shut down.     

    2.何時使用專用模式

        下列三種情況适用于專用伺服器模式

            送出事務的為批處理

            啟動關閉或執行恢複使用sysdba時

            在層架構中,專用模式具有更好的性能

    3.何時使用共享模式

        多用于管理許多完成短事務會話的OLTP系統

    4.一般情況下模式的選擇

        當并發數為幾百左右或多于一千,則應當考慮使用共享伺服器,當過多的上下文轉接會導緻作業系統性能退化

        當并發數少于一百,則一般使用專用伺服器模式

五、更多

<a href="http://blog.csdn.net/robinson_0612/archive/2010/08/05/5791597.aspx">Oracle 冷備份</a>

<a href="http://blog.csdn.net/robinson_0612/archive/2010/07/29/5774795.aspx">SPFILE錯誤導緻資料庫無法啟動</a>

<a href="http://blog.csdn.net/robinson_0612/archive/2010/06/23/5688875.aspx">Oracle 使用者、對象權限、系統權限</a>

<a href="http://blog.csdn.net/robinson_0612/archive/2010/06/23/5688997.aspx">Oracle 角色、配置檔案</a>

<a href="http://blog.csdn.net/robinson_0612/archive/2010/08/03/5784713.aspx">Oracle 歸檔日志</a>