一. 官網說明
在DBCA 建庫的時候,有提示讓我們選擇連線類型,這裡有兩種類型:專用伺服器模式和共用伺服器模式。預設使用專用模式。如:
Oracle 官方文檔對這兩種文檔的說明如下:
About Dedicated andShared Server Processes
http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/manproc001.htm
OracleDatabase creates server processes to handle the requests of user processesconnected to an instance. A server process can be either of the following:
(1)A dedicated server process, which services only one userprocess
(2)A shared server process, which can service multiple userprocesses
Oracle 建立Server process 來處理user processes串連執行個體的的請求。 server process 分兩種: dedicated server process和 sharedserver process。
Yourdatabase is always enabled to allow dedicated server processes, but you mustspecifically configure and enable shared server by setting one ormore initialization parameters.
1.1 Dedicated Server Processes
Figure4-1, "Oracle Database Dedicated Server Processes" illustrateshow dedicated server processes work. In this diagram two user processes areconnected to the database through dedicated server processes.
Ingeneral, it is better to be connected through a dispatcher and use ashared server process. This is illustrated in Figure4-2, "Oracle Database Shared Server Processes". A shared serverprocess can be more efficient because it keeps the number of processes requiredfor the running instance low.
Inthe following situations, however, users and administrators should explicitlyconnect to an instance using a dedicated server process:
在以上兩種情況,需要顯示的使用dedicated server process 去串連執行個體:
(1)To submit a batch job (for example, when a job can allow little orno idle time for the server process)
(2)To use Recovery Manager (RMAN) to back up, restore, or recover a database
Torequest a dedicated server connection when Oracle Database is configured forshared server, users must connect using a net service name that is configuredto use a dedicated server. Specifically, the net service name value shouldinclude the SERVER=DEDICATED clause in the connect descriptor.
如果資料庫配置的是shared server,想要用dedicated server 去串連執行個體,就必須配置在net service name(tnsnames.ora)裡指定SERVER=DEDICATED。
Figure 4-1 OracleDatabase Dedicated Server Processes
1.2 Shared Server Processes
Consideran order entry system with dedicated server processes. A customer phones theorder desk and places an order, and the clerk taking the call enters the orderinto the database. For most of the transaction, the clerk is on the telephonetalking to the customer. A server process is not needed during this time, sothe server process dedicated to the clerk's user process remains idle. Thesystem is slower for other clerks entering orders, because the idle serverprocess is holding system resources.
Sharedserver architecture eliminates the need for a dedicated server process for eachconnection (see Figure4-2).
Figure 4-2 OracleDatabase Shared Server Processes
Ina shared server configuration, client user processes connect to a dispatcher.The dispatcher can support multiple client connections concurrently. Eachclient connection is bound to a virtual circuit, which is a piece ofshared memory used by the dispatcher for client database connection requestsand replies. The dispatcher places a virtual circuit on a common queue when arequest arrives.
Anidle shared server process picks up the virtual circuit from the common queue,services the request, and relinquishes the virtual circuit before attempting toretrieve another virtual circuit from the common queue. This approach enables a small pool of server processes to serve a largenumber of clients. A significant advantage of shared server architectureover the dedicated server model is the reduction of system resources, enablingthe support of an increased number of users.
Foreven better resource management, shared server can be configuredfor connection pooling. Connection pooling lets a dispatcher support moreusers by enabling the database server to time-out protocol connections and touse those connections to service an active session. Further, shared server canbe configured for session multiplexing, which combines multiple sessionsfor transmission over a single network connection in order to conserve the operatingsystem's resources.
Sharedserver architecture requires Oracle Net Services. User processes targeting theshared server must connect through Oracle Net Services, even if they are on thesame machine as the Oracle Database instance.
二. 說明2.1 Dedicated server 說明
對於專用伺服器配置,在登入時,Oracle 總會建立一個新的進程,這個伺服器處理序會在會話生存期中專門這個串連服務。對於每個會話,都會出現一個新的專用伺服器,會話與專用伺服器之間存在一對一的映射。按照定義,這個專用伺服器不是執行個體的一部分。客戶進程(也就是想要串連資料庫的程式)會通過某種網路通道(如TCP/IP socket)與這個專用伺服器直接通訊,並由這個伺服器處理序接收和執行我的SQL。如果必要,它會讀取資料檔案,並在資料庫的緩衝中尋找我要的資料。也許它會完成我的更新語句,也可能會運行我的PL/SQL 代碼。這個伺服器處理序的主要目標就是對我提交的SQL 調用做出響應。
2.2 Shared server 說明2.2.1 說明
共用伺服器(shared server),正式的說法是多線程伺服器(Multi-Threaded Server)或MTS。如果採用這種方式,就不會對每條使用者串連建立另外的線程或新的UNIX 進程。
在共用伺服器中,Oracle 使用一個“共用進程”池為大量使用者提供服務。共用伺服器實際上就是一種串連池機制。利用共用伺服器,我們不必為10,000 個資料庫會話建立10,000 個專用伺服器(這樣進程或線程就太多了),而只需建立很少的一部分進程/線程,顧名思義,這些進程/線程將由所有會話共用。這樣Oracle 就能讓更多的使用者與資料庫連接,否則很難串連更多使用者。如果讓我的機器管理10,000個進程,這個負載肯定會把它壓垮,但是管理100 個或者1,000 個進程還是可以的。採用共用伺服器模式,共用進程通常與資料庫一同啟動,使用ps命令可以看到這個進程。
共用伺服器串連和專用伺服器串連之間有一個重大區別,與資料庫連接的客戶進程不會與共用伺服器直接通訊,但專用伺服器則不然,客戶進程會與專用伺服器直接通訊。之所以不能與共用伺服器直接對話,原因就在於這個伺服器處理序是共用的。為了共用這些進程,還需要另外一種機制,通過這種機制才能與伺服器處理序“對話”。為此,Oracle 使用了一個或一組稱為調度器(dispatcher,也稱指派器)的進程。
客戶進程通過網路與一個調度器進程通訊。這個調度器進程將客戶的請求放入SGA中的請求隊列(這也是SGA 的用途之一)。第一個閒置共用伺服器會得到這個請求,並進行處理(例如,請求可能是UPDATE T SETX = X+5 WHERE Y = 2)。完成這個命令後,共用伺服器會把響應放在原調度器(即接收請求的調度器)的響應隊列中。調度器進程一直在監聽這個隊列,發現有結果後,就會把結果傳給客戶。從概念上講,共用伺服器請求的流程2-3 所示。
2-3 所示,客戶串連向調度器發送一個請求。調度器首先將這個請求放在SGA 中的請求隊列中①。第一個可用的共用伺服器從請求隊列中取出這個請求②並處理。共用伺服器的處理結束後,再把響應(返回碼、資料等)放到響應隊列中③,接下來調度器拿到這個響應④,傳回給客戶。
2.2.2 共用伺服器具有以下一些缺點
一般我們以oracle預設的專用伺服器方式就行了,沒必要使用共用伺服器模式。一個是我們是使用中介軟體(如:weblogic)去連oracle的,中介軟體本身有串連池機制,另外就是oracle的這個共用伺服器方式也做的不夠好了,有諸多缺點。
1)共用伺服器的代碼路徑比專用伺服器長,所以它天生就比專用伺服器慢。
2)存在人為死結的可能,因為它是串列的,只要一個串連阻塞,則該伺服器處理序上的所有使用者都被阻塞,並且極可能死結。
3)存在獨佔事務的可能,因為如果一個會話的事務已耗用時間過長,它獨佔共用資源,其它使用者只能等待,而專用伺服器,每個用戶端是一個會話。
4)共用伺服器模式限制了某些資料庫特性,例如:不能單獨啟動和關閉執行個體,不能進行介質恢複,不能使用Log Miner,並且SQL_TRACE沒有意義(因為是共用而不是當前會話的)。
MTS減少的記憶體實際上是專用伺服器模式下每個使用者串連到作業系統進程所需的記憶體,但它卻使用SGA的Large_Pool來分配UGA,拆東牆補西牆,所減少的記憶體是很少的。如果使用者會話的串連和斷開很頻繁,資料庫進程的建立和刪除的開銷會非常大,這種情況最好採用共用伺服器模式(否則,應該使用串連池技術)。如果用戶端一次串連終身使用(會話生命週期內),使用共用伺服器模式的意義不大。因為大部分時間,一個會話就串連到一個伺服器處理序,無法共用伺服器處理序。
2.2.3 共用服務初始化參數的一些說明
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覆蓋。
circuits:指定了virtual circuits 的總數量。
2.2.4關閉共用模式
將shared_servers參數置為0,那麼所有以共用方式串連到資料庫都不能成功,但是未釋放的共用串連會繼續保持串連,直到斷開。如果將shared_servers 和max_shared_servers都設為0,那麼共用串連將被終結。所有的共用方式串連都斷開了的話,就可以使用alter system set dispatcher=’’; 將dispatcher清除,防止下次啟動資料庫又開啟了共用串連方式。
2.3 TCP/IP 串連的基本原理
這裡將分析網路上最常見的一種情形:在TCP/IP 串連上建立一個基於網路的串連請求。在這種情況下,客戶在一台機器上,而伺服器駐留在另一台機器上,這兩台機器通過一個TCP/IP 網路連接。客戶率先行動,使用Oracle 客戶軟體(Oracle 提供的一組應用程式介面,或API)建立一個請求,力圖串連資料庫。
例如,客戶可以發出以下命令:
C:\Users\Administrator.DavidDai>sqlplus sys/oracle@dave2_202as sysdba;
SQL*Plus: Release 11.2.0.1.0 Production onSun Aug 21 14:36:47 2011
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise EditionRelease 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Miningoptions
SQL>
這裡,客戶是程式SQL*Plus,dave2_202是一個TNS 服務名。TNS 代表透明網路底層(Transparent Network Substrate),這是Oracle 客戶中處理遠端連線的“基礎”軟體,有了它才有可能建立對等通訊。TNS 串連串告訴Oracle 軟體如何與遠端資料庫串連。
一般地,機器上啟動並執行客戶軟體會讀取一個tnsnames.ora 檔案。這是一個純文字的設定檔,通常放在[ORACLE_HOME]\network\admin目錄下。配置如下:
dave2_202 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.202)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dave2)
)
)
根據這個配置資訊,Oracle 客戶軟體可以把我們使用的TNS 串連串dave2_202映射到某些有用的資訊,也就是主機名稱、該主機上“監聽器”進程接受(監聽)串連的連接埠、該主機上所串連資料庫的服務名,等等。
服務名表示具有公用屬性、服務級閾值和優先順序的應用組。提供服務的執行個體數量對應用是透明的,每個資料庫執行個體可以向監聽器註冊,表示要提供多個服務。 所以,服務就映射到物理的資料庫執行個體,並允許DBA 為之關聯閾值和優先順序。這個串(dave2_202)還可以用其他方式來解析。例如,可以使用Oracle 網際網路目錄(Oracle Internet Directory,OID),這是一個分布式輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP)伺服器,其作用就相當於解析主機名稱的DNS。不過,tnsnames.ora檔案通常只適用於大多數小到中型安裝,在這些情況下,這個設定檔的副本不算太多,尚可管理。
既然客戶軟體知道要串連到哪裡,它會與主機名稱為192.168.3.202 的伺服器在連接埠1521 上開啟一條TCP/IP socket 串連。如果伺服器DBA 安裝並配置了Oracle Net,並且有一個監聽器在連接埠1521上監聽串連請求,就會收到這個串連。 在網路環境中,我們會在伺服器上運行一個稱為TNS 監聽器的進程。就是這個監聽器進程能讓我們與資料庫物理串連。當它收到入站串連請求時,它會使用自己的設定檔檢查這個請求,可能會拒絕請求(例如,因為沒有這樣的資料庫,或者可能我們的IP 位址受到限制,不允許串連這個主機),也可能會接受請求,並真正建立串連。
如果建立一條專用伺服器串連,監聽器進程就會為我們建立一個專用伺服器。在UNIX上,這是通過fork()和exec()系統調用做到的(在UNIX 中,要在初始化之後建立新進程,惟一的辦法就是通過fork())。 這個新的專用伺服器處理序繼承了監聽器建立的串連,現在就與資料庫物理地串連上了。
在Windows 上,監聽器進程請求資料庫進程為串連建立一個新線程。一旦建立了這個線程,客戶就會“重新導向”到該線程,相應地就能建立物理串連。圖2-4 顯示了UNIX 上的監聽器進程和專用伺服器串連。
另一方面,如果我們發出共用伺服器串連請求,監聽器的表現則會有所不同。監聽器進程知道執行個體中運行了哪些調度器。接收到串連請求後,監聽器會從可用的調度器池中選擇一個調度器進程。監聽器會向客戶返回串連資訊,其中說明了客戶如何與調度器進程串連;如果可能的話,還可以把串連“轉寄”給調度器進程(這依賴於不同的作業系統和資料庫版本,不過實際效果是一樣的)。
監聽器發回串連資訊後,它的工作就結束了,因為監聽器一直在特定主機的特定連接埠上運行(主機名稱和連接埠號碼大家都知道),而調度器會在伺服器上隨意指派的連接埠上接受串連。監聽器要知道調度器指定的這些隨機連接埠號碼,並為我們選
擇一個調度器。客戶再與監聽器中斷連線,並與調度器直接連接。現在就與資料庫有了一個物理串連。這個過程2-5 所示。
三. 判斷oracle是共用模式還是專用模式的方法3.1. showparameter shared_server;
(註:8i應為:showparameter mts_servers;)
SQL> show parameter shared_server;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer 20
shared_server_sessions integer 330
shared_servers integer 1
3.2 查看v$session 視圖
SQL> Select username,server,program fromv$session where username is not null;
USERNAME SERVER PROGRAM
------------------------------ ------------------------------------------------
SYS DEDICATED rman.exe
RMAN DEDICATED rman.exe
SYS DEDICATED rman.exe
SYS DEDICATED sqlplus.exe
SYS DEDICATED rman.exe
DAVE DEDICATED toad.exe
SYS DEDICATED toad.exe
3.3 查看監聽: lsnrctl service
C:\Users\Administrator.DavidDai>lsnrctlservice
LSNRCTL for 32-bit Windows: Version11.2.0.1.0 - Production on 26-6月 -2010 11:7:40 Copyright (c) 1991, 2010, Oracle. All rights reserved.
正在串連到(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
服務摘要..
服務"orcl" 包含 1 個執行個體。
執行個體 "orcl", 狀態 READY, 包含此服務的 1 個處理常式...
處理常式:
"DEDICATED" 已建立:34 已拒絕:0 狀態:ready
LOCAL SERVER
服務"orclXDB" 包含 1 個執行個體。
執行個體 "orcl", 狀態 READY, 包含此服務的 1 個處理常式...
處理常式:
"D000" 已建立:0 已被拒絕:0 當前: 0 最大: 1022 狀態: ready
DISPATCHER <machine: DAVIDDAI, pid:10884>
(ADDRESS=(PROTOCOL=tcp)(HOST=DavidDai)(PORT=58400))
命令執行成功
3.4.查看TNSNAMES.ora 檔案。如:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DavidDai)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
這裡是以DEDICATED 專用模式串連 orcl 執行個體。寫上 (SERVER = SHARED) 則是使用共用伺服器模式,但是這時shared_server_process需要開啟,要不然會出錯連不上oracle。要是這段放空沒寫,那麼系統會根據伺服器模式自動調節,不過根據實測結果,就算伺服器是定義成共用伺服器模式,shared_server_process沒開啟的情況下,在v$session中查到的串連依然是SERVER = DEDICATED。
所以基本上我們這段話我們都是可以放空著不寫的,但是有時候要連上我們的共用伺服器模式的資料庫,放空有可能系統認為要用共用伺服器方式去連,那時就要聲明 SERVER = DEDICATED採用專用伺服器方式去串連。
在資料庫啟動的時候,如果沒有指定shared_servers,但是設定了dispatchers,那麼ORACLE就認為啟動了shared server ,並且設定shared_servers為1. 在資料庫啟動的時候,沒有設定shared_servers,沒有設定dispatchers,即使以後修改了dispatchers,也不能啟動shared server,必須從新啟動資料庫。
另外,Background process ,以及通過本地串連進來的,只能是DEDICATED .比如說sqlplus user/pass形式。如果資料庫沒有配置共用伺服器,那麼用戶端只能以DEDICATED方式串連資料庫.
-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(滿); DBA2 群:62697977(滿) DBA3 群:62697850(滿)
DBA 超級群:63306533(滿); DBA4 群: 83829929(滿) DBA5群: 142216823(滿)
DBA6 群:158654907(滿) 聊天 群:40132017(滿) 聊天2群:69087192(滿)
--加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請