一直沒對專用於共用的互換搞清楚,找到了這篇文章http://blog.csdn.net/tianlesoftware/archive/2010/06/26/5695784.aspx
,讓我實踐了一把,確實明白了許多。以下大多是轉自該連結的,將其收藏,供以後方便尋找學習。
共用與專用伺服器的區別:
專用伺服器(DEDICATED):一個用戶端串連對應一個伺服器處理序
共用伺服器(SHARE):多個用戶端串連對應一個伺服器處理序,伺服器端存在一個進程調度器來管理。它必須使用net services.也就是說必須配置tns。它適合用於高並發,事物量小,如果這個時候採用了共用模式,可以大大減少由於高度並發對於ORACLE伺服器的資源消耗。
共用伺服器具有以下一些缺點:
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,必須重新啟動資料庫。