运维管理3 分钟阅读
Oracle 慢 SQL,怎么找到真正的客户端 IP?
2026年10月8日阅读—点赞—收藏—
OracleSQL
在知识库中专注阅读,并随时返回相关工具与课程
平时排查 Oracle 慢 SQL,一般我都是先找到 SQL_ID,再看执行计划、等待事件、逻辑读和物理读。
不过有时候,SQL 找到了,问题也基本定位了,业务却反过来问一句:
这个 SQL 到底是哪个客户端发起的?
最近正好接管一套 Oracle 11g 数据库时,就遇到了这种情况。数据库里有一条 SQL 执行比较慢,客户端程序显示为 JDBC Thin Client,但仅凭这个信息,还没办法确定是哪台应用服务器。
最后通过 Oracle 会话、数据库服务端进程和操作系统网络连接,找到了对应的客户端 IP。
记录一下过程,下次遇到可以直接照着查。
当时定位到的慢 SQL:
fq5vvra6z6rt7
先查询它当前对应的会话:
1SELECT sid,2 serial#,3 username,4 sql_id,5 status,6 event,7 machine,8 program9FROM v$session10WHERE sql_id = 'fq5vvra6z6rt7';其中一个会话的信息是:
通过这些信息,已经能够确定执行 SQL 的 Oracle 会话。
但 JDBC Thin Client 只能说明使用的是 JDBC 驱动,并不能直接告诉我们实际的客户端 IP。
Oracle 专用服务器连接模式下,可以通过 V$SESSION 和 V$PROCESS 找到会话对应的操作系统进程。
1SELECT s.sid,2 s.serial#,3 s.username,4 s.machine,5 s.program,6 p.spid7FROM v$session s8JOIN v$process p9 ON s.paddr = p.addr10WHERE s.sid = 3117;查到对应的操作系统进程号:SPID:27410。
到这里,我们就把数据库中的 SID 和 Linux 上的 PID 对应起来了。
登录数据库服务器,执行:
1ps -fp 27410结果显示:
1oracle 27410 ... oraclerepdb (LOCAL=NO)说明这是一个 Oracle 数据库服务端进程,接下来就可以通过网络连接反查客户端。
执行:
1netstat -tnp | grep 27410当时查到了两条连接:
110.245.40.113:44130 10.245.40.104:1521 ESTABLISHED 27410/oraclerepdb210.245.40.113:1521 10.245.40.123:45036 ESTABLISHED 27410/oraclerepdb这里要注意连接方向:
44130,连接远端 10.245.40.104:1521。1521,连接远端 10.245.40.123:45036。所以这次定位到的客户端 IP 是:10.245.40.123,至于 10.245.40.104:1521,它是同一个进程建立的另一条数据库网络连接,可能涉及数据库链路等操作,但仅凭这条网络记录还不能直接认定其用途。
1慢 SQL2SQL_ID = fq5vvra6z6rt73 ↓4V$SESSION5SID = 31176SERIAL# = 638517 ↓8V$PROCESS9SPID = 2741010 ↓11Linux:ps -fp 2741012确认 Oracle 服务端进程13 ↓14Linux:netstat -tnp | grep 2741015 ↓16客户端 IP:10.245.40.123这次排查没有用什么复杂工具,核心就是把三个信息关联起来:
SQL_ID → SID → SPID → 客户端 IP
V$SESSION 负责找到数据库会话,V$PROCESS 负责关联 Linux 进程,最后通过 netstat 查看该进程建立的 TCP 连接。
对于还在执行的慢 SQL,这套方法比较直接,基本几条命令就能把数据库会话和客户端连接对应起来。
不过,写到这里还有两个问题。
这两种情况在生产环境里其实也很常见,而且排查起来比今天这个案例复杂得多。
下一篇准备继续研究这个问题,从 Oracle 历史会话、监听日志、审计记录,一直查到应用连接池和网络代理,看看不同场景下到底能追溯到哪一步。
也顺便验证一下:一条已经执行结束的 Oracle 慢 SQL,究竟还能不能找到它的来源 IP?