OCP認證考試指南(13):管理共享服務器

1、共享服務器體系結構

共享服務器由作爲指定實例一部分的其他進程實現。這些進程是在實例啓動階段被啓動的後臺進程。此時存在兩種新進程:調度進程和共享服務器進程。SGA內還存在一些特殊的隊列存儲結構。

啓動共享服務器的實例時,除了啓動常見的後臺進程,還會啓動一個或多個調度進程,與其他TCP進程一樣,調度進程在操作系統的端口映射程序所分配的一個單一TCP端口上運行,並且使用偵聽器LOCAL_LISTENER參數與指定的偵聽器相聯繫並向其進行註冊。此時還會啓動一個或多個服務器進程。

上述進程類似於一個普通的專用服務器進程,只不過不依賴於會話。這些進程會接收、分析和執行SQL語句以及產生結果集,但它們並不是直接從一個用戶進程接收SQL語句,而是從一個隊列中讀取這些語句,這個隊列填充了來自任意數目用戶進程的SQL語句。同樣,共享服務器並不直接將結果集取回至一個用戶進程,而將結果集填入一個響應隊列。

問題來了,用戶進程生成的SQL語句怎樣進入被服務器進程讀取的隊列?結果集怎樣被取回至用戶進程?此時就需要使用調度程序。用戶進程聯繫偵聽器時,偵聽器的動作是傳回某個調度程序的地址,而不是啓動一個服務器進程與這個用戶進程聯繫在一起。只存在一個調度進程,那偵聽器會連接這個調度進程與所有用戶的連接。如果存在多個調度進程,那麼偵聽器會在這些調度進程之間實現對引入連接請求的負載均衡,最終結果是許多用戶進程分別連接一個調度進程。

爲了保護一個會話,與調度進程的連接必須持久,而與偵聽器的連接可以是短暫的。

用戶進程生成一條SQL語句時,這條語句會被髮送至調度進程。調度進程將其接收到的所有SQL語句放入一個隊列。因爲所有調度進程共享這個隊列,所以該隊列被稱爲“公共”隊列。所有共享服務器進程都監視公共隊列。在一條SQL語句到達公共隊列時,第一個可用的共享服務器會獲取這條語句。隨後的語句執行過程會經過通常的分析-綁定-執行階段,不過進入取出階段時,因爲用戶進程與這個共享服務器之間不存在連接,所以共享服務器無法將結果集取回至用戶進程。此時,共享服務器只能將結果放入最初接收到指定作業的調度進程專用的響應隊列。每個調度進程都會監視自己的響應隊列,一旦在響應隊列中放入了結果集,相應的調度進程就會獲得結果集並將其返回至先前發出SQL語句的用戶進程。

所有調度進程共享一個公共的輸入隊列,但是每個調度進程都具有自己的響應隊列。

調度進程與隊列機制的一個結果是任何可用的共享服務器都能夠執行來自己任何用戶進程的任何SQL語句。又有一問題,怎麼處理鎖定狀態的呢?爲了解決這問題,共享服務器會話在共享池中(而不是在PGA中)存儲大量的會話數據。只要某個共享服務器從公共隊列中獲取一個作業,那麼就會進入SGA並連接適當的內存塊,從而找出會話的狀態。SGA中用於每個共享服務器會話的內存被稱爲用戶全局區(User Global Area,簡寫UGA)。除了會話的堆棧空間之外,UGA還包含了PGA中的所有存儲結構,並且是進行存儲器存儲的來源。

在共享服務器中,不進入SGA的PGA存儲結構爲堆棧空間。

2、配置共享服務器

在服務器端,共享服務器與數據庫無關,而是隻與實例有關。通過動態實例註冊,偵聽器會被自動配置以用於共享服務器。可以斷定:共享服務器通過實例初始化參數進行配置。雖然存在若干可選的實例參數,但只有一個參數是必需的。

用於共享服務器的實例參數

參數 是否必須 高級參數或基本參數
SHARED_SERVERS 基本參數
DISPATCHERS 高級參數
MAX_SHARED_SERVERS 高級參數
MAX_DISPATCHERS 高級參數
LOCAL_LISTENER 高級參數
LARGE_POOL_SIZE 高級參數
CIRCUITS 高級參數
SHARED_SERVER_SESSIONS 高級參數
PROCESSES 基本參數
SESSIONS 基本參數

無論是否爲高級參數,只要使用了共享服務器,就應當設置實例參數SHARED_SERVERS、DISPATCHERS和LARGE_POOL_SIZE。在任何情況下始終應當設置的實例參數爲PROCESSES和SESSIONS。此外,如果偵聽器沒有使用1521端口,那麼還必須設置實例參數LOCAL_LISTENER。

  • SHARED_SERVERS:這個參數控制在實例啓動階段被啓動的共享服務器的數目。默認情況下,如果設置了實例參數DISPATCHERS,那麼SHARED_SERVERS參數就被設置爲1.MAX_SHARED_SERVERS參數被默認爲PROCESSES參數值的八分之一。
  • DISPATCHERS:參數控制在實例啓動階段所啓動的進程數以及這些進程的行爲。這個參數是共享服務器必須的唯一參數。DISPATCHERS參數存在許多選項,通常只需要使用其中兩個選項:啓動的調度進程數,這些調度進程應當偵聽的偵聽器的地址。MAX_DISPATCHERS參數是指能夠啓動的進程數的上限值,與共享服務器不一樣的是,Oracle不會根據需求啓動額外的調度進程。
  • LOCAL_LISTENER:與動態實例註冊有關,該參數告知實例其應當註冊的偵聽器的地址。共享服務器環境中,調度進程也會使用這個參數進行註冊,否則偵聽器無法知道調度進程所處的位置。
  • LARGE_POOL_SIZE:參數不是必須的,但應當總是對其進行設置。會話PGA中相當大的部分是UGA。UGA會被存儲在SGA內,默認情況下,用於所有會話的UGA都進入共享池。如果存在許多共享服務器會話,內存需求以及根據需要管理分配和釋放內存方面對共享池造成很大壓力。指定LARGE_POOL_SIZE參數,就可以在SGA中創建一個單獨區域,代替共享池的UGA使用。
  • CIRCUITS、SHARED_SERVER_SESSIONS:限制了允許通過共享服務器進行連接的用戶數。
  • PROCESSES:限制了能夠連接SGA的操作系統進程數,這個總數必須足夠大,從而能夠適用於後臺進程與所有的專用服務器進程,共享服務器進程與調度進程的數目也被計算在內。這是專用服務器中限制併發連接數的方法。
  • SESSION:應用於Oracle層次而非操作系統層次。限制對指定實例的併發登錄數。

配置共享服務器:

###############################################
# 啓動監聽,啓動實例,用命令設置啓用共享服務器
###############################################
 
$ lsnrctl start
 
$ sqlplus / as sysdba
 
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 3 21:19:10 2008
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
Connected to an idle instance.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area  264241152 bytes
Fixed Size                  1218868 bytes
Variable Size              88082124 bytes
Database Buffers          171966464 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
SQL> alter system set 
  2  dispatchers='(protocol=tcp)(dispatchers=2)' 
  3  scope=spfile;
 
System altered.
 
SQL> alter system set shared_servers=3 scope=spfile;
 
System altered.
SQL> startup force;
ORACLE instance started.
 
Total System Global Area  264241152 bytes
Fixed Size                  1218868 bytes
Variable Size              88082124 bytes
Database Buffers          171966464 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
 
###############################################
# 確認啓動調度進程與共享服務器進程
# 可以看到調度進程(D000、D001)和三個共享服務器進程(S001、S002、S003)
# 書上共享服務器進程S開頭,我電腦上怎麼P開頭?
###############################################
 
SQL> select program from v$process;
 
SQL> exit
 
###############################################
# 下面的輸入相似就行了,lsnrctl確認偵聽器註冊了調試進程
###############################################
 
$ lsnrctl services
 
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 03-OCT-2008 21:20:22
 
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
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 "ora" has 1 instance(s).
  Instance "ora", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
      "D001" established:0 refused:0 current:0 max:972 state:ready
         DISPATCHER <machine: OracleServer, pid: 3694>
         (ADDRESS=(PROTOCOL=tcp)(HOST=OracleServer)(PORT=60422))
      "D000" established:0 refused:0 current:0 max:972 state:ready
         DISPATCHER <machine: OracleServer, pid: 3692>
         (ADDRESS=(PROTOCOL=tcp)(HOST=OracleServer)(PORT=39547))
Service "ora_XPT" has 1 instance(s).
  Instance "ora", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
      "D001" established:0 refused:0 current:0 max:972 state:ready
         DISPATCHER <machine: OracleServer, pid: 3694>
         (ADDRESS=(PROTOCOL=tcp)(HOST=OracleServer)(PORT=60422))
      "D000" established:0 refused:0 current:0 max:972 state:ready
         DISPATCHER <machine: OracleServer, pid: 3692>
         (ADDRESS=(PROTOCOL=tcp)(HOST=OracleServer)(PORT=39547))
The command completed successfully
 
###############################################
# 遠程連接,通過偵聽器登錄實例
###############################################
 
C:/>sqlplus test/test@ora
 
SQL*Plus: Release 10.2.0.3.0 - Production on 星期五 103 20:23:13 2008
 
Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.
 
連接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
 
###############################################
# 查詢會返回一條記錄,說明新會話經過調試進程以及會話地址
# 我這裏沒成功,可能是版本問題,別人在10.1的版本上成功查詢出結果,我的10.2版本
###############################################
 
SQL> select dispatcher, saddr, circuit from v$circuit;

3、監視共享服務器

下面介紹的視圖能說明共享服務器環境的狀態。

V$CIRCUIT視圖:給出一條記錄說明通過共享服務器的所有併發連接。其中,CIRCUIT列是唯一標識符。通過連接這個列與V$SESSION視圖中的SADDR列以及V$DISPATCHER視圖中的DISPATCHER列,可以將會話映射至調度進程。
V$SHARED_SERVER視圖:每個共享服務器進程狀態。其中,IDLE和BUSY列說明了每個進程實際服務於講求所花費的時間量,而不是等待作業到達公共隊列所花的時間量。
V$DISPATCHER視圖:爲每個調度進程給出一條記錄。重要點的列IDLE和BUSY。
V$SHARED_SERVER_MONTTOR視圖:給出一記錄說明經過共享服務器的最大連接數與最大會話數(通常相同)。此外,該記錄還說明已被動態啓動的共享服務器進程數。如果這個數大於零,說明最初沒有啓動足夠多的共享服務器進程。
V$QUEUE視圖:給出一條用於公共隊列的記錄以及一條用於所有調度進程的響應隊列的記錄。QUEUE列十分重要,這個列說明隊列中數據項的數目。記住,理想情況下應當不存在排隊。如果公共隊列中存在數據項,說明沒有足夠的共享服務器進程被用於清空隊列。如果響應隊列中存在數據項,說明調度進程處理超負荷狀態。
V$MTS視圖:提供向後兼容能力。和V$SHARED_SERVER_MONTTOR視圖完全相同。

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