通过操作系统上的 PID 和 V$PROCESS 视图中的 SPID 关联,就可以找到这个 OS 上的进程在数据库内部的化身,从而可以进行进一步的跟踪诊断,
V$SESSION 视图中记录的 PADDR 就是 V$PROCESS.ADDR 的进一步延伸,通过两者关联,可以向数据库进一步深入。
[root@d4cdb ~]# ps -ef|grep -i oracle|grep -i LOCAL=NO oracle 5613 1 0 11:26 ? 00:00:01 oracleD4C (LOCAL=NO) oracle 5813 1 0 11:30 ? 00:00:02 oracleD4C (LOCAL=NO) oracle 6036 1 0 11:34 ? 00:00:00 oracleD4C (LOCAL=NO) oracle 6038 1 0 11:34 ? 00:00:02 oracleD4C (LOCAL=NO) oracle 8648 1 0 12:17 ? 00:00:00 oracleD4C (LOCAL=NO)
LOCAL=NO 的进程显然是来自应用的远程连接
SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN ( SELECT DECODE (sql_hash_value, 0, prev_hash_value, sql_hash_value ), DECODE (sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = ‘&pid‘)) ORDER BY piece ASC;
1.首先输入一个 pid,这个 pid 即 Process id,也就是在 Top 或 ps 中看到的 PID。
2.通过 pid 和 v$process.spid 相关联我们可以获得 Process 的相关信息。
3.通过 v$process.addr 和 v$session.paddr 相关联,可以获得和 session 相关的所有信息。
4.再结合 v$sqltext,即可获得当前 session 正在执行的 SQL 语句。
可见通过 v$process 视图,我们得以把操作系统和数据库关联了起来。