配置Shared Server

kewin發表於2008-03-10

9i 下的共享伺服器 Shared Server(8i 中的多執行緒伺服器 MTS )主要用在 OLTP 業務中,伺服器程式每次處理業務只需很短的時間,大多在空閒狀態,在這種情況下,可以用較少的資源,處理較多的使用者請求。

共享伺服器的配置
1.設定 DISPATCHERS 引數:
    在 pfile 中新增:

*.DISPATCHERS='(PROTOCOL=TCP)(SERVICE=SKYSH)(DISPATCHERS=2)(PROTOCOL=IPC)(DISPATCHERS=1)'
    以上方法啟動之後,DISPATCHER 的埠是隨機分配的,如果要固定每個 DISPATCHER 的埠,可以用一下方法:
    使用不同埠:

*.DISPATCHERS='(ADDRESS=(PROTOCOL=TCP)(PORT=5000))(DISPATCHERS=1)','(ADDRESS=(PROTOCOL=TCP)(PORT=5001))(DISPATCHERS=1)'
    使用相同埠:

*.dispatchers='(ADDRESS=(PROTOCOL=TCP)(PORT=5130))(SERVICE=SKYSHR)(DISPATCHERS=1)'

    如果是 spfile 啟動,先用 create pfile from spfile 建立 pfile,修改好之後,再用 create spfile from pfile 建立 spfile。
    注:雖然 DISPATCHERS 是動態引數,但只能用 alter system set DISPATCHERS 來臨時新增刪除 dispatcher,重啟之後又恢復原值,且不能使用 scope 引數。
    其中,SERVICE=SKYSH 引數可以不指定,如果不指定,則需要指定 service_names 和 instance_name 初始引數,當 instance 啟動時,PMON 會動態將 SERVICE 或者 service_names 指定的值邦定到 LISTENER,並生成 dispatchers。
    DISPATCHERS=2 如果不指定,那麼預設值是 1。
    PROTOCOL:當使用 Shared Server 連線時,必須通過 Oracle Net Services,即使客戶端和資料庫在同一臺機子上,如果在 Windows NT 上,dispatchers 只能使用 TCP/IP 協議。

2.設定客戶端 tnsnames.ora 檔案:

SKY3 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.123)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SKYSH.heysky.net)
      (SERVER = SHARED)
    )
  )

    其中,SERVICE_NAME = SKYSH.heysky.net 中的值必須是動態邦定的 service_name.db_domain,否則會產生 ORA-12523 錯誤:

ERROR:
ORA-12523: TNS:listener could not find instance appropriate for the client connection

    使用共享伺服器連線,必須指定 (SERVER = SHARED),如果不指定,則作為 DEDICATE 連線。

3.SHARED_SERVERS 引數:
    該引數指定當 instance 啟動時,初始生成的共享伺服器程式數量,如果要使用共享伺服器,該值必須大於 0,否則將產生 ORA-12520 錯誤:

ERROR:
ORA-12520: TNS:listener could not find available handler for requested type of server
    通過動態改變該引數,可以增加減少預設的共享伺服器程式數量,或者在不停止資料庫的情況下禁止共享伺服器。當動態將其設定為 0 時,共享伺服器程式在完成所有工作,並空閒一段時間之後終止,可以通過檢視 v$shared_server 動態檢視來檢視共享伺服器的狀態。

4.其他一些相關引數:
    MAX_DISPATCHERS:最大 DISPATCHER 數量,預設值是 5,如果 DISPATCHERS 中設定的所有 DISPATCHER 數量之和大於 5,那麼 MAX_DISPATCHERS 等於這個和數。

    MAX_SHARED_SERVERS:最大共享伺服器程式,當初始分配的 SHARED_SERVERS 不夠時,Oracle 會繼續生成 共享伺服器,直到這個最大值,當空閒時,Oracle 會終止空閒的程式,直到 SHARED_SERVERS 中指定的值為止。

    CIRCUITS:改值一般等於 SESSIONS 的數量。

    SHARED_SERVER_SESSIONS:共享伺服器連線所能用的最大 SESSION 值,一般可以設定為小於 CIRCUITS and SESSIONS -5 的值,以便給 DEDICATE 連線留下一定的 SESSION 數。

5.一些注意事項:
    當 sysdba 已 shared server 連線時,不能執行 start up、shut down 或者 recovery 命令,否則可能出現如下錯誤:

ORA-00106: cannot startup/shutdown database when connected to a dispatcher
    當使用共享伺服器的時候,需要設定 LARGE_POOL_SIZE 引數,並且要足夠,因為,當使用共享伺服器的時候,本來在 PGA 中的 cursor state、User session data 資訊會放到 LARGE POOL 中,如果 LARGE_POOL_SIZE 沒有設定,就會放到 SHARE POOL 這將會使 SHARE POOL 產生碎片,影響效能。

6.一些相關動態檢視:
    V$CIRCUIT
    V$SHARED_SERVER
    V$DISPATCHER
    V$SHARED_SERVER_MONITOR
    V$QUEUE
    V$SESSION

例子:檢視使用哪種方式連線資料庫

SQL> select sid from v$mystat where rownum=1;
       SID
----------
         9
SQL> select server from v$session
  2  where sid=9;

SERVER
---------
SHARED

7.檢視 listener 資訊:
    使用 Shared Server 時,當 Instance 啟動時,PMON 會動態將 service_names 引數,或 DISPATCHERS 中的 SERVICE 引數設定的值邦定到 LISTENER,併為該 SERVICE 分配相應的 DISPATCHER,這些資訊可以通過 LSNRCTL 命令來獲得:

C:\Documents and Settings\Administrator>lsnrctl

LSNRCTL for 32-bit Windows: Version 9.2.0.3.0 - Production on 17-MAY-2006 23:22:58

Copyright (c) 1991, 2002, Oracle Corporation.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=heysky)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 32-bit Windows: Version 9.2.0.3.0 - Produc
tion
Start Date                17-MAY-2006 21:41:12
Uptime                    0 days 1 hr. 46 min. 13 sec
Trace Level               off
Security                  OFF
SNMP                      OFF
Listener Parameter File   E:\oracle\ora92\network\admin\listener.ora
Listener Log File         E:\oracle\ora92\network\log\listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=heysky)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "SKYSHARED.heysky.net" has 1 instance(s).
  Instance "sky", status READY, has 4 handler(s) for this service...
Service "SKYTEST" has 1 instance(s).
  Instance "SKY", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
LSNRCTL> service
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=heysky)(PORT=1521)))
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 "SKYSHARED.heysky.net" has 1 instance(s).
  Instance "sky", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
      "D002" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER
         (ADDRESS=(PROTOCOL=tcp)(HOST=heysky)(PORT=2312))
      "D001" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER
         (ADDRESS=(PROTOCOL=tcp)(HOST=heysky)(PORT=2311))
      "D000" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER
         (ADDRESS=(PROTOCOL=tcp)(HOST=heysky)(PORT=2309))
Service "SKYTEST" has 1 instance(s).
  Instance "SKY", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


    如果 LISTENER 啟動,資料庫的任何動態改變,比如,DISPATCHERS、SERVICE_NAMES 都會動態邦定到 LISTENER,從 LSNRCTL 可以看到這些改變,如果 LISTENER 沒有啟動,改變之後,再啟動 LISTENER,那麼這些改變不會邦定到 LISTENER 上。所以一般建議,先啟動 LISTENER,再啟動資料庫,以便能夠動態邦定。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/40239/viewspace-202000/,如需轉載,請註明出處,否則將追究法律責任。

相關文章