2015年最后一天了,加班现场,做一个小小实验,来完结这一年。
测试目的:
起因 是晚上看到微信群里有人说有11.2.0.4数据库出现一个用户间歇性的出现登陆很慢,需要10几秒;其它用户都正常。对此怀疑主机名解析类问题或者是密码错误后的延迟触发特性,这些都被提问题的说是查过了,于是提议做一个trace 登陆过程,无后续;
于是想到验证一个用户错误密码导致延迟很大,是否影响其它用户的登陆速度。(虽然我觉得不会影响,还是验证一下,实验为准哈哈)
本次主要验证:
关于此特性:
密码错误验证延迟,可以通过设置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问题。
本次只讨论错误延迟的问题。
使用错误密码的命令:
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
[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