一、理解操作系统的派生
-
[root@localhost ~]# ps -ef|grep sqlplus
-
oracle 14721 14691 0 03:41 pts/0 00:00:00 sqlplus as sysdba
当使用sqlplus登陆数据库后,重新开启一个secureCRT端,执行ps -ef查询;
#操作系统进程14691派生出14721
-
[root@localhost ~]# ps -ef|grep 14691
-
oracle 14691 14690 0 03:41 pts/0 00:00:00 -bash
-
oracle 14721 14691 0 03:41 pts/0 00:00:00 sqlplus as sysdba
-
root 14917 14732 0 03:58 pts/1 00:00:00 grep 14691
用户的shell环境,linxu下是bash,aix,可能是csh或ksh;
shell的进程派生给sqlplus的进程14721
-
[root@localhost ~]# ps -ef|grep 14721
-
oracle 14721 14691 0 03:41 pts/0 00:00:00 sqlplus as sysdba
-
oracle 14722 14721 0 03:41 ? 00:00:00 oracledevdb (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
-
root 14930 14732 0 03:59 pts/1 00:00:00 grep 14721
sqlplus对应进程又派生出oraect这个用户访问数据库的用户进程14722,即第二行;
二、查看oracle哪一个进程为用户进程14722提供服务
-
select
ADDR,PID,SPID,PNAME,USERNAME,TERMINAL,PROGRAM from v$process;
根据与14722匹配的行,发现ORACLE实例的服务进程是49;
可通过addr字段与v$session中的addr字段关联,获得sid;
SELECT
s.SID, p.pid, p.spid signaled, s.osuser, s.program FROM v$process p, v$session
s WHERE p.addr = s.paddr;
三、引申
上面是在服务器端以sqlplus的方式登陆;
根据客户端操作系统的pid获取对应的服务器连接信息
--查看客户端操作系统的pid,因为同一客户端开了俩个窗口分别做连接,所以下面的ps查询有俩个
-
[root@localhost ~]# ps -ef|grep sqlplus
-
oracle 127641 127572 0 01:32 pts/0 00:00:00 sqlplus
-
oracle 127646 127597 0 01:32 pts/1 00:00:00 sqlplus
-
root 129732 127699 0 02:05 pts/3 00:00:00 grep sqlplus
以其中的一个进程127646为例,
select
SID,SERIAL#,SCHEMANAME,OSUSER,PROCESS,TYPE,PADDR from v$session where
process='127646';
v$session中的process字段纪录了客户端操作系统的pid信息,可通过此列获得服务器端的sid等信息,进而可以关联v$process获得其他想要的信息。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29319055/viewspace-2073808/
,如需转载,请注明出处,否则将追究法律责任。