Oracle配置共享服務器模式


這幾天在研究Oracle 11g的監聽和控制文件,看到一篇對共享服務器模式介紹比較好的文章,特轉載如下:


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

-- 配置共享服務器模式

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

 

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

    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 歸檔日誌




原文地址:http://blog.csdn.net/leshami/article/details/6030190



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章