V$PROCESS视图
细心的读者朋友通过前面的阅读或许已经注意到,在日志的进程启动信息里,并没有pid=1的进程,那么这个进程是否存在呢?
通过数据库中的v$process视图,可以找到对应于操作系统的每个进程信息:
SQL> select addr,pid,spid,username,program from v$process;
ADDR PID SPID USERNAME PROGRAM
-------- ---------- ---------- -------- ----------------------------------------
5FE162AC 1 PSEUDO
5FE16860 2 6290 oracle oracle@eygle (PMON)
5FE16E14 3 6292 oracle oracle@eygle (PSP0)
5FE173C8 4 6294 oracle oracle@eygle (MMAN)
5FE1797C 5 6296 oracle oracle@eygle (DBW0)
5FE17F30 6 6298 oracle oracle@eygle (LGWR)
5FE184E4 7 6300 oracle oracle@eygle (CKPT)
.........
注意以上输出,pid=1的进程是一个PSEUDO进程,这个进程被认为是初始化数据库的进程,启动其他进程之前即被占用,并在数据库中一直存在。通过Oracle的oradebug工具可以稍微浏览一下这个进程的信息,以下是简要步骤,转储SYSTEMSTATE:
SQL> connect / as sysdba
Connected.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dump systemstate 10
Statement processed.
SQL> show parameter user_dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string /t1/orat1/diag/rdbms/t111g/T111g/trace
在user_dump_dest目录中可以找到进程转储文件,其中进程1的信息如下,供读者参考:
PROCESS 1:
----------------------------------------
SO: 0x91485a00, type: 2, owner: (nil), flag: INIT/-/-/0x00 if: 0x3 c: 0x3
proc=0x91485a00, name=process, file=ksu.h LINE:12616, pg=0
(process) Oracle pid:1, ser:0, calls cur/top: (nil)/(nil)
flags : (0x20) PSEUDO
flags2: (0x0), flags3: (0x10)
intr error: 0, call error: 0, sess error: 0, txn error 0
intr queue: empty
ksudlp FALSE at location: 0
(post info) last post received: 0 0 0
last post received-location: No post
last process to post me: none
last post sent: 0 0 0
last post sent-location: No post
last process posted by me: none
(latch info) wait_event=0 bits=0
O/S info: user: , term: , ospid: (DEAD)
OSD pid info: Unix process pid: 0, image: PSEUDO
----------------------------------------
SO: 0x6000c838, type: 5, owner: 0x91485a00, flag: INIT/-/-/0x00 if: 0x3 c: 0x3
proc=(nil), name=kss parent, file=kss2.h LINE:138, pg=0
PSO child state object changes :
Dump of memory from 0x0000000091471AA8 to 0x0000000091471CB0
091471AA0 00000000 00000000 [........]
091471AB0 00000000 00000000 00000000 00000000 [................]
Repeat 31 times
在v$process的查询输出中,SPID列代表的就是操作系统上的进程号,通过SPID可以将进程从操作系统到数据库关联起来:
[oracle@eygle bdump]$ ps -ef|grep ora_
oracle 6290 1 0 12:42 ? 00:00:00 ora_pmon_eygle
oracle 6292 1 0 12:42 ? 00:00:00 ora_psp0_eygle
oracle 6294 1 0 12:42 ? 00:00:00 ora_mman_eygle
oracle 6296 1 0 12:42 ? 00:00:00 ora_dbw0_eygle
oracle 6298 1 0 12:42 ? 00:00:00 ora_lgwr_eygle
oracle 6300 1 0 12:42 ? 00:00:00 ora_ckpt_eygle
.........
如果在操作系统上发现某个进程表现异常(如占用很高的CPU资源),那么通过操作系统上的PID和V$PROCESS视图中的SPID关联,就可以找到这个OS上的进程在数据库内部的化身,从而可以进行进一步的跟踪诊断。
V$PROCESS视图包含当前数据库中活动进程的相关信息,这些进程在操作系统上都存在与之对应的OS进程。其中LATCHWAIT列代表进程当前正在等待的LATCH信息,LATCHSPIN则记录进程正在通过SPIN进行LATCH的竞争。Latch通常被称为闩,是数据库内部的串行锁机制,主要用来控制内存上的并发,在多处理器系统上,Oracle进程通过自旋(spin)来进行Latch争夺。
这个视图结构如下所示(Oracle 10gR2版本):
SQL> desc v$process
Name Null? Type
----------------------------------------- -------- -------------
ADDR RAW(4)
PID NUMBER
SPID VARCHAR2(12)
USERNAME VARCHAR2(15)
SERIAL# NUMBER
TERMINAL VARCHAR2(30)
PROGRAM VARCHAR2(48)
TRACEID VARCHAR2(255)
BACKGROUND VARCHAR2(1)
LATCHWAIT VARCHAR2(8)
LATCHSPIN VARCHAR2(8)
PGA_USED_MEM NUMBER
PGA_ALLOC_MEM NUMBER
PGA_FREEABLE_MEM NUMBER
PGA_MAX_MEM NUMBER
注意这里的ADDR字段代表的是进程的地址,进程的状态等信息在内存中记录,这个ADDR记录的正是这样的内存地址信息。ADDR在数据库中(甚至是所有软件中)是非常重要的,虽然通常并不会用到,但是深入理解这些知识有助于大家更好的了解Oracle数据库。
进程的地址(Address of process)进一步的被缩写为PADDR,在VSESSION视图中记录的PADDR就是VPROCESS.ADDR的进一步延伸,通过两者关联,可以向数据库进一步深入。
如果向操作系统端延伸,则SPID代表的正是操作系统进程标识符(Operating system process identifier),通过SPID和OS中看到的进程PID关联,就可以建立从操作系统到数据库的关联。
所以V$PROCESS被认为是从操作系统到数据库的入口。此外,和PGA相关的几个字段则记录了进程的PGA使用情况。




