青年数据库学习互助会

Oracle12C登录卡顿问题

昨天一个微信上的朋友找我帮忙看一个登录问题,如下是他的问题描述
Image
Image
Image
在他们沟通排除了网络问题后,开始看做进一步的问题排查
1.排查问题时段listener log和alert log
发现问题时段连接频率确实有变低,alert log中无明显报错;
2.拉取问题时段AWR报表
Image
从AWR报表一眼即可看到问题的所在:Failed Logon Delay这个异常一般都是因为有自动或者定时任务的程序使用的用户名和密码错误引起的;另外还有个一个原因就是从oracle 12C开始将密码错误尝试的参数SEC_MAX_FAILED_LOGIN_ATTEMPTS 由原来的10次调整为3次,结合用户的版本就是12.2版本,那这基本就是问题的所在了;
AWR报表是处理ORACLE异常,调优的不二利器,最近我联合几位ORACLE ACE建了一个付费微信群,并有原ORACLE优化器开发工程师特邀嘉宾,会在群中为群友免费解读疑难AWR,感兴趣的联系博主:xiaowai23z (备注:AWR)
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 !=0ORDERBYtimestampDESC;

常见 returncode的含义:

  • ORA-01017  无效的用户名或密码。
  • ORA-28000  账户被锁定。

(c) 检查账户状态

检查是否有被锁定的账户:

SELECT username, account_statusFROM dba_usersWHERE account_status LIKE'%LOCKED%';

如果发现有账户被锁定,可以手动解锁:

ALTERUSER username ACCOUNT UNLOCK;

(d) 检查登录失败的次数

查看登录失败的次数限制:

SHOWPARAMETER SEC_MAX_FAILED_LOGIN_ATTEMPTS;

修改登录失败限制(例如将其设置为 10 次)

这个是静态参数 需要重启生效

ALTERSYSTEMSET SEC_MAX_FAILED_LOGIN_ATTEMPTS =10scope=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),moduleVARCHAR2(48),  isdba      VARCHAR2(10),  errormsg   VARCHAR2(60),  logon_time DATE default SYSDATE);
---create trigger
CREATE OR REPLACE TRIGGER SYS.a_db_unsuccessful_login_trg
AFTER servererror ON DATABASE
DECLARE
    v_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_trg
    purpose: log unsuccessful LOGON action.
revisions:
    ver        DATE         author           description
    ---------  ----------  ---------------  ---------------------------------
    1.0        2023/11/01    norton.fan   create this TRIGGER.
    ************************************************************************/
BEGIN
    -- read the context
    v_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 charfor windows server.
    v_machine := REPLACE(v_machine,chr(0),'');
--fetch additional session info.
    SELECT program ,module      INTO v_program ,v_module      FROM v$sessionWHEREsid= (SELECT sid FROM v$mystat WHERErownum=1);
    IF is_servererror(1017)    THEN       v_log_error := TRUE;       v_errormsg  := 'ORA-01017: invalid username/password; logon denied';    END IF;
    IF is_servererror(20017)    THEN       v_log_error := TRUE;       v_errormsg  := 'ORA-20017: invalid access privilege; logon denied';    END IF;
    IF v_log_error    THEN       --recordthe unsuccessful logon       INSERT 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 日志等相关脚本看下文
oracle常用监控脚本(纯干货,没有EMCC,ZABBIX也不怕)
Image
   Image
优化类
一文了解Oracle数据库如何连接(2)
一文了解Oracle数据库如何连接(1)
Oracle RAC最佳实践-优化私网连接
Oracle最佳实践-优化硬解析
好好的数据库怎么突然跑不动了?
如何优化一个看似正常的数据库
查询rownum伪列引起的sql性能问题分析
一个很小的系统为什么负载那么高?
脚本类
如何一键完成20个Oracle实例运维脚本部署
分享一个比较实用的MySQL8一键巡检脚本
Oracle自动处理表空间不足脚本
分享两个ADG监控脚本
Oracle 19C一键巡检脚本分享
oracle常用监控脚本(纯干货,没有EMCC,ZABBIX也不怕)

案例类
大量的virtual circuit status等待造成系统卡顿
大量enq: SQ - contention 等待导致系统卡顿
如何优化一个看似正常的数据库
小白也能学会的Oracle优化教程-主打零基础
安装配置类
Solaris安装Oracle RAC配置手册
最好的数据库监控平台-ORACLE EMCC13.5安装配置使用文档
NBU备份oracle详细配置文档(含常见报错处理方法)
Oracle rac如何替换OCR和VOTE磁盘组
谁是DBA圈里最大的背锅侠?