Oracle密码延迟验证导致的系统HANG住

问题现象:
更改密码后,每次连接异常慢,就算用正确的密码连接,验证延时也非常大,导致应用程序连接反复出现超时现象;

问题分析:
经查实,这是由于11G的延迟密码特性引起,特别在一些自动连接特性的应用来说,如果密码认证错误,会一直累积密码验证时间,导致后面的正确验证也异常超时,这种问题一般发生在修改应用账户密码后,应用服务器没有及时更新数据库连接信息导致。

解决方案:
如果需要修改应用账户密码,需要提前确定好那些应用服务器需要更改连接信息,需提前准备好相应的脚本,如应用太多,需要在更改后作出相应的监控措施,如:

检查数据库登录日志dba_audit_session,可以查出登录失败的主机和应用,通知架构负责人及时调整:

Select *
  From Dba_Audit_Session
 Where User_Name = ’mbs7_Oms’
   And Action_Name = ’logon’
   And Timestamp Between
       To_Date('2013-12-03 1:00:00', 'yyyy-mm-dd hh24:mi:ss') And
       To_Date('2013-12-03 2:10:00', 'yyyy-mm-dd hh24:mi:ss')
 Order By Sample_Time Desc

如处理不及时,导致用户被延迟认证特性阻塞,可用以下脚本在异常节点批量查杀远程连接进程的办法解决,脚本如下:

ps -ef | grep LOCAL=NO | awk '{print $2}' | xargs kill -9

这里注意的是:
查杀的同时要通知架构人员尽快清理连接缓存,另外注意查杀后,对于一些正常的连接进程要手工重新启动, 如审计库的远程连接进程等。

当然这个特性也可以设置屏蔽,通过设置EVENTS 28401可以屏蔽密码延迟验证:

SQL> ALTER SYSTEM SET EVENT =28401 TRACE NAME CONTEXT FOREVER, LEVEL 1’ SCOPE = SPFILE;

设置该事件后重启数据库即可。