1. 程式人生 > >ORACLE 專用伺服器模式(DEDICATED)與共享伺服器模式(SHARE)的區別

ORACLE 專用伺服器模式(DEDICATED)與共享伺服器模式(SHARE)的區別

本文轉載自:http://blog.itpub.net/27038344/viewspace-734898/

共享與專用伺服器的區別:

專用伺服器(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
         (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
         (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,必須重新啟動資料庫。

摘錄:
專用伺服器模式與共享伺服器模式詳解
一、共享伺服器模式。
共享伺服器模式,也叫做多執行緒伺服器模式。在這種模式下,Oracle資料庫允許多個使用者程序共享非常少的伺服器程序。所以,可以同時實現使用者併發訪問
的人數也就大大的增加。
採用共享伺服器模式的話,則多個使用者可以共用一個伺服器程序,也就是說,此時客戶端程序與伺服器程序是多對一的情況。這主要是通過排程程式來實現
的。排程程式將多個加入資料庫訪問會話請求指引到一個共用佇列。伺服器程序共享池中某個閒置的共享伺服器程序依次從佇列中獲得一個請求。也就是說,一個很小的伺服器程序共享池可以為大量的客戶機提供服務。
共享伺服器連線是一種在程式編寫的時候通常會用到的連線池(pool)的概念。採用這種模式的話,在資料庫的初始化的時候就會建立一批伺服器連線的進
程,然後把這些連線程序放入一個連線池來進行治理。初始化的池中的程序數量在資料庫初始化建立的時候是可以手動設定的。在連線建立的時候,
Listener首先接受到客戶端的建立連線的請求,然後Listener去生成一個叫做排程器(dipatcher)的程序與客戶端進行連線。排程器把把客戶端的請求放在
SGA(系統全域性域)的一個請求佇列中,然後再共享伺服器連線池中查詢有無空閒的連線,然後讓這個空閒的伺服器進行處理。處理完畢以後再把處理結果
放在SGA的相應佇列中。排程器通過查詢相應佇列,得到返回結果,再返回給客戶端。這種連線模式的優點在於伺服器程序的數量可以得到控制,不大可能
出現因為連線人數過多而造成伺服器記憶體崩潰。但是由於增加了複雜度以及請求相應佇列,可能效能上有所下降。

以下應用情景下,可以選擇採用共享伺服器模式

1、 前臺客戶端數量比較多。
當大量使用者需要連線到資料庫並且需要有效的使用可用的系統資源的時候,則需要考慮採用共享伺服器模式。具體的來說,像現在採用的一些客戶端/伺服器
端模式的網路應用軟體,如ERP系統等等。一方面因為使用者人數比較多;另一方面企業由於資金有限,所以購置的是一般的伺服器。這些伺服器由於硬體方面
的一些限制,如資料庫系統與前臺應用伺服器採用統一臺伺服器。所以往往要求資料庫能夠充分使用硬體資源,以減少兩者之間的衝突。

2、 伺服器記憶體限制比較大。
共享伺服器模式下,當連線使用者增加時,其記憶體使用率增加不會很多。因為他們共享一個伺服器程序。所以,從這一個角度講,共享伺服器模式可以減少記憶體
的使用。但在專用伺服器模式下,記憶體的使用幾乎與使用者的數量成比例增加。
所以,使用者若在一些老的伺服器上部署Oracle資料庫的話,因為其主機板對記憶體的升級有所限制,所以,為了得到一個不錯的資料庫效能,往往採用共享伺服器
模式。如此,即時同時訪問資料庫的使用者有所增加,其記憶體也不會有多大的影響。可以大大的降低記憶體的壓力。

3、 某些特定功能要求採用共享伺服器模式。
雖然說,共享伺服器模式與專用伺服器模式在大部分情況下,都是通用的,支援Oracle資料庫系統的大部分功能。但是,某一些特定的功能,仍然需要資料庫管理員在共享伺服器模式下,才能夠啟用。比較典型的,如Oracle資料庫伺服器的連線共享、連線集中與負載均衡技術等等。他們必須在共享模式下才能夠執行。
負載均衡用來在群集環境下實現多機共享資料庫,以保證應用的高可用性。同時可以自動實現並行處理以及均分負載,還能夠實現資料庫在故障時的容錯和無斷點恢復。所以,在一些對於效能與穩定性要求比較高的應用場景中,如銀行中,往往都會採用負載均衡技術。此時,資料庫管理員在配置資料庫的時候,就需要考慮採用共享伺服器模式。

二、專用伺服器模式。
專用伺服器模式就是說每次在對Oracle進行訪問的時候,Oracle伺服器的Listener會得到這個訪問請求,然後回為這個訪問建立一個新的程序來進行服務。
所以說,對於每一個客戶端的訪問,都會生成一個新的程序進行服務,是一種類似一對一的對映關係。這種連線模式的一個很重要的特點就是UGA(使用者全
局域)是儲存在PGA(程序全域性域)中的,這個特性也很好說明了當前使用者的記憶體空間是按照程序來進行分配的。
在專用伺服器模式下,資料庫伺服器要求每個使用者擁有一個專用伺服器程序。也就是說,每個伺服器擁有一個伺服器程序。資料庫伺服器把現有的伺服器
程序地址發回客戶機,然後客戶機將連線請求重新發送到提供的伺服器地質,與專用伺服器比較。專用伺服器模式由於客戶端與伺服器端程序是一一對應的,所以,其效能上可能會比較有優勢。但是,當用戶比較多的時候,則其對伺服器的硬體資源,特別是記憶體,會產生比較大的壓力。
符合如下特徵的話,採用專用伺服器模式能夠取得比較好的效果

1、 只有少數客戶端。
若連線到資料庫的使用者比較少,則專用伺服器模式是首選。如企業前臺是一個財務管理系統,則其使用的人數就會比較少。因為其往往只涉及到一個部門。
但是,其資料量會比較多。因為我們知道,對於每一筆交易都需要在財務系統中進行詳細的紀錄。所以,雖然只是財務一個部門用,但是其紀錄量往往是
其他各個部門紀錄量的總合。在紀錄量多、連線使用者又比較少的情況下,採用專用伺服器模式,可以說是比較明智的選擇。

2、 為資料倉庫搭建的資料庫系統。
資料倉庫是資料庫技術的一個非常典型的應用。他是一個面向主體、整合、時變、非易失的資料集和,是支援管理部門的決策過程。他跟Oracle資料庫一樣,都是關係型資料庫,其中的紀錄以表格的方式儲存,並且能夠用統一的結構化語言進行資料查詢。採用資料倉庫的主要目的,是為了及時完成業務處理,及時給與客戶響應。

雖然說,關係資料庫能夠適應大型資料庫應用的需要,但是,不能夠將其簡單的堆砌就直接成為資料倉庫來使用。因為資料倉庫主要用來處理多維資料。他儲存紀錄的方式跟普通的有所不同。資料倉庫主要通過陣列方式來儲存紀錄,即沒有統一的規律可循,也沒有統一的多維模型可循,他只恩能夠購按其所屬類別進行歸類。雖然說傳統的二維資料庫不能夠簡單的堆砌來成為資料倉庫。但是,在設計資料倉庫的時候,並不是說要完全另起爐灶,而是可以利用現有的Oracle資料庫系統來處理資料,從中進行資訊的綜合,從而構造出滿足不同需要的資料倉庫。
所以,如果這個資料庫是為了實現資料倉庫而搭建的,則必須要採用專屬伺服器模式。這是Oracle資料庫的強制要求。

3、 聯機事務處理系統。
聯機事務處理系統,英文簡稱為OLTP。在這種應用下,採用什麼模式為好呢?這在業界,沒有統一的標準。有的說因為聯機事務處理系統使用人數比較多,
應該採用共享連線伺服器模式;而有的又說聯機處理系統對於及時性要求比較高,而共享伺服器模式可能會有比較長的等待時間,所以應該採用專用連線
伺服器模式。筆者是比較傾向於後面這種意見。

聯機事務處理系統,通常來說,有比較多的長事務與大事務。如使用者的某幾個操,必須作為一個事務處理等的觀念。此時,若使用者請求數大於共享伺服器
程序數的話,此時,就會發生排隊現象。假設現在有一個共享伺服器程序正在執行一個長事務,那麼請求佇列就需要一直等。直道這個事務完成為止。
若從客戶端的角度來講,則客戶請求的響應時間就加長了。所以,當用戶的連線請求數比共享程序要多時,那麼長事務的共享連線必將會造成共享程序的
排隊。事務越長,其排隊的時間也就越長,使用者響應的時間也就越長。如此惡性迴圈下去的話,很多聯機事務作業都會受到不同程度的影響。所以,
若聯機事務處理系統統是符合兩個條件(使用者連線請求數大於共享程序並且其事務大部分是長事務或者大事務),則採用專用伺服器連線模式比採用
共享伺服器連線模式效率要高。為了保障聯機事務處理系統正常執行,筆者建議資料庫管理員為其配置專用伺服器連線模式。

總之,談到兩種連線方式的優點和缺點,真的是各有千秋。在專用伺服器模式下,優點就是每個使用者都有一個連線,所以大家不至於有的應用佔著連線造成
別的客戶的請求給掛起了。而最大的缺點在於記憶體治理上,因為隨著連線數的增加,每增加一個連線,就要分配一份PGA,假如增加10000個連線,那就是
10000個PGA要提供,記憶體很輕易吃爆掉。而共享連線方式優點在於連線數量固定,所以記憶體數量不會佔用很多,不過在資料庫初始化的時候,共享伺服器就
要初始化好,比如有100個共享伺服器,由於共享連線模式下,UGA是分配在PGA中的,所以初始化的時候需要初始化比較多的記憶體,也就是那100個UGA的記憶體。另外共享伺服器還有一個優點就是很多資料庫高階連線特性都要求使用共享伺服器,所以有時候為了使用這些特性迫不得已只好設定為共享伺服器連線模式。共享伺服器的最大的缺點還是在於資料倉庫模式下執行的時候,假如有大量的請求需要長時間佔用伺服器,那麼就會造成很多別的請求的掛起,導致整個伺服器效能的降低。另外,在有些應用伺服器提供了連線池的時候,比如J2EE中經常有應用伺服器的連線池,比如Weblogic的啊,還有開源的DBCP以及C3P0等等。在有這些連線池的時候,共享伺服器對於效能上反而造成了累贅。另外,有時候在使用共享伺服器的時候,由於資料事務處理不及時,而佔住伺服器的程序試圖鎖定前面事務沒有處理的資料,會造成資料庫的死鎖,非凡是假如沒有設定連線鎖定超時的話,只能通過DBA上資料庫殺程序的方式來解決了。不過也有這種的最佳方案,那就是混合模式,也就是對於同一個資料庫伺服器,既有專用伺服器,也有共享伺服器,共享伺服器用來處理那種事務性很強的活。而專用伺服器用來對付那些比較耗時間和資源的請求。當然,也要看到時候的實際情況如何再做決定,兩者沒有絕對的哪種好哪種不好的差別。