前言
今天一线同事反馈,最近在oracle11g数据库主机上执行数据库脚本,总是发现数据库账号已经被锁定了,要求协助排查。

按照以往经验,这种情况一般是频繁使用错误的账号密码登录数据库导致,下面按照这个思路去排查。
排查步骤
使用sqlplus工具登录到数据库中。
sqlplus / as sysdba
1、检查审计是否开启
show parameter audit;
结果如下:

说明:
Oracle的audit_trail参数用于控制数据库审计功能的开启和审计信息的记录方式。以下是关于audit_trail参数的详细解释:
NONE:不开启审计功能。
OS:将审计记录写入操作系统文件中。
DB:将审计信息记录在数据库表sys.aud中,而不是写入操作系统文件中。
DB,EXTENDED:执行AUDIT_TRAIL=db的所有操作,并填充SYS.AUD表的SQL绑定列和SQL text clob类型列。
XML:以XML格式写入操作系统审计记录文件。将AuditRecord节点中除Sql_Text和Sql_Bind外的所有元素记录到操作系统XML审计文件中。
XML,EXTENDED:执行AUDIT_TRAIL=xml的所有操作,并在审计记录文件中包含SQL文本和SQL绑定信息。
2、检查一段时间内的审计记录
dba_audit_session数据字典用于查看数据库的会话审计记录。通过查询DBA_AUDIT_SESSION视图,可以获取到诸如操作系统用户名(OS_USERNAME)、客户端主机名(USERHOST)、会话ID(SESSIONID)、登录时间(TIMESTAMP)、注销时间(LOGOFF_TIME)、用户名(USERNAME)、操作名称(ACTION_NAME)、对象名称(OBJ_NAME)、终端(TERMINAL)和返回代码(RETURNCODE)等信息。这些记录包括用户登录、注销以及会话期间的其他重要事件。RETURNCODE='1017’通常表示用户尝试使用无效的用户名或密码登录数据库。
检查脚本如下:
select t1.os_username||','||t1.username||','||t1.userhost||','||t1.terminal||','||to_char(t1.timestamp,'yyyy-mm-dd hh24:mi:ss')||','||t1.action_name
from dba_audit_session t1
WHERE
RETURNCODE='1017' and TIMESTAMP BETWEEN to_date('2024-09-01','yyyy-mm-dd') AND to_date('2024-09-04','yyyy-mm-dd')
ORDER BY TIMESTAMP DESC;
结果如下:


可以很清晰地看到哪台主机在什么时间,使用哪个操作系统用户,使用哪个账号登录数据库的。根据这个信息去排查相应主机上的业务代码或者主机上的脚本即可。
账号解锁
alter user account unlock;
总结
把解决过程整理出来方便大家碰到问题时查阅,希望能帮助到大家。谢谢!




