共計 4395 個字符,預計需要花費 11 分鐘才能閱讀完成。
這篇文章主要介紹“數據庫的共享模式與專有模式是什么”,在日常操作中,相信很多人在數據庫的共享模式與專有模式是什么問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”數據庫的共享模式與專有模式是什么”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
一、簡介
概念
專有連接:用一個服務器進程響應一個客戶端請求
共享連接:在共享服務器模式下,客戶端通過監聽連接到 dispatcher 之后,dispatcher 會隨機分配一個端口,此時客戶端斷開和監聽的連接,通過分配的端口和 dispatcher 連接。和監聽的連接是短暫的。
適用場景
對于連接數不多的應用,適宜用專有連接,客戶的請求響應及時;
對于連接數較大的應用,適宜用共享連接,充分利用系統資源
二、相關參數
通用參數
remote_listener:可以實現數據庫和 listener 的分離。
單機環境的 remote_listener 一般為空。
rac 環境下,listener 是跟隨集群 crs 啟動的。而且數據庫 rdbms 的啟動要依賴 asm 實例的資源,所以不存在啟動數據庫后,listener 沒啟動,當然出現故障除外。
local_listener 是該節點的 listener 信息
remote_listener 一般是 scan 的信息
local_listener
pmon 只會動態注冊 port 等于 1521 的監聽,否則 pmon 不能動態注冊 listener,要想讓 pmon 動態注冊 listener,需要設置 local_listener 參數。
listener_networks:配置多個 remote_listener、local_listener 時需要,平時很少用
例子:alter system set LISTENER_NETWORKS= ((NAME=network1)(LOCAL_LISTENER=listener_net1)(REMOTE_LISTENER=scanone.gaopp.com:1521)) , ((NAME=network2)(LOCAL_LISTENER=listener_net2)(REMOTE_LISTENER=remote_net2))
共享參數
SHARED_SERVERS:如果 shared_server 值為 0,則表示數據庫沒有啟動共享服務模式。這個參數是配置 shared server 必須的,而且只有這個參數是必須的。它指定了當實例啟動的時候 shared server process 啟動的數量,不要將這個參數設置得太大,否者啟動數據庫 instance 的時候就會花更多時間,ORACLE 啟動過后會根據負載來動態調整 shared_servers
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_SESSIONS:指定了總共允許的的 shared server session 的數量。如果設置了這個參數,那么就不要將這個值超過 sessions,如果沒有設置這個值,那么只要還有空閑的 session, 就可以被使用。設置這個值是為專用連接預留的 User Sessions.
DISPATCHERS: 共享連接的分派器數量
MAX_DISPATCHERS: 可同時并發的共享連接的最大的分派器數量,此參數目前可忽略;
CIRCUITS: 可用的虛擬回路數(Specifies the total number of virtual circuits that are available for inbound and outbound network sessions)
三、資源
內存
large_pool_size
相比于專用服務器模式,共享服務模式的 UGA 在 SGA 中,而專用服務器模式的 UGA 在 PGA 當中,共享服務器模式下如果設置了 large_pool_size 則用戶的 UGA 會在 large_pool 中。MTS 減少的內存實際上是專用服務器模式下每個用戶連接到操作系統進程所需的內存,共享服務器模式由于限制了 Server Process 的數量,減少了建立 Server Process 所需要的內存,同時當并發量大時不需要頻繁的創建和刪除進程,減少了與之對應的開銷,提升了并發量。所以共享服務器模式適合于高并發,處理量小的業務系統。
進程
數據庫啟動之后比專用服務器模式會多出兩種進程,一種是調度進程(Dnnn),一種是共享服務器進程(Snnn)。來自客戶端的請求會被 dispatcher 接受,然后 dispatcher 將請求置入 Request 隊列。空閑的 Server Process 會按照 request 隊列開始處理隊列中的請求。處理過后的結果放入 Response 隊列中。最后再由 DIspatcher 來將最后的結果返回給客戶端。
Snnn:分派器進程使得客戶端進程可以共享數量有限的服務器進程。可以為單個數據庫實例創建多個分派器進程。分派器進程的最佳個數取決于操作系統的限制和每個進程的連接數。
Dnnn:在共享服務器配置中,每個共享服務器進程為多個客戶端請求服務。除了共享服務器進程不與特定客戶端進程相關聯外,共享服務器進程和專用服務器進程提供相同的功能。
四、優缺點
優點
減少了實例中的進程數
增加了更多并發用戶的數量
實現動態負載均衡
減少了空閑服務器進程數量
減少了實例 PGA 內存
缺點:由于共享服務器模式存在種種問題,同時中間件也完全可以實現連接池的效果,所以一般情況下不會共享服務器模式,使用專用服務器模式即可。
共享服務器的代碼路徑比專用服務器長,所以它天生就比專用服務器慢。
存在人為死鎖的可能,因為它是串行的,只要一個連接阻塞,則該服務器進程上的所有用戶都被阻塞,并且極可能死鎖。
存在獨占事務的可能,因為如果一個會話的事務運行時間過長,它獨占共享資源,其它用戶只能等待,而專用服務器,每個客戶端是一個會話。
共享服務器模式限制了某些數據庫特性,例如:不能單獨啟動和關閉實例,不能進行介質恢復,不能使用 Log Miner,并且 SQL_TRACE 沒有意義(因為是共享而不是當前會話的)。
五、信息收集
event
event 10257(后續會距離詳細說明)
視圖
V$DISPATCHER:提供 DISPATCH 進程信息,包括 DISPATCH 名稱,網絡,地址,狀態,統計信息和索引號等;
有記錄,說明是配置了 dispatchers 參數
V$DISPATCHER_CONFIG:提供 DISPATCH 的配置信息
V$DISPATCHER_RATE:提供 DISPATCH 的速度(RATE)統計
V$CIRCUIT:提供用戶通過 DISPATCH 連接到數據庫的虛擬回路信息(virtual circuits)
有記錄說明當前有使用共享模式的連接,無記錄則不能判定服務器模式
V$SHARED_SERVER:提供共享服務器信息
有記錄,且 STATUS 字段為 WAIT(COMMON),則說明啟動共享;
無記錄,或 STATUS 字段為 TERMINATED,則說明沒有啟動共享服務器
V$SHARED_SERVER_MONITOR:提供共享服務器的優化信息
V$QUEUE:提供共享服務器隊列信息.
V$SESSION:如果 SERVER 字段的值除了 DEDICATED,還有 NONE,則說明當前實例啟動了共享服務器,并且 SERVER 為 NONE 的會話正使用共享服務器連接,同時,如果只顯示有 DEDICATED,則不能說明服務器就一定工作在專用服務器下面,此時也有可能啟動了共享模式。只是目前連接到數據庫的都是專用服務器模式。
六、關閉數據庫共享模式
只需要將參數 shared_servers 設置為 0,即可關閉數據庫的共享模式。執行該腳本后,所有以共享方式連接到數據庫都不能成功,但是未釋放的共享連接會繼續保持連接,直到斷開為止。
alter system set shared_servers=0;
如果同時將參數 shared_servers 和 max_shared_servers 都設置為 0,那么共享連接方式將被終結。所有的共享方式連接都會斷開(已經連接的會話也會斷開)
七、開啟數據庫共享模式
設置 shared_servers 這個參數,將其值設置為大于 0 即可開啟服務器共享模式。其他的共享服務器參數可以不用設置,但是最好也設置一下 max_shared_servers 參數
alter system set shared_servers=1 scope=both;
alter system set max_shared_servers =24 scope=both;
關于參數 dispatchers 的設置,可以使用下面命令
alter system set dispatchers= (protocol=TCP)(disp=8)(serv=xxx)’
前面表示的是協議,disp 表示調度器 (dipatcher) 的進程數量,service 分別指定要采用共享服務器模式的服務名稱。使用上面的模式指定只啟動某個服務的共享模式,如果要設置所有服務都使用共享模式,則設置為:
alter system set dispatchers= (PROTOCOL=TCP)
八、當前模式的判斷
查看 V$SESSION 視圖
通過 v$session 視圖的 SERVER 字段來進一步判斷當前連接模式
SELECT SID, USERNAME, OSUSER, MACHINE,TERMINAL, SERVER
FROM V$SESSION
WHERE USERNAME IS NOT NULL;
查看連接數據庫的 tns 配置文件,如下所示
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.22)(PORT = 1521))
)
(CONNECT_DATA =
# SERVER = DEDICATED 為專用服務模式
(SERVER = SHARED)
(SERVICE_NAME = epps)
)
)
到此,關于“數據庫的共享模式與專有模式是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!