[Oracle]セッションIDとOS上のプロセスIDを紐づける方法

Oracle

障害などの調査のために、Oracleデータベース上の特定のセッションが、OSのプロセスとしてどのような状態にあるかを確認したい場合があります。

Oracleデータベースのv$sessionで出力される情報はセッションID(SID)をベースとしてますので、各プロセスのCPU使用率を追いたい場合には、SIDとOS上のプロセスID(OSPID)を紐づける必要があります。

SIDとOSPIDを紐づける

以下のSQLによって、SIDとOSPIDを紐づけることができます。
v$procesのSPID列がOSPIDに相当しますので、v$sessionとv$processを結合することで確認します。

SQL> set lines 200 pages 300
SQL> col SPID format a10
SQL> col USERNAME format a10
SQL> col OSUSER format a10
SQL> col PROGRAM format a50

SQL> select sid, pid, spid, s.username, osuser, s.program 
     from v$process p, v$session s 
     where p.addr=s.paddr;
りお
りお

set linesやcolなどの出力フォーマットはお好みで。

実行結果例はこちらです。

 SID PID SPID  USERNAME OSUSER   PROGRAM
---- --- ----- -------- -------- -------------------------------
   2   2 5537           ora11204 oracle@ol66.local (PMON) ★
   3   3 5539           ora11204 oracle@ol66.local (PSP0)
   4   4 5541           ora11204 oracle@ol66.local (VKTM)
   5   5 5545           ora11204 oracle@ol66.local (GEN0)
   6   6 5547           ora11204 oracle@ol66.local (DIAG)
   :

例えば、PID=2のサーバプロセス(PMONプロセス)に対して、SPIDの取得結果が正しいことを、OS上のpsコマンドで確認してみます。

$ ps -ef | grep 5537 | grep -v grep
ora11204  5537     1  0 00:01 ?        00:00:05 ora_pmon_orcl

SPID=5537のサーバプロセスは、OSから見たpid=5537のプロセスに該当することが分かります。

セッションIDの確認

現在接続しているセッションのSIDを確認した場合は、v$mystatを検索して確認可能です。
こちらの結果からセッションSID=50であることが分かります。

SQL> select distinct sid from v$mystat;

       SID
----------
        50

少しSQLを書き換えることで、接続しているセッションのOSPIDを確認することができます。

SQL> set lines 200 pages 300
SQL> col SPID format a10
SQL> col USERNAME format a10
SQL> col OSUSER format a10
SQL> col PROGRAM format a50

SQL> select sid, pid, spid, s.username, osuser, s.program 
     from v$process p, v$session s 
     where p.addr=s.paddr and s.sid = (select distinct sid from v$mystat);

       SID        PID SPID       USERNAME   OSUSER     PROGRAM
---------- ---------- ---------- ---------- ---------- --------------------------------------------------
        69         73 91635      SYS        oracle     sqlplus@host01 (TNS V1-V3)

セッションを特定したい場合

特定のサーバプロセスのセッションを特定したい場合は、v$sessionのUSERNAME列(Oracleユーザー名)や、PROGRAM列(プログラム名)をWHERE条件に指定して絞り込みます。

例えば、SYSユーザで接続しているセッションに絞り込む場合はこのようになります。

SQL> select sid, pid, spid, s.username, osuser, s.program 
     from v$process p, v$session s 
     where p.addr=s.paddr and s.username = 'SYS';

       SID        PID SPID       USERNAME   OSUSER     PROGRAM
---------- ---------- ---------- ---------- ---------- --------------------------------------------------
       846         13 113682     SYS        oracle     oracle@ol66.local (OFSD)
       206        195 23612      SYS        oracle     sqlplus@ol66.local (TNS V1-V3)

systemstateからの確認

取得する機会は少ないかもしれませんが、systemstate(情報取得した時点での全てのセッション情報)を取得することでもSIDとOSPIDを紐づけることができます。
ただし、各セッションの情報は順次取得されていきますので、情報取得した時点から取得が完了するまでにタイムラグがあり、必ず同じ断面を取得できるとは限りませんのでご注意ください。
特にハング系やスピン系の障害発生時の解析情報として非常に役に立ちます。

systemstateの取得方法は以下になります。

SQL> alter session set events 'immediate trace name systemstate level 266';

トレースファイルが取得されるのでその内容を見てみます。

  :
PROCESS 2: PMON
  ----------------------------------------
  SO: 0x784a6868, type: 2, owner: (nil), flag: INIT/-/-/0x00 if: 0x3 c: 0x3
   proc=0x784a6868, name=process, file=ksu.h LINE:12721, pg=0
  (process) Oracle pid:2, ser:1, calls cur/top: 0x780c5818/0x780c5818
            flags : (0xe) SYSTEM
            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 281
              last post received-location: kmmcts.h LINE:2898 ID:kmmreg()
              last process to post me: 0x784b84a0 53 2
              last post sent: 0 0 26
              last post sent-location: ksa2.h LINE:285 ID:ksasnd
              last process posted by me: 0x784a7920 1 6
    (latch info) wait_event=0 bits=0x0
    Process Group: DEFAULT, pseudo proc: 0x7854deb0
    O/S info: user: ora11204, term: UNKNOWN, ospid: 5537 <--★ OSPID=5537
    OSD pid info: Unix process pid: 5537, image: oracle@ol66.local (PMON)
  :
    SO: 0x78080600, type: 4, owner: 0x784a6868, flag: INIT/-/-/0x00 if: 0x3 c: 0x3
     proc=0x784a6868, name=session, file=ksu.h LINE:12729, pg=0
    (session) sid: 2 ser: 1 trans: (nil), creator: 0x784a6868 <--★ SID=2
              flags: (0x51) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
              flags2: (0x409) -/-/INC
              DID: 0002-, short-term DID:
              txn branch: (nil)
              edition#: 0              oct: 0, prv: 0, sql: (nil), psql: (nil), user: 0/SYS
    ksuxds FALSE at location: 0
    service name: SYS$BACKGROUND
  :

「ospid: 5537」と出力されている部分が、OS上で確認できるPIDに相当します。
この内容からもセッションIDとOSPIDを紐づけることができます。

プログラミングスクールをまとめました。
Pythonなどのプログラミングを学ぶことで実現できることの幅が広がりますので、
参考にしていただければと思います。

コメント

タイトルとURLをコピーしました