專用服務器(DEDICATED):一個客戶端連接對應一個服務器進程
共享服務器具有以下一些缺點:
1)共享服務器的代碼路徑比專用服務器長,所以它天生就比專用服務器慢。
2)存在人爲死鎖的可能,因爲它是串行的,只要一個連接阻塞,則該服務器進程上的所有用戶都被阻塞,並且極可能死鎖。
3)存在獨佔事務的可能,因爲如果一個會話的事務運行時間過長,它獨佔共享資源,其它用戶只能等待,而專用服務器,每個客戶端是一個會話。
4)共享服務器模式限制了某些數據庫特性,例如:不能單獨啓動和關閉實例,不能進行介質恢復,不能使用Log Miner,並且SQL_TRACE沒有意義(因爲是共享而不是當前會話的)。
MTS減少的內存實際上是專用服務器模式下每個用戶連接到操作系統進程所需的內存,但它卻使用SGA的Large_Pool來分配UGA,拆東牆補西牆,所減少的內存是很少的。如果用戶會話的連接和斷開很頻繁,數據庫進程的創建和刪除的開銷會非常大,這種情況最好採用共享服務器模式(否則,應該使用連接池技術)。如果客戶端一次連接終身使用(會話生命週期內),使用共享服務器模式的意義不大。因爲大部分時間,一個會話就連接到一個服務器進程,無法共享服務器進程。
共享服務初始化參數的一些說明:
shared_servers :指定了當instance 啓動的時候 shared server process 啓動的數量,不要將這個參數設置得太大,否者啓動數據庫instance 的時候
就會花更多時間,Oracle啓動過後會根據負載來動態調整shared_servers。如果爲0,表示數據庫沒有啓動共享服務模式。 這個參數是
配置shared server 必須的,而且只有這個參數是必須的。
--修改參數: alter system set shared_servers=1;
max_shared_servers:ORACLE在同一個時刻最大能夠使用的 shared server process.不要將這個參數設置小於 shared_servers,如果動態修改
shared_servers大於max_shared_servers,ORACLE會覆蓋max_shared_servers的值,此時你需要修改max_shared_servers.
同時也不能大於processes。這個參數是爲了給佔用很大資源操作而設的(批處理),爲了預留一些process 給DBA任務(rman備份),
shared_server_sesions: 指定了總共允許的的 shared server session 的數量。如果設置了這個參數,那麼就不要將這個值超過sessions,如果沒有
設置這個值,那麼只要還有空閒的session,就可以被使用。設置這個值是爲專有連接預留 user sessions.
dispatchers(調度進程):配置 dispatcher process .如果不設置這個參數,只要設置了shared_servers,oracle 也會自動設置一個基於tcp協議的dispatcher。
還需要查看操作系統支持一個dispatcher能處理多少個connections
SQL> select * from v$dispatcher;
max_dispatchers: 設置同一時刻能夠同時運行的dispatchers的數量,必須大於等於 dispatchers ,小於processes。這個參數也會被dispatchers覆蓋。
關閉調度進程:
首先要查詢到DISPATCHERS的NAME: SELECT NAME,NETWORK FROM V$DISPATCHER;
然後關閉調度進程:ALTER SYSTEM SHUTDOWN IMMEDIATE 'D000';
circuits(虛擬迴路):指定了virtual circuits 的總數量。
SQL> select * from V$CIRCUIT;
關閉共享模式:
將 shared_servers 參數置爲0(alter system set shared_servers=0;),那麼所有以共享方式連接到數據庫都不能成功,但是未釋放的共享
連接會繼續 保持連接,直到斷開。如果將 shared_servers 和 max_shared_servers 都設爲0(alter system set max_shared_servers=0;),
那麼共享連接將被終結。所有的共享方式連接都斷開了的話,就可以使用 alter system set dispatcher=''; 將dispatcher清除,防止下次啓動
數據庫又打開了共享連接方式。
判斷oracle是共享模式還是專用模式的方法:
1. show parameter shared_server; (注:8i應爲:show parameter mts_servers;)
SQL> show parameter shared_server;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer 0
shared_server_sessions integer
shared_servers integer 0 --爲0表示專用模式
2. 查看v$session 視圖
SQL> Select username,server,program from v$session where username is not null;
USERNAME SERVER PROGRAM
--------- --------- -------------------
GWM NONE
SYS SHARED plsqldev.exe
SYS SHARED plsqldev.exe
SYS DEDICATED sqlplus.exe --專用模式
3. 查看監聽: lsnrctl service
$ lsnrctl service
LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production on 08-MAR-
2011 14:28:08
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary...
Service "telemt" has 1 instance(s).
Instance "telemt", status READY, has 2 handler(s) for this service...
Handler(s):
"DEDICATED" established:6 refused:0 state:ready
LOCAL SERVER
"D000" established:51 refused:0 current:3 max:1022 state:blocked
DISPATCHER <machine: ossdb2, pid: 504060>
(ADDRESS=(PROTOCOL=tcp)(HOST=loopback)(PORT=53932))
Service "telemt_XPT" has 1 instance(s).
Instance "telemt", status READY, has 2 handler(s) for this service...
Handler(s):
"DEDICATED" established:6 refused:0 state:ready
LOCAL SERVER
"D000" established:51 refused:0 current:3 max:1022 state:blocked
DISPATCHER <machine: ossdb2, pid: 504060>
(ADDRESS=(PROTOCOL=tcp)(HOST=loopback)(PORT=53932))
The command completed successfully
4.查看TNSNAMES.ora 文件。如:
IGISDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 134.74.21.51)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = telemt)
(SERVER = DEDICATED)
)
)
這裏是以DEDICATED 專用模式連接 telemt 實例。寫上 (SERVER = SHARED) 則是使用共享服務器模式,但是這時shared_server_process需要
打開(即oracle服務器的shared_servers參數要設置爲共享模式),要不然會出錯連不上oracle(ora-12520:TNS:監聽程序無法爲請求的服務器類型找
到可用的處理程序)。
要是這段放空沒寫,那麼系統會根據服務器模式自動調節,不過根據實測結果,就算服務器是定義成共享服務器模式,shared_server_process沒打
開的情況下,在v$session中查到的連接依然是SERVER = DEDICATED。所以基本上我們這段話都是可以放空着不寫的,但是有時候要連上我們的共享服務
器模式的數據庫,放空有可能系統認爲要用共享服務器方式去連,因此最好聲明 SERVER = DEDICATED 採用專用服務器方式去連接。
在數據庫啓動的時候,如果沒有指定shared_servers,但是設置了dispatchers,那麼ORACLE就認爲啓動了shared server ,並且設置
shared_servers爲1。 在數據庫啓動的時候,沒有設置shared_servers,也沒有設置dispatchers,即使以後修改了dispatchers,也不能啓動
shared server,必須重新啓動數據庫。