暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 eygle 2019-12-19
2839

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使用情况。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论