您还可以从动态视图中找到关于该服务器进程的信息。 select spid
from v$session s, v$process p
where s.sid = (select sid from v$mystat where rownum <2)
and p.addr = s.paddr;
上述查询返回的值是服务器进程的进程 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 呢?
要理解该答案,需要了解不同的 Oracle 服务器进程的创建方式。 在第一种情况下,当用户未使用 TNS 连接字符串时,连接被直接路由到数据库,而不是首先经过监听程序。 数据库创建了一个用户进程,然后将该进程(称为 bequeathing)的控制权传递给进程所有者,以下使用术语 bequeath 进程,这显示在进程名称中。
第二种情况下,当用户仍然在同一服务器上但通过监听程序连接时,监听程序创建了称为 forking 的用户进程。 同样,如果用户进程在另一台计算机(例如笔记本电脑)上运行,连接需要通过监听程序,监听程序可能已经创建了该进程。 该进程是由远程服务器创建的,因此进程名称包含子句 LOCAL=NO。 即使 SQL*Plus 会话在同一服务器上运行,但它是一个非 bequeath 连接的事实使其成为非 LOCAL 连接。
(请注意: 根据 OS 的不同,您不能象在 bequeath 连接中查看 SQL*Plus 会话那样查看服务器进程的父 ID。 在某些情况下,即使连接为 bequeath,父 ID 仍将显示为“1”。 因此,不要依赖父 ID 来决定服务器进程的类型;请通过进程名称来决定。
既然您理解了双任务模型;让我们来看一下您是否抓住了整个讨论的重点。 服务器进程由数据库创建并运行,而不是启动了 SQL*Plus 等客户端进程的用户。 服务器进程使用可执行文件“oracle”或“oracle.exe”,因此仅名为“orasoft”(这样命名是为了避免与可执行文件的名称“oracle”这个术语冲突)的 Oracle 软件所有者应该有权执行它们,其他任何人都不可以。 那么,您为什么需要其他用户的权限呢?
(编辑:aniston)
|