天天看點

Oracle Dedicated server 和 Shared server(專用模式 和 共享模式) 說明

一.  官網說明

       在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.

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:

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 Internet 目錄(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方式連接配接資料庫.