Oracle11g账户频繁被锁定的3种解决办法

方法1:创建触发器

方法1:数据库中创建触发器(只记录失败),但是需要开发同意或者开发自己创建。找到密码输入错误的服务器,进行数据源配置的更改。

该方法适用于要求找到密码错误用户所在服务器的场景下。

CREATE OR REPLACE TRIGGER sys.logon_denied_to_alert
  AFTER servererror ON DATABASE
DECLARE
  message   VARCHAR2(168);
  ip        VARCHAR2(15);
  v_os_user VARCHAR2(80);
  v_module  VARCHAR2(50);
  v_action  VARCHAR2(50);
  v_pid     VARCHAR2(10);
  v_sid     NUMBER;
  v_program VARCHAR2(48);
  v_username VARCHAR2(32);
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_username := sys_context('userenv','authenticated_identity');
    dbms_application_info.read_module(v_module, v_action);
    message := to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') ||
               ' Password Erro: logon denied from ' || nvl(ip, 'localhost') || ' ' ||
               v_pid || ' User:' || v_os_user || ' with ' || v_program || ' – ' ||
               v_module || ' ' || v_action||' dbuser:' || v_username;
    sys.dbms_system.ksdwrt(2, message);
  END IF;
END;
/

这个触发器不写入数据库表,会在告警日志中记录

--查看数据库的告警日志
[oracle@top132] cd /u01/app/oracle/diag/rdbms/topdh/topdh/trace
[oracle@top132:/u01/app/oracle/diag/rdbms/topdh/topdh/trace]$ tail -200f alert_topdh.log
Fri Dec 01 19:48:49 2023
2023-12-01 19:48:49 Password Erro: logon denied from localhost 5944 User:oracle with sqlplus@top132 (TNS V1-V3) – sqlplus@top132 (TNS V1-V3)  dbuser:hr
Fri Dec 01 19:52:21 2023
2023-12-01 19:52:21 Password Erro: logon denied from 192.168.16.122 6273 User:Administrator with navicat.exe – navicat.exe  dbuser:SYS

参考链接:https://www.cnblogs.com/plluoye/p/10951120.html

方法2:设置密码输错次数参数

在不需要查被锁定用户的服务器的场景下可以用该方法。

Oracle profile文件设置了密码输错次数限制,超过该次数就会被锁定,更改Oracle profile文件设置了密码输错次数限制为无限制。

查询用户信息

--查询用户信息
set linesize 999
set pagesize 999
select username,account_status,lock_date,profile from dba_users;

USERNAME		       ACCOUNT_STATUS			LOCK_DATE	        PROFILE
------------------------------ -------------------------------- ------------------- ------------------------------
......
SYXK			         LOCKED			    	2024-05-08 15:39:25 DEFAULT
.......

查询状态为:LOCKED(TIMED)

查看profile文件配置信息

--查看profile文件配置信息
set linesize 999
set pagesize 999
SELECT resource_name,resource_type,limit FROM dba_profiles WHERE profile='DEFAULT'; 

RESOURCE_NAME			 RESOURCE LIMIT
-------------------------------- -------- ----------------------------------------
COMPOSITE_LIMIT 		       KERNEL   UNLIMITED
SESSIONS_PER_USER		       KERNEL   UNLIMITED
CPU_PER_SESSION 		       KERNEL   UNLIMITED
CPU_PER_CALL		        	 KERNEL   UNLIMITED
LOGICAL_READS_PER_SESSION	 KERNEL   UNLIMITED
LOGICAL_READS_PER_CALL		 KERNEL   UNLIMITED
IDLE_TIME			             KERNEL   UNLIMITED
CONNECT_TIME			         KERNEL   UNLIMITED
PRIVATE_SGA		   	         KERNEL   UNLIMITED
FAILED_LOGIN_ATTEMPTS		   PASSWORD 10
PASSWORD_LIFE_TIME		     PASSWORD UNLIMITED
PASSWORD_REUSE_TIME		     PASSWORD UNLIMITED
PASSWORD_REUSE_MAX		     PASSWORD UNLIMITED
PASSWORD_VERIFY_FUNCTION	 PASSWORD NULL
PASSWORD_LOCK_TIME		     PASSWORD 1
PASSWORD_GRACE_TIME		     PASSWORD 7

已选择16行。

修改参数FAILED_LOGIN_ATTEMPTS

--修改参数FAILED_LOGIN_ATTEMPTS
alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;

补充:也可以同时进行以下参数修改
alter profile default limit password_grace_time unlimited;
alter profile default limit password_life_time unlimited;
alter profile default limit password_lock_time unlimited;

解锁用户

alter user syxk account unlock;

修改之后不需要重启动数据库,会立即生效。

补充:参数理解

FAILED_LOGIN_ATTEMPTS

FAILED_LOGIN_ATTEMPTS (单位:次数)

  • 用户登录数据库失败次数(密码错误),是整个数据库中各个会话的总和,直到达到这个数,帐户锁定。不是针对特定会话的。
  • 只要登录成功一次,这个计数器就重置为 0 .
  • 帐户锁定后,手工解锁或自动解锁后,该计数器也会重置为 0 .

PASSWORD_LOCK_TIME

PASSWORD_LOCK_TIME (单位:天) 帐户锁定后,多少天后自动解锁。

对应的内部表: user$ (lcount)

PASSWORD_GRACE_TIME

密码到期提前7天提醒

添加profile文件并分配用户

--创建profile文件
create profile profile名字 limit FAILED_LOGIN_ATTEMPTS  10 PASSWORD_LIFE_TIME  180 PASSWORD_REUSE_TIME  UNLIMITED PASSWORD_REUSE_MAX  UNLIMITED PASSWORD_VERIFY_FUNCTION null PASSWORD_LOCK_TIME 1 PASSWORD_GRACE_TIME 30;

--新创建的profile文件分配给用户
alter user 用户名 profile profile名字;

参考链接:https://blog.csdn.net/xiezuoyong/article/details/88849226

方法3:通过告警日志排查

方法3:提供告警日志,根据账户锁定时间逐个排查日志中记录的ip。

该方法不太好用,因为有的日志中ip较多。

在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
如果Oracle数据库表被锁定,一般可以采取以下步骤进行解决。 1. 了解锁定类型 在解决问题之前,需要了解表的锁定类型。有时锁定可能是正常的,比如表正在被修改或删除等。如果确定锁定是异常的,才可以进行下一步的解决。 2. 确认锁定原因 可以使用Oracle锁定统计信息或诊断工具来确认锁定原因。诊断工具可以显示哪些会话正在使用表以及它们的锁定类型。 3. 杀死相关会话 如果锁定的原因是某些会话在占用表,可以使用Oracle的系统管理工具或SQL语句来杀死相关的会话。需要注意的是,杀死会话可能会导致数据丢失或不完整,所以要谨慎操作。 4. 检查数据库参数 有些数据库参数可能会影响表的锁定。比如,如果SGA不足,可能会导致过多的锁定,需要增加SGA大小。另外,也可以调整数据库参数来优化锁定机制。 5. 避免死锁 死锁是指多个会话彼此等待对方的资源而陷入无法解开的状态。要避免死锁,可以使用事务隔离级别,比如READ COMMITTED,SERIALIZABLE等来控制并发访问。此外,还可以按照一定的顺序获取资源,比如按照表名的字母顺序来获取锁定,以避免死锁的发生。 6. 优化SQL查询 有些查询可能会占用太多的资源,导致锁定。可以使用优化查询的方法来降低资源消耗,比如使用索引、尽量减少锁定行数等。 总之,解决Oracle数据库锁定的问题,需要综合考虑多因素,既包括技术方面的优化,也包括管理方面的规范。只有全面改进,才能达到让数据库运转更加稳定高效的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董小姐yyds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值