一、專用服務器(DEDICATED):
一個客戶端連接對應一個服務器進程,專用服務器體系:每個客戶進程與專用服務器進程連接。服務器進程沒被任何另外的客戶共享。
專用服務器體系結構不支持HTTP和IIOP客戶,僅支持TTC客戶。
一般我們以oracle默認的專用服務器方式就行了,沒必要使用共享服務器模式。
1)、也叫做多線程服務器模式
多個用戶進程使用同一個服務器進程。 多個客戶端連接對應一個服務器進程,服務器端用一個進程調度器來管理。 1、它必須使用net services. 2、必須配置tnsnames.ora。
2)、適合場景
它適合用於高並發,事務量小的情況,如果這個時候采用了共享模式,可以大大減少由於高度並發對於ORACLE服務器的資源消耗。
共享服務器體系:客戶進程最終與一個調度程序連接,PMON進程注冊了調度程序的位置和負荷,
使監聽器能夠提交到負荷最小的調度程序。一個調度程序能並發地支持多重的客戶連接。
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
將shared_servers參數置為0,那么所有以共享方式連接到數據庫都不能成功,但是未釋放的共享連接會繼續 保持連接,直到斷開。
如果將shared_servers 和max_shared_servers都設為0,那么共享連接將被終結。所有的共享方式連接都斷開了的話,
就可以使用alter system set dispatcher=’’; 將dispatcher清除,防止下次啟動數據庫又打開了共享連接方式。
[oracle@shdb02 ~]$ lsnrctl service LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 10-MAR-2022 23:03:34 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) Services Summary... Service "+ASM" has 1 instance(s). Instance "+ASM2", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 state:ready LOCAL SERVER Service "fp" has 1 instance(s). Instance "fp2", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:1790 refused:0 state:ready LOCAL SERVER The command completed successfully
[oracle@shdb02 ~]$ locate tnsnames.ora /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
Oracle默認的Server Process是Dedicated,因此無需特殊配置
只要在Client的連接方式上聲明Server為DEDICATED。比如Oracle Client的tnsname.ora文件聲明如下
[oracle@shfpdb02 ~]$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
STANDBY1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.40)(PORT = 1521))
)
(CONNECT_DATA =
(SID = shfpdb1)
(SERVICE_NAME = standby)
)
)
htstandby1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.128.54.20)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED) //使用專用模式連接,改成共享模式這樣改 (SERVER = shared),當然你還需要在控制台進行開啟共享模式的一些配置和設置。
(SERVICE_NAME = htstandby1)
)
)
SHDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.129.50.45)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)//使用專用模式連接
(SERVICE_NAME = shdb)
)
)
Background process ,以及通過本地連接進來的,只能是DEDICATED (專用模式). 比如說sqlplus user/pass形式 如果數據庫沒有配置共享服務器,那么客戶端只能以DEDICATED方式連接數據庫. ORA-12545 連接因對象主機或對象不存在而失敗. ORA-12545: Connect failed because target host or object does not exist
查詢當前數據庫使用什么模式的方法: select * from v$shared_servers 任何一個結果為空時 當前庫使用的是專用服務器模式: select * from v$dispatchers 對應的參數為空 則為專用服務器模式: show parameter dispatchers 結果中server列的值為dedicated 則為專用服務器模式:select * from v$session 對應的監聽下可見 DEDICATED 為專用服務器模式: lsnrctl services
select * from v$queue查看隊列
select * from v$circuit
查看哪些進程在服務 select * from v#shared_server_monitor
具體看下查詢當前數據庫使用什么模式的方法
1)select * from v$shared_servers (8i之后)
SQL> show parameter shared_server; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ max_shared_servers integer shared_server_sessions integer shared_servers integer 1
2). 查看v$session 視圖
SQL> Select username,server,program from v$session where username is not null;
USERNAME SERVER
------------------------------ --------- PROGRAM ------------------------------------------------ SYS DEDICATED oraagent.bin@shfpdb02 (TNS V1-V3) SHFP DEDICATED plsqldev.exe SYS DEDICATED sqlplus@shfpdb02 (TNS V1-V3) USERNAME SERVER ------------------------------ --------- PROGRAM ------------------------------------------------ SHFP DEDICATED JDBC Thin Client SHFP DEDICATED JDBC Thin Client
SQL> select t.SID,t.USERNAME,t.SERVER from v$session t; SID USERNAME SERVER ---------- ------------------------------ --------- 77 DEDICATED 115 DEDICATED SID USERNAME SERVER ---------- ------------------------------ --------- 381 DEDICATED420 SYS DEDICATED 457 DEDICATED SID USERNAME SERVER ---------- ------------------------------ --------- 761 DEDICATED SID USERNAME SERVER ---------- ------------------------------ --------- 1141 DEDICATED SID USERNAME SERVER ---------- ------------------------------ --------- 1635 DEDICATED1825 SH DEDICATED 1863 SYS DEDICATED 2015 SH DEDICATED2129 SH DEDICATED 54 rows selected.