關於oracle session的簡單測試(r2筆記95天)
平時檢視v$session的時候要定位一個session,需要sid,serial#這個兩個值,其實更多時候我們關注更多的是sid,對於serial#卻不太瞭解。
至少從v$mystat中,可以看到,是隻能定位到sid的,對於serial#的值還需要藉助v$session來查詢。
SQL> desc v$mystat
Name Null? Type
----------------------------------------- -------- ----------------------------
SID NUMBER
STATISTIC# NUMBER
VALUE NUMBER
-rw-r--r-- 1 ora11g dba 57151 Sep 15 08:11 check.log
-rw-r--r-- 1 ora11g dba 183 Sep 15 07:52 check.sh
-rw-r--r-- 1 ora11g dba 45 Sep 15 07:53 loop.sh
-rw-r--r-- 1 ora11g dba 2 Sep 15 08:05 sleep_time.par
[ora11g@rac1 chk_session]$
while true
do
ksh check.sh >> check.log
done
check.sh的內容也很簡單,就是每次使用sqlplus來建立一個session。然後sleep一定的時間。
sleep_time=`cat sleep_time.par`
sqlplus -s n1/n1 <<EOF
select sid,serial# from v$session where sid=(select sid from v$mystat where rownum<2);
EOF
echo $sleep_time
sleep $sleep_time
[ora11g@rac1 chk_session]$ cat sleep_time.par
3
有了如上的準備工作,來看看輸出的check.log的內容吧。可以看到在1秒的間隔時間下,重新建立的session的sid不會發生變化,而serial#會按照2的間隔遞增。
SID SERIAL#
---------- ----------
257 93
1
SID SERIAL#
---------- ----------
257 95
1
SID SERIAL#
---------- ----------
257 97
動態調整間隔時間為3秒,發現沒有任何的改變。
SID SERIAL#
---------- ----------
257 137
3
SID SERIAL#
---------- ----------
257 139
3
SID SERIAL#
---------- ----------
257 141
在我重新調整了時間,從3秒調整到10秒,還是沒有改變,然後調整為30秒的時候。發現sid發生了變化,而且serial#不是從1開始遞增。
10
SID SERIAL#
---------- ----------
257 167
10
SID SERIAL#
---------- ----------
257 169
30
SID SERIAL#
---------- ----------
258 515
30
SID SERIAL#
---------- ----------
258 517
然後sid開始固定,serial#開始遞增
SID SERIAL#
---------- ----------
258 565
30
SID SERIAL#
---------- ----------
21 31
30
我在想不是serial#有個臨界值之類的。
於是把間隔時間調整為0秒。
結果serial#遞增到1500多還是沒有任何反應。然後由0秒調整為3秒後的變化如下:
SID SERIAL#
---------- ----------
21 1603
0
SID SERIAL#
---------- ----------
21 1605
3
SID SERIAL#
---------- ----------
21 1607
3
SID SERIAL#
---------- ----------
21 1609
3
SID SERIAL#
---------- ----------
21 1611
3
SID SERIAL#
---------- ----------
253 135
SID SERIAL#
---------- ----------
253 175
3
SID SERIAL#
---------- ----------
257 175
如果觀察足夠仔細,就會發現最後的sid為257的session在最開始的時候已經用過,只是serial#部分不同,新建的session 257,175和之前的部分也沒有衝突,是從上一次中斷的那個serial#值開始的。
林林總總做了一圈測試,發現session的sid,serial#有如下的基本規律。
serial#按照2的頻度進行遞增。
serial#的分配由資料庫自動控制,有點類似連線池的味道,下次某個session在sid相同的情況下,serial#會從上一次的值開始繼續遞增。
sid的變化在一定的時間範圍內沒有明顯的規律。