Oracle 12c中Failed Logon Delay等待事件处理方法。
问题现状
数据库版本为Oracle 12.2.0.1.0。
在等待事件中,看到failed logon delay平均等待1000ms。
管理连接总耗时14491秒
问题分析
根据MOS文档:Failed Logon Delay Causing Performance Hit (Doc ID 2246758.1)所述,可能是由引入的自动过程引起的,该过程使用错误的密码尝试登录到数据库服务器。原因是延迟登录失败的安全功能。这由sec_max_failed_login_attempts和sec_protocol_error_further_Action控制。在 11g 中,sec_max_failed_login_attempts是 10,在 12c 中是 3。这意味着这种延迟可能会在 12c 中出现更多。sec_protocol_error_further_Action参数的默认值从 11g 中的 CONTINUE 更改为 12c 中的 (DROP, 3)。如果使用值 CONTINUE(以在升级后保留 11g 设置),则由于 sec_max_failed_login_attempts 的值减少,可能会看到此等待。
解决方法
1、通过sys.aud$找到错误密码的主机或应用程序,修改成正确的密码。
或
2、使用trigger,使用trigger可能会对数据库性能造成影响,可在找到问题原因后删除trigger,以下trigger内容引用自墨天轮文档:https://www.modb.pro/db/20928
CREATE OR REPLACE TRIGGER logon_denied_to_alert
AFTER servererror ON DATABASE
DECLARE
-- author: anbob.com
-- purpose: print logon fail to db alert due to passwd wrong
message VARCHAR2(168);
ip VARCHAR2(15);
v_os_user VARCHAR2(80);
v_db_user varchar2(50);
v_module VARCHAR2(50);
v_action VARCHAR2(50);
v_pid VARCHAR2(10);
v_sid NUMBER;
v_program VARCHAR2(48);
BEGIN
IF (ora_is_servererror(1017)) THEN
-- get ip FOR remote connections :
IF upper(sys_context('userenv', 'network_protocol')) = 'TCP' THEN
ip := sys_context('userenv', 'ip_address');
END IF;
SELECT sid INTO v_sid FROM sys.v_$mystat WHERE rownum < 2;
SELECT p.spid, v.program
INTO v_pid, v_program
FROM v$process p, v$session v
WHERE p.addr = v.paddr
AND v.sid = v_sid;
v_os_user := sys_context('userenv', 'os_user');
v_db_user := sys_context('userenv', 'SESSION_USER');
dbms_application_info.read_module(v_module, v_action);
message := to_char(SYSDATE, 'YYYYMMDD HH24MISS') ||
' logon denied from ' || nvl(ip, 'localhost') || ' OSPid:' ||
v_pid || ' OS User:' || v_os_user || ' DB User:' || v_db_user ||' with ' || v_program || ' – ' ||
v_module || ' ' || v_action;
sys.dbms_system.ksdwrt(2, message);
END IF;
END;
/
或
3、设置隐含参数_sys_logon_delay=0 关闭该特性
参照MOS文档:How to Troubleshoot Slow Login / Login Hang issues with Database User Authentication? (Doc ID 2724913.1),在11g中event 28401 禁用密码延迟认证的特性可以解决这个问题,在19C中event 28401并不能解决这个问题是由隐含参数“_sys_logon_delay”控制。
alter system set “_sys_logon_delay”=0 scope=spfile;
该参数为静态参数,需要申请停机时间重启数据库生效。