跟踪后台服务器进程,例如 PMON 或者 LREG
- 查找将被跟踪的服务器进程的进程 ID (PID),对于 Windows 查找线程 ID。
识别 PMON 或者 LREG 后台服务器进程。
(用于跟踪实例注册。)
Oracle 11.x
$ ps -ef |grep pmon oracle 26601 1 0 16:45 ? 00:00:00 ora_pmon_N11203
Oracle 12.x
$ ps -ef |grep lreg oracle 30396 1 0 09:12 ? 00:00:00 ora_lreg_N12101
注意:虽然实例注册的侦听器交互通常与 PMON 进程相关联,但在 Oracle 12 中,实例注册职责由后台进程 LREG 执行。
服务器版本为 Oracle 12 时使用“ps -ef | grep lreg”。
- 以 sysdba 身份连接并使用 oradebug 设置在上述步骤中标识的目标服务器进程的 PID(或者 Windows 线程 ID)。
$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 30 14:55:38 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> oradebug setospid 26601 Oracle pid: 25, Unix process pid: 26601, image: oracle@bde-idm8.us.oracle.com (TNS V1-V3) SQL>
- 一旦在 oradebug 跟踪中设置了 PID 或者线程 ID,就可以动态启用和禁用。
执行命令时,跟踪级别的更改立即生效。
跟踪级别也可以根据需要更改为不同的值。
注意:oradebug 转储语法随版本而变化。
对于 Oracle 11.2.0.4 及更高版本使用“dump sqlnet_server_trace”,对于 Oracle 11.2.0.3 及更低版本使用“dump event_tsm_test”。
Function | 11.1.0.7, 11.2.0.2, 11.2.0.3 | 11.2.0.4, 12.1.0.x |
---|---|---|
Enable tracing | oradebug dump event_tsm_test 16 | oradebug dump sqlnet_server_trace 16 |
Alter the trace level | oradebug dump event_tsm_test [n]* | oradebug dump sqlnet_server_trace [n]* |
Disable Tracing | oradebug dump event_tsm_test 0 | oradebug dump sqlnet_server_trace 0 |
其中: [n] 是新的跟踪级别。
除非在 sqlnet.ora 中指定了备用位置,否则跟踪输出将定向到标准 ADR 跟踪存储库。
要将输出重定向到特定位置,请在服务器 sqlnet.ora 中使用以下语法:
SQLNET.ORA ---------- TRACE_DIRECTORY_SERVER = /TMP DIAG_ADR_ENABLED = OFF
要重定向后台进程的跟踪输出位置,上述设置必须在实例启动之前在 sqlnet.ora 中。
要在启用 ADR 时定位跟踪文件,请使用:'oradebug tracefile_name'。
SQL> oradebug tracefile_name /home/mseibt/app/oracle/diag/rdbms/n11203/N11203/trace/N11204_ora_11390.trc
动态追踪 和 静态追踪
Oracle Net 跟踪由 sqlnet.ora 参数控制,这些参数在 RDBMS 服务器进程的生命周期内是静态的。
由于实例只有一个 sqlnet.ora 文件,因此跟踪设置适用于所有服务器进程。
这可能会给实时生产环境带来困难。
动态服务器跟踪允许在每个进程级别进行跟踪,并且可以在任何正在运行的服务器进程上临时启用。
这对于跟踪特定客户端连接的单个服务器端进程或者跟踪后台服务器进程非常有用。
识别服务器进程
1. 客户端/服务器连接:
使用特权帐户(例如 sysdba)来标识连接的客户端的关联服务器端进程(客户端用户名必须是唯一的)。
当共享服务器正在使用时,此方法还将识别关联的调度程序进程。
SQL> select s.username, p.spid from v$session s, v$process p where p.addr = s.paddr and s.username like 'MIKE' / USERNAME SPID ------------------------------ ----------------------- MIKE 16317
2. 客户端/调度程序连接(共享服务器):
在共享服务器环境中,Oracle Net 跟踪应以调度程序进程为目标。
使用特权帐户(例如 sysdba)来标识连接的客户端的关联调度程序进程(客户端用户名必须是唯一的)。
请注意,在调度程序上调用的服务器跟踪将跟踪使用该调度程序的所有客户端。
SQL> select s.username, d.name from v$dispatcher d, v$session s, v$circuit c where c.dispatcher = d.paddr and c.saddr = s.saddr and s.username like 'MIKE' / USERNAME NAME ------------------------------ --- MIKE D004
然后使用调度员 id 为调度员 pid grep。
$ ps -ef |grep d004 oracle 2841 1 0 11:14 ? 00:00:00 ora_d004_N11204
3.其他方法(高级):
在某些情况下,可能需要上述查询的替代方法来标识客户端的关联服务器进程。
一个角度是使用 netstat、lsof 或者 pfiles 等系统工具来识别客户端和服务器对使用的网络端口,然后将它们匹配回服务器 PID。
可用的系统工具因平台而异,因此仅提供一个示例,但大多数平台的总体概念相似,匹配客户端和服务器端口。
可以使用的命令:
Linux:
# lsof -n -P -i :[port] (gets a PID using a known port) # lsof -p [PID] | grep TCP (gets a port using a known PID)
Solaris:
# pfiles -F [PID] | grep sockname (gets a port using a known PID)
示例
获取与 Linux 上数据库的 Solaris 客户端连接的关联服务器 PID。
客户端用户名是“scott”。
- 在 Solaris 系统上为用户 scott 识别客户端的 sqlplus PID。
$ ps -ef |grep sqlplus mseibt 25856 25828 0 11:31:48 pts/2 0:01 sqlplus mike@n11203 mseibt 25872 25862 0 11:33:35 pts/4 0:00 sqlplus scott@n11203
- 使用 scott 连接的 PID (25872),“pfiles”实用程序将提供客户端端口 (34948)。
$ pfiles -F 25872 | grep sockname sockname: AF_INET 10.141.155.182 port: 34948 sockname: AF_INET 0.0.0.0 port: 0
- 在 Linux 服务器上,使用“lsof”查找客户端端口 (34948),然后显示服务器进程 PID (3557)。
$ lsof -n -P -i :34948 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME oracle 3557 mseibt 12u IPv6 1378536 TCP 10.141.157.33:1581->10.141.155.182:34948