這幾天在研究Oracle 11g的監聽和控制文件,看到一篇對共享服務器模式介紹比較好的文章,特轉載如下:
--======================
-- 配置共享服務器模式
--======================
一、服務器的兩種模式:專用服務器模式、共享服務器模式
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.
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.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模式
(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.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 --從客戶端使用共享模式連接
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 聯機重做日誌文件(ONLINE LOG FILE)
原文地址:http://blog.csdn.net/leshami/article/details/6030190