昨天一个微信上的朋友找我帮忙看一个登录问题,如下是他的问题描述



在他们沟通排除了网络问题后,开始看做进一步的问题排查
1.排查问题时段listener log和alert log
发现问题时段连接频率确实有变低,alert log中无明显报错;
2.拉取问题时段AWR报表

从AWR报表一眼即可看到问题的所在:Failed Logon Delay这个异常一般都是因为有自动或者定时任务的程序使用的用户名和密码错误引起的;另外还有个一个原因就是从oracle 12C开始将密码错误尝试的参数SEC_MAX_FAILED_LOGIN_ATTEMPTS 由原来的10次调整为3次,结合用户的版本就是12.2版本,那这基本就是问题的所在了;
3. 检查和解决步骤
(a) 检查 Failed Logon Delay 的等待事件
登录到数据库并检查等待事件:
SELECT event, total_waits, time_waited, average_waitFROM v$session_eventWHERE event = 'Failed Logon Delay';(b) 检查失败登录记录
通过动态性能视图 dba_audit_session 查看登录失败的详细信息:
SELECT username, os_username, userhost, timestamp, returncodeFROM dba_audit_sessionWHERE returncode != 0ORDER BY timestamp DESC;
常见 returncode的含义:
ORA-01017 无效的用户名或密码。ORA-28000 账户被锁定。
(c) 检查账户状态
检查是否有被锁定的账户:
SELECT username, account_statusFROM dba_usersWHERE account_status LIKE '%LOCKED%';如果发现有账户被锁定,可以手动解锁:
ALTER USER username ACCOUNT UNLOCK;(d) 检查登录失败的次数
查看登录失败的次数限制:
SHOW PARAMETER SEC_MAX_FAILED_LOGIN_ATTEMPTS;修改登录失败限制(例如将其设置为 10 次)
这个是静态参数 需要重启生效
ALTER SYSTEM SET SEC_MAX_FAILED_LOGIN_ATTEMPTS = 10 scope=spfile;(e)创建fail logon trigger追踪密码错误用户
-- Create tablecreate table SYS.A_DB_UNSUCCESSFUL_LOGINS(username VARCHAR2(30),osuser VARCHAR2(30),machine VARCHAR2(64),terminal VARCHAR2(30),ipaddr VARCHAR2(30),program VARCHAR2(48),module VARCHAR2(48),isdba VARCHAR2(10),errormsg VARCHAR2(60),logon_time DATE default SYSDATE);---create triggerCREATE OR REPLACE TRIGGER SYS.a_db_unsuccessful_login_trgAFTER servererror ON DATABASEDECLAREv_ipaddr a_db_unsuccessful_logins.ipaddr%TYPE;v_logon_user a_db_unsuccessful_logins.username%TYPE;v_machine a_db_unsuccessful_logins.machine%TYPE;v_terminal a_db_unsuccessful_logins.terminal%TYPE;v_osuser a_db_unsuccessful_logins.osuser%TYPE;v_program a_db_unsuccessful_logins.program%TYPE;v_module a_db_unsuccessful_logins.module%TYPE;v_errormsg a_db_unsuccessful_logins.errormsg%TYPE;v_isdba a_db_unsuccessful_logins.isdba%TYPE;v_log_error BOOLEAN DEFAULT FALSE;/************************************************************************name: a_db_unsuccessful_login_trgpurpose: log unsuccessful LOGON action.revisions:ver DATE author description--------- ---------- --------------- ---------------------------------1.0 2023/11/01 norton.fan create this TRIGGER.************************************************************************/BEGIN-- read the contextv_osuser := sys_context('USERENV','OS_USER');v_machine := sys_context('USERENV','HOST');v_terminal := sys_context('USERENV','TERMINAL');v_ipaddr := sys_context('USERENV','IP_ADDRESS');v_logon_user := sys_context('USERENV','SESSION_USER');v_isdba := sys_context('USERENV','ISDBA');--cut strange char for windows server.v_machine := REPLACE(v_machine,chr(0),'');--fetch additional session info.SELECT program ,moduleINTO v_program ,v_moduleFROM v$sessionWHERE sid = (SELECT sid FROM v$mystat WHERE rownum = 1);IF is_servererror(1017)THENv_log_error := TRUE;v_errormsg := 'ORA-01017: invalid username/password; logon denied';END IF;IF is_servererror(20017)THENv_log_error := TRUE;v_errormsg := 'ORA-20017: invalid access privilege; logon denied';END IF;IF v_log_errorTHEN--record the unsuccessful logonINSERT INTO sys.a_db_unsuccessful_logins(username,osuser,machine,terminal,ipaddr,program,module,isdba,errormsg,logon_time)VALUES(v_logon_user,v_osuser,v_machine,v_terminal,v_ipaddr,v_program,v_module,v_isdba,v_errormsg,SYSDATE);END IF;END a_db_unsuccessful_login_trg;/
trigger建立后里面就追踪到使用错误密码的设备用户和机台IP,找到错误密码的源头即可解决此登录卡顿问题。更多一些监控脚本 如登陆成功,登陆失败,控制IP访问,DDL 日志等相关脚本看下文
https://www.modb.pro/db/1770699616693096448

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




