はじめに
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
# !/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
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 ~]$
ご参考になりましたら幸いです。
以上になります。