上述查询返回的值是服务器进程的进程 ID。 如果客户端进程在另一个服务器上(例如,某人在连接到数据库的笔记本电脑上运行 SQL*Plus),这是获得进程 ID 的唯一方法。
现在,假设用户通过稍有改动的方式进行连接。 她不是直接在服务器上连接,而是使用了 TNS 字符串。 假设 TNS 字符串类似以下内容(在服务器 oradba 上)。 DBA102 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradba)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = DBA102)
)
)
现在,用户按照以下方式进行连接(在同一服务器 oradba 上): sqlplus arup/arup@dba102
从动态视图中检查进程 ID: SQL> select spid
2 from v$session s, v$process p
3 where s.sid = (select sid from v$mystat where rownum <2)
4 and p.addr = s.paddr
5 /
SPID
------------
6428
进程 ID 为 6428。在服务器上搜索该进程: $ ps -aef|grep sqlplus | grep -v grep
oracle 6426 6185 0 13:20 pts/0 00:00:00 sqlplus
现在,当在数据库服务器上搜索服务器进程时: $ ps -aef|grep 6426 | grep -v grep
oracle 6426 6185 0 13:20 pts/0 00:00:00 sqlplus
....您不会看到服务器进程。 用户进程 6426 没有子进程。但是,从动态性能视图,您可以知道服务器进程为 6428,那么该进程的父进程是什么? $ ps -aef|grep 6428 | grep -v grep
oracle 6428 1 0 13:20 ? 00:00:00 oracleDBA102 (LOCAL=NO)
父进程为“1”。 但是为什么不是 6426 呢?
(编辑:anna sui)
|