串連:用戶端進程和伺服器處理序之間的一條實體路徑
會話:資料庫的一個邏輯實體,由用戶端進程和伺服器處理序搭建起來,作為2個進程之間通訊的通道
一、專用伺服器串連
1.在linux上,可以在同一台機器上運行用戶端和伺服器處理序,能很清楚的看出這種父/子進程關係
SYSTEM@PROD> select a.spid dedicated_server,b.process clientpid
2 from v$process a,v$session b
3 where a.addr=b.paddr and
4 b.sid=(select sid from v$mystat where rownum=1);
DEDICATED_SE CLIENTPID
------------ ------------
4606 4557
SYSTEM@PROD> !/bin/ps -ef | grep 4557
oracle 4557 8686 0 15:25 pts/3 00:00:00 sqlplus 用戶端進程(父進程)
oracle 4606 4557 0 15:25 ? 00:00:00 oraclePROD (DESCRIPTION=(LOCAL=YES)
(ADDRESS=(PROTOCOL=beq))) 服務端進程(子進程)
即:sqlplus進程是父進程->oraclePROD是子進程,能很清楚的看出了這種父/子進程關係。誰發起誰是父進程
DESCRIPTION=(LOCAL=YES)說明用戶端進程是本地的
DESCRIPTION=(LOCAL=NO)說明用戶端進程是遠端
2.可以使用sqlplus在看看實際的串連和會話是什麼樣子。這裡使用了autotrace命令,發現有兩個會話
,我們在一條串連建立了2個會話。一條串連上的不同會話可以使用不同的使用者身份
即:一個串連上可以建立0個、1個、多個會話,每個會話都是獨立的。
一個會話可以有串連也可以沒有串連(會話會空閑)
[oracle@secdb1 ~]$ sqlplus system/oracle 使用system使用者進入sqlplus
SYSTEM@PROD> select username,sid,serial#,server,paddr,status from v$session
2 where username=USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- -------- --------
SYSTEM 110 24 DEDICATED329DB9DCACTIVE
只需開啟autotrace來查看sqlplus中所執行語句的統計結果
SYSTEM@PROD> set autotrace on statistics 開啟執行計畫中的統計資訊
SYSTEM@PROD> select username,sid,serial#,server,paddr,status from v$session
2 where username=USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- -------- --------
更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
SYSTEM 109 183 DEDICATED329DB9DCINACTIVE 監控會話
SYSTEM 110 24 DEDICATED329DB9DCACTIVE 實際會話
這個109 110會話使用了一個329DB9DC進程地址,也就是一個串連建立了2個會話
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
774 bytes sent via SQL*Net to client
381 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
SYSTEM@PROD> set autotrace off 關閉執行計畫
Sqlplus中啟用AUTOTRACE時,如果我們執行DML操作(insert update delete merge)
(1)如果還不存在“監控會話”,它會使用當前串連建立一個新會話(監控會話109)
(2)要求這個新會話查詢v$sesstat視圖來記住實際會話的初始統計值。
(3)在原會話中運行DML操作
(4)DML語句執行結束後,sqlplus會請求監控會話重新查詢v$sesstat視圖,並產生前面的所示報告,顯示出實際會話的統計結果只差。
3.現在使用sqlplus來查看一條沒有任何會話的串連,在sqlplus視窗中鍵入一條disconnect命令
SYSTEM@PROD> disconnect 關閉所有會話
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
@> show user
USER is "" 沒有登入使用者
@> select username,sid,serial#,server,paddr,status from v$session
2 where username=USER;
SP2-0640: Not connected 只是說明沒有會話了,但串連還在
註:從技術上講,這個命令應該叫distroy_all_session(破壞所有會話)更合適,而不是disconnect,因為我們並沒有真正斷開物理串連。如果想斷開物理串連,應該執行“exit”
@> exit
[oracle@secdb1 ~]$
[oracle@secdb1 ~]$ sqlplus / as sysdba 使用sys使用者來查詢system使用者的會話
SYS@PROD> select * from v$session where username='SYSTEM'; 可以看到,這個system使用者下沒有會話
no rows selected
但PADDR329DB9DC進程還存在,對應的有一條物理串連。
SYS@PROD> select username,program from v$process where addr='329DB9DC';
USERNAME PROGRAM
--------------- ------------------------------------------------
oracle oracle@secdb1 (TNS V1-V3)
4.現在使用sqlplus的connect命令建立一個新會話,但還是使用原來的PADDR329DB9DC進程串連
@> conn system/oracle
Connected.
SYSTEM@PROD>
SYSTEM@PROD> select username,sid,serial#,server,paddr,status from v$session
2 where username=USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
SYSTEM 104 31 DEDICATED329DB9DCACTIVE
可以注意到,PADDR329DB9DC還是使用原來的進程串連,但SID是新的會話ID了,可能會分配原來的SID,也可能是新的SID,這取決於在我們登出時是否有別人登入,以及我們原來的SID是否可用。
註:最常見的是一個串連對應一個會話,這也是大多數人每天所看到的情況
1)專用伺服器模式下UGA在PGA中分配空間
2)共用伺服器模式下UGA在SGA中分配空間
作者:51cto部落格 Oracle小混子