Oracle数据库的启动——V$PROCESS视图

网友投稿 870 2022-10-30

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Oracle数据库的启动——V$PROCESS视图

V$PROCESS视图

细心的读者朋友通过前面的阅读或许已经注意到,在日志的进程启动信息里,并没有pid=1的进程,那么这个进程是否存在呢?

通过数据库中的v$process视图,可以找到对应于操作系统的每个进程信息:

SQL> select addr,pid,spid,username,program from v$process;ADDR PID SPID USERNAME PROGRAM-------- ---------- ---------- -------- ----------------------------------------5FE162AC 1 PSEUDO5FE16860 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 sysdbaConnected.SQL> oradebug setmypidStatement processed.SQL> oradebug dump systemstate 10Statement processed.SQL> show parameter user_dumpNAME 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 0x0000000091471CB0091471AA0 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_eygleoracle 6292 1 0 12:42 ? 00:00:00 ora_psp0_eygleoracle 6294 1 0 12:42 ? 00:00:00 ora_mman_eygleoracle 6296 1 0 12:42 ? 00:00:00 ora_dbw0_eygleoracle 6298 1 0 12:42 ? 00:00:00 ora_lgwr_eygleoracle 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使用情况。

上一篇:为什么大家选择参加html5培训?
下一篇:软件测试步骤及应对非正常状况的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~