oracle不记录锁定动作本身,只记录触发锁定的失败登录行为,需通过dba_users确认lock_date后,结合listener.log或aud$中ora-1017错误反推可疑ip;若启用审计,查aud$表更可靠;长期排查建议建触发器捕获失败登录。

直接查不到“哪个IP锁了用户”,Oracle不记录锁定动作本身,只记录触发锁定的失败登录行为。必须从失败登录源头反推。
查 dba_users 确认锁定状态和时间点
先确认用户确实被锁,且拿到精确的 lock_date ——这是后续日志比对的关键锚点。
- 执行
SELECT username, account_status, lock_date FROM dba_users WHERE username = 'YOUR_USER';,注意account_status应为LOCKED(TIMED)或类似值 - 若
lock_date为空,说明未被锁;若非空,记下该时间(建议先运行ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy-mm-dd hh24:mi:ss';) -
lock_date是最后一次失败登录触发锁定的时间,不是第一次失败的时间,所以日志要往前查几分钟
优先查 listener.log 定位可疑 IP
监听日志是最快、最轻量的入口,尤其当数据库没开审计时,它几乎是唯一可用线索。
- 路径通常为
$ORACLE_HOME/network/admin/log/listener.log或$ORACLE_BASE/diag/tnslsnr/$HOSTNAME/listener/trace/listener.log - 用
grep或tail -n 500 listener.log | grep -i "your_user\|ORA-1017\|establish"快速过滤 - 重点找含
(ADDRESS=(PROTOCOL=tcp)(HOST=xxx.xxx.xxx.xxx)(PORT=...))的行,HOST值就是客户端 IP(IPv4 或 IPv6) - 注意:日志里没有用户名字段,需结合
lock_date时间窗口 + 高频连接行为(如连续多行同一 IP 在几秒内重复出现)来交叉判断
如果开了审计,查 aud$ 表或 dba_audit_session
审计记录更可靠,但前提是已启用且配置正确。默认关闭,需 DBA 主动开启。
- 检查是否启用:
SHOW PARAMETER audit_trail,值为DB或DB_EXTENDED才有效 - 查失败登录:
SELECT userhost, terminal, spare1, comment$text FROM aud$ WHERE returncode = 1017 AND userid = (SELECT user_id FROM all_users WHERE username = 'YOUR_USER') ORDER BY ntimestamp# DESC; -
comment$text字段常含完整客户端地址,例如Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=10.113.27.15)(PORT=66453)) - 若审计日志写 OS 文件(
audit_trail=OS),则去$ORACLE_BASE/admin/$ORACLE_SID/adump/下用grep 1017 *.aud
长期排查建议:建触发器捕获失败登录
临时查一次靠日志,反复被锁就得上持久化方案。触发器能实时抓取 IP_ADDRESS 和用户名,不依赖审计开关。
- 创建表:
CREATE TABLE login_failures (username VARCHAR2(30), ip_address VARCHAR2(45), login_time TIMESTAMP, return_code NUMBER); - 创建触发器:
CREATE OR REPLACE TRIGGER log_login_failures AFTER SERVERERROR ON DATABASE BEGIN IF IS_SERVERERROR(1017) THEN INSERT INTO login_failures VALUES (SYS_CONTEXT('USERENV', 'SESSION_USER'), SYS_CONTEXT('USERENV', 'IP_ADDRESS'), SYSTIMESTAMP, SQLCODE); END IF; END; - 注意:
SYS_CONTEXT('USERENV', 'IP_ADDRESS')在 JDBC 连接下可能为空,此时需配合CLIENT_IDENTIFIER或应用层传参补全 - 触发器生效后,
SELECT * FROM login_failures WHERE username = 'YOUR_USER' ORDER BY login_time DESC;即可直接看到来源 IP
真正难的不是查 IP,而是区分“人肉试密码”和“程序死循环重连”。同一个 IP 可能来自代理、负载均衡或容器网络,HOST 字段在 listener.log 中有时显示的是中间节点而非终端设备。务必结合应用部署架构交叉验证。











