Oracle11g Oracleセッション一覧表示 + 各サーバからの接続セッション数表示スクリプト

はじめに
===

Linuxサーバ上に構築したOracle 11gサーバ(11.1.0.7.2)において、Oracleデータベースに接続している各セッションの一覧、Oracleに接続している各接続元サーバ(以下:接続元サーバと表記します)のセッション数を表示するスクリプトです。

ざっくりとしたイメージで言うと、MySQLの「SHOW PROCESSLIST」コマンドのようなものになります。

Oracleデータベースに接続中のセッション一覧やセッション数について、手軽に確認したい時に利用しております。

スクリプトを実行している環境
===

・Oracle 11g (11.1.0.7.2)

Oracleセッション一覧と接続元サーバごとのセッション数表示スクリプト
===

Oracle 11gサーバの任意のディレクトリに、以下のようなスクリプトを作成します。

```
[oracle@example-oracle-11g-active ~]$ vi show_oracle_session_list.sh
```

```shell-session:show_oracle_session_list.sh
#!/bin/sh

export NLS_DATE_FORMAT="YYYY/MM/DD HH24:MI:SS"

SQL_TEXT="/任意のディレクトリ/show_oracle_session_list.sql"

if [ -r ${SQL_TEXT} ] ; then

        sqlplus / as sysdba @${SQL_TEXT}

fi
```

スクリプトに実行権限を設定します。

```
[oracle@example-oracle-11g-active ~]$ chmod 754 show_oracle_session_list.sh
```

スクリプト内で実行するSQLファイルを作成します。
SQLファイルにはchmod 754のような実行権限付与は不要です。

```
[oracle@example-oracle-11g-active ~]$ vi /任意のディレクトリ/show_oracle_session_list.sql
```

```sql:show_oracle_session_list.sql
set echo on
set colsep |
set pages 1000
set lines 1000

column MACHINE format a30
column SID format 999999
column SERIAL# format 999999
column STATUS format a10
column USERNAME format a10
column OSUSER format a10
column EXECUTIONS format 999999999999
column CPU_TIME format 999999999999
column ELAPSED_TIME format 999999999999
column SQL_ID format a15
SELECT
  SS.SID,
  SS.SERIAL#,
  SQ.EXECUTIONS,
  SQ.CPU_TIME,
  SQ.ELAPSED_TIME,
  SS.STATUS,
  SS.USERNAME,
  SS.OSUSER,
  SS.MACHINE,
  SS.LOGON_TIME,
  SS.PROGRAM,
  SS.SQL_ID,
-- SS.SQL_CHILD_NUMBER,
-- SQ.SQL_FULLTEXT,
  SQ.SQL_TEXT
FROM
  V$SESSION SS, V$SQL SQ
WHERE
  SS.SQL_ID = SQ.SQL_ID
AND
  SS.SQL_CHILD_NUMBER = SQ.CHILD_NUMBER
ORDER BY
  SQ.CPU_TIME DESC;

SELECT machine, count(machine) "SESSION_COUNT", status, count(status) FROM v$session group by machine, status order by SESSION_COUNT desc;

SELECT machine, count(machine) "SESSION_COUNT" FROM v$session group by machine order by SESSION_COUNT desc;

SELECT * FROM v$resource_limit;

SELECT status, count(status) FROM v$session group by status;

SELECT count(1) FROM v$session;


exit
```

Oracle 11gサーバでのスクリプト実行例
===

Oralce 11gサーバにoracleユーザでログインして、先ほど作成したスクリプトを実行します。以下のようにOracleデータベースに接続中の各セッション一覧、接続元サーバのセッション数を表示出来ます。

なお、以下に記載しているスクリプト実行結果のユーザ名等の表示はサンプル用に修正しております。

```
[oracle@example-oracle-11g-active ~]$ ./show_oracle_session_list.sh
SQL> set colsep |
SQL> set pages 1000
SQL> set lines 1000
SQL>
SQL> column MACHINE format a30
SQL> column SID format 999999
SQL> column SERIAL# format 999999
SQL> column STATUS format a10
SQL> column USERNAME format a10
SQL> column OSUSER format a10
SQL> column EXECUTIONS format 999999999999
SQL> column CPU_TIME format 999999999999
SQL> column ELAPSED_TIME format 999999999999
SQL> column SQL_ID format a15
SQL> SELECT
  2    SS.SID,
  3    SS.SERIAL#,
  4    SQ.EXECUTIONS,
  5    SQ.CPU_TIME,
  6    SQ.ELAPSED_TIME,
  7    SS.STATUS,
  8    SS.USERNAME,
  9    SS.OSUSER,
 10    SS.MACHINE,
 11    SS.LOGON_TIME,
 12    SS.PROGRAM,
 13    SS.SQL_ID,
 14  -- SS.SQL_CHILD_NUMBER,
 15  -- SQ.SQL_FULLTEXT,
 16    SQ.SQL_TEXT
 17  FROM
 18    V$SESSION SS, V$SQL SQ
 19  WHERE
 20    SS.SQL_ID = SQ.SQL_ID
 21  AND
 22    SS.SQL_CHILD_NUMBER = SQ.CHILD_NUMBER
 23  ORDER BY
 24    SQ.CPU_TIME DESC;

    SID|SERIAL#|   EXECUTIONS|     CPU_TIME| ELAPSED_TIME|STATUS    |USERNAME      |OSUSER    |MACHINE                       |LOGON_TIME         |PROGRAM                                     |SQL_ID           |SQL_TEXT
-------|-------|-------------|-------------|-------------|----------|--------------|----------|------------------------------|-------------------|--------------------------------------------|-----------------|-------------------
   6368|   5673|        61556|   8955532602|  10577027750|ACTIVE    |EXAMPLE_USER  |example   |server1.example.com           |2015/01/22 15:18:25|php@server1.example.com (TNS V1-V3)         |7y6sf3sfphth5    |SELECT **, **, ** FROM example_table WHERE ** = :"SYS_B_00" AND ** = :"SYS_B_01"
   8326|  20334|        22639|   1395539776|   1260076576|ACTIVE    |EXAMPLE_USER  |example   |server2.example.com           |2015/01/22 15:18:28|httpd@server2.example.com (TNS V1-V3)       |d017uxnx03gnx    |(そのセッションが実行中のSQLテキストの一部が表示される)
   7244|  64455|      2105647|    525433923|   2182350485|INACTIVE  |EXAMPLE_USER  |example   |server3.example.com           |2015/01/22 15:18:28|php@server3.example.com (TNS V1-V3)         |f71a536g85g7q    |(そのセッションが実行中のSQLテキストの一部が表示される)

　　(途中省略)

XX rows selected.

SQL>
SQL> SELECT machine, count(machine) "SESSION_COUNT", status, count(status) FROM v$session group by machine, status order by SESSION_COUNT desc;

MACHINE                       |SESSION_COUNT|STATUS    |COUNT(STATUS)
------------------------------|-------------|----------|-------------
example-oracle-11g-active     |           37|ACTIVE    |           37
server1.example.com           |           33|INACTIVE  |           33
server2.example.com           |           27|INACTIVE  |           27
server3.example.com           |           19|INACTIVE  |           19
server3.example.com           |            1|ACTIVE    |            1

　　(途中省略)

XX rows selected.

SQL>
SQL> SELECT machine, count(machine) "SESSION_COUNT" FROM v$session group by machine order by SESSION_COUNT desc;

MACHINE                       |SESSION_COUNT
------------------------------|-------------
example-oracle-11g-active     |           50
server1.example.com           |           33
server2.example.com           |           27
server3.example.com           |           20

　　(途中省略)

XX rows selected.

SQL>
SQL> SELECT * FROM v$resource_limit;

RESOURCE_NAME                 |CURRENT_UTILIZATION|MAX_UTILIZATION|INITIAL_ALLOCATION            |LIMIT_VALUE
------------------------------|-------------------|---------------|------------------------------|------------------------------
processes                     |                324|            527|      7000                    |      7000
sessions                      |                514|           4551|      7805                    |      7805
enqueue_locks                 |                640|           4627|    104630                    |    104630
enqueue_resources             |                208|            233|     38360                    | UNLIMITED

　　(途中省略)

XX rows selected.

SQL>
SQL> SELECT status, count(status) FROM v$session group by status;

STATUS    |COUNT(STATUS)
----------|-------------
ACTIVE    |           58
INACTIVE  |          444

SQL>
SQL> SELECT count(1) FROM v$session;

  COUNT(1)
----------
       502

SQL>
SQL> exit
[oracle@example-oracle-11g-active ~]$
```

ご参考になりましたら幸いです。
以上になります。