Oracle12C登录卡顿问题

来源:这里教程网 时间:2026-03-03 21:07:28 作者:

 

 

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

编辑

编辑

在他们沟通排除了网络问题后,开始看做进一步的问题排查

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 table
    create 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 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 char for windows server.
        v_machine := REPLACE(v_machine,chr(0),'');
    --fetch additional session info.
        SELECT program ,module
          INTO v_program ,v_module
          FROM v$session
         WHERE sid = (SELECT sid FROM v$mystat WHERE rownum = 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
           --record the 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 日志等相关脚本看下文 https://www.modb.pro/db/1770699616693096448

      

  • 相关推荐