在日常运维和开发工作中,经常会遇到需要确认连接Oracle数据库的终端IP的情况,无论是排查连接超时、权限校验还是访问审计,掌握对应的查询方法都很有必要。

一、通过Oracle数据库内置视图查询
Oracle数据库本身提供了多个动态性能视图,可以直接查询当前连接的会话信息,其中包含终端IP相关数据,这种方式不需要登录终端服务器,直接在数据库内操作即可。
1. 使用V$SESSION视图查询
V$SESSION视图存储了当前所有数据库会话的信息,其中MACHINE字段记录终端主机名,PROGRAM字段记录连接程序,部分场景下IP_ADDRESS字段会直接显示终端IP,但部分版本可能不会默认填充该字段,需要结合其他方法补充。
-- 查询当前所有会话的终端信息,包含可能的IP、主机名、连接程序
SELECT
SID,
SERIAL#,
USERNAME,
MACHINE,
PROGRAM,
IP_ADDRESS
FROM
V$SESSION
WHERE
USERNAME IS NOT NULL; -- 过滤掉系统内部会话2. 结合V$SESSION和V$SQLAREA定位特定会话
如果需要查询执行某条SQL的终端IP,可以关联V$SESSION和V$SQLAREA视图,通过SQL文本内容定位对应的会话信息。
-- 查询执行特定SQL的终端信息
SELECT
S.SID,
S.SERIAL#,
S.USERNAME,
S.MACHINE,
S.IP_ADDRESS,
Q.SQL_TEXT
FROM
V$SESSION S
JOIN
V$SQLAREA Q
ON
S.SQL_ADDRESS = Q.ADDRESS
WHERE
Q.SQL_TEXT LIKE '%需要查询的SQL关键词%';二、通过操作系统命令查询
如果可以登录到运行Oracle数据库的服务端,或者可以登录到发起连接的客户端终端,也可以通过系统层面的网络命令查询连接对应的IP。
1. Linux系统下查询
Linux系统可以通过netstat或者ss命令查看当前的网络连接,Oracle默认监听端口是1521,通过过滤该端口的连接即可找到对应的终端IP。
# 使用netstat查询连接到Oracle 1521端口的终端IP netstat -antp | grep 1521 # 使用ss命令查询,效果一致 ss -antp | grep 1521
命令输出中,Foreign Address列显示的就是发起连接的终端IP和端口,PID/Program name列可以看到对应的进程信息,方便进一步定位。
2. Windows系统下查询
Windows系统下可以使用netstat命令,同样过滤Oracle监听端口即可。
REM 查询连接到Oracle 1521端口的终端IP netstat -ano | findstr 1521
输出结果中,外部地址就是终端IP,最后一列的PID可以用于在任务管理器中定位对应的进程。
三、不同场景的方法选择建议
可以根据实际权限和环境选择最合适的方法:
- 如果有数据库DBA权限,优先使用V$SESSION等视图查询,不需要登录服务器,操作更便捷
- 如果是服务端运维人员,可以直接在数据库服务器上用系统命令查询,结果更准确
- 如果需要查询历史连接IP,需要开启Oracle的审计功能,将连接信息记录到审计日志中再查询
四、注意事项
需要注意的是,部分Oracle版本的V$SESSION视图中IP_ADDRESS字段可能为空,这种情况下可以结合UTL_INADDR包,通过终端主机名反查IP,但该方法需要主机名可以被DNS解析。另外,如果是通过中间件连接Oracle,查询到的可能是中间件的IP,而非最终用户终端的IP,这种场景需要到中间件层做进一步的IP查询。
提示:查询到的IP如果是内网地址,需要结合网络拓扑确认对应的终端位置,公网地址则可以直接定位到对应的网络接入点。