11g新特性 密碼錯誤驗證延遲特性的相關驗證

還不算暈發表於2015-12-31

2015年最後一天了,加班現場,做一個小小實驗,來完結這一年。

測試目的:

起因 是晚上看到微信群裡有人說有11.2.0.4資料庫出現一個使用者間歇性的出現登陸很慢,需要10幾秒;其它使用者都正常。對此懷疑主機名解析類問題或者是密碼錯誤後的延遲觸發特性,這些都被提問題的說是查過了,於是提議做一個trace 登陸過程,無後續; 

於是想到驗證一個使用者錯誤密碼導致延遲很大,是否影響其它使用者的登陸速度。(雖然我覺得不會影響,還是驗證一下,實驗為準哈哈)

本次主要驗證:

驗證A使用者因錯誤輸入密碼導致登陸越來越慢後,其它使用者使用正確密碼(同一會話及其它會話)命令有沒有影響。
關於此特性:
密碼錯誤驗證延遲,可以通過設定EVENT="28401 TRACE NAME CONTEXT FOREVER, LEVEL 1"遮蔽
    alter system set events='28401 trace name context forever, level 1';   ---不需要重啟

    如多個應用使用同一使用者登陸且密碼出錯,由於密碼延遲驗證的策略,導致所有後續的連線都被HANG住以及row cache lock、library cache lock問題。
本次只討論錯誤延遲的問題。

本次實驗結果彙總:
1.同一使用者,使用錯誤密碼登陸會觸發此問題;但是如果同一會話後續使用了正確的密碼的那一次登陸速度立刻恢復正常。
2.一個使用者錯誤輸入密碼後登陸延遲對其它使用者使用正確密碼時沒有影響。同一會話其它使用者的正確密碼對發生錯誤延遲的使用者沒有影響,會仍然有延遲。
3.在當前視窗執行使用錯誤密碼登陸,延遲越來越大;然後新開視窗進行正確密碼登陸,第一次時使用了3s-->此時第一個視窗也正在登陸,可能是因此原因導致新視窗正確的密碼執行時也較慢。對此進行驗證:第一個視窗錯誤登陸後延遲10秒時,不執行新命令;第二個視窗使用正確密碼登陸,可以正常進行。

一個使用者錯誤輸入密碼後登陸延遲對其它使用者沒有影響。
同一會話其它使用者的正確密碼對已經發生錯誤延遲的使用者沒有影響,會仍然有延遲。

---------------三次測試語句及結果如下:
第一次:
使用錯誤密碼的命令:
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1
--當前會話
使用當前使用者正確密碼
time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1

驗證結果如下:
同一使用者,使用錯誤密碼登陸會觸發此問題;但是如果同一會話後續使用了正確的密碼的那一次登陸速度立刻恢復正常。
time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1

real    0m0.129s
user    0m0.019s
sys     0m0.019s
省略部分輸出
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m6.080s
user    0m0.016s
sys     0m0.009s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1

real    0m0.095s
user    0m0.015s
sys     0m0.014s

----------------------------
第二次:
使用錯誤密碼的命令:
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

--------新開會話
使用當前使用者正確密碼
time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1
實驗結果:
在當前視窗執行使用錯誤密碼登陸,延遲越來越大;然後新開視窗進行正確密碼登陸,第一次時使用了3s。
此時第一個視窗也正在登陸,可能是因此原因新視窗正確的密碼執行時也較慢。
後面有實驗第一個視窗錯誤登陸後延遲10秒時,不執行新命令;第二個視窗使用正確密碼登陸,可以正常進行。
[oracle@bys1 ~]$ date
Thu Dec 31 23:14:57 CST 2015
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
real    0m0.077s
user    0m0.011s
sys     0m0.014s
省略部分輸出
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m6.092s
user    0m0.016s
sys     0m0.013s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m0.132s
user    0m0.015s
sys     0m0.006s
此時在其它視窗:
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1

real    0m3.165s
user    0m0.019s
sys     0m0.015s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys 1> /dev/null 2>&1

real    0m0.117s
user    0m0.016s
sys     0m0.006s
[oracle@bys1 ~]$ date
Thu Dec 31 23:16:09 CST 2015

---------------實驗第一個視窗錯誤登陸後延遲10秒時,不執行新命令;第二個視窗使用正確密碼登陸,可以正常進行。
[oracle@bys1 ~]$ date
Thu Dec 31 23:28:57 CST 2015
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m10.115s
user    0m0.020s
sys     0m0.017s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m10.080s
user    0m0.014s
sys     0m0.012s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
^C
real    0m0.809s
user    0m0.014s
sys     0m0.013s
[oracle@bys1 ~]$ date
Thu Dec 31 23:29:32 CST 2015

--------------------
第三次:
使用錯誤密碼的命令:
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s test/test 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s test/test 1> /dev/null 2>&1
--------同樣會話
使用其它使用者正確密碼
time echo "select sysdate from dual;" | sqlplus -s test/test 1> /dev/null 2>&1
time echo "select sysdate from dual;" | sqlplus -s test/test 1> /dev/null 2>&1


實驗結果:
一個使用者錯誤輸入密碼後登陸延遲對其它使用者沒有影響。
同一會話其它使用者的正確密碼對已經發生錯誤延遲的使用者沒有影響,會仍然有延遲。
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m5.123s
user    0m0.024s
sys     0m0.019s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m6.099s
user    0m0.022s
sys     0m0.015s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m7.067s
user    0m0.009s
sys     0m0.014s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s test/test 1> /dev/null 2>&1

real    0m0.085s
user    0m0.016s
sys     0m0.013s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s test/test 1> /dev/null 2>&1

real    0m0.071s
user    0m0.010s
sys     0m0.011s

---------------------------
其它使用者的正確密碼對發生錯誤延遲的使用者沒有影響,會仍然有延遲
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m8.106s
user    0m0.019s
sys     0m0.025s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s test/test 1> /dev/null 2>&1

real    0m0.102s
user    0m0.017s
sys     0m0.018s
[oracle@bys1 ~]$ time echo "select sysdate from dual;" | sqlplus -s bys/bys1 1> /dev/null 2>&1

real    0m9.117s
user    0m0.017s
sys     0m0.021s

相關文章