読者です 読者をやめる 読者になる 読者になる

kenken0807_DBメモ

つば九郎が好きなDBAです。Oracle Standard Editionでの運用やツールとかとかの備忘録。特に記載がない場合はoracle11gR2です。時々MySQL

Oracle SQL経過時間の確認とnagios監視

1.現在のSQL経過時間を確認するSQL

SELECT AUDSID,
       nvl(round((sysdate - SQL_EXEC_START) * 24 * 60 * 60,0),0) as ACTIVE_TIME
       ,sql_id
       ,username
FROM v$session 
WHERE username in ('ORAUSER','ORAUSER2') AND --チェックするユーザを入れる
      status='ACTIVE'                         -- ACTIVEのセッションのみ
ORDER BY ACTIVE_TIME DESC;

    AUDSID ACTIVE_TIME SQL_ID        USERNAME
---------- ----------- ------------- ------------------------------
   9923117          15 2qrzv6s3j88rj ORAUSER
   
カラム 説明
AUDSID 9923117 監査セッションID
ACTIVE_TIME 15秒 SQLの経過時間
SQL_ID 2qrzv6s3j88rj SQL_ID
USERNAME ORAUSER ユーザ名

2.SQL_IDから実行されているSQL確認

SELECT sql_text FROM v$sqltext WHERE SQL_ID = '2qrzv6s3j88rj' ORDER BY piece;

SQL_TEXT
----------------------------------------------------------------
select count(*) from log_table

1と2を合わせて作成したnagiosプラグイン

github.com

こんな感じで監視可能

$./check_oracle_long_query.pl -h 192.168.1.1 -u system -p systempassword -D orcl -c ORAUSER-w 30 -l 180
OK
$ echo $?
0
$./check_oracle_long_query.pl -h 192.168.1.1 -u system -p systempassword -D orcl -c ORAUSER-w 30 -l 180
WARNING:  TIME= 164 SQL_ID=dm9b2ftx3qfsv SQL= BEGIN DBMS_LOCK.SLEEP(300); END;
$ echo $?
1
$./check_oracle_long_query.pl -h 192.168.1.1 -u system -p systempassword -D orcl -c ORAUSER-w 30 -l 180
CRITICAL:  TIME= 272 SQL_ID=dm9b2ftx3qfsv SQL= BEGIN DBMS_LOCK.SLEEP(300); END;
$ echo $?
2

追記2016/2/3
nvl(round((sysdate - SQL_EXEC_START) * 24 * 60 * 60,0),0) as ACTIVE_TIMEこうしなくても
v$sessionLAST_CALL_ETから取得できた模様。

セッションSTATUSが現在ACTIVEである場合は、セッションがアクティブになってからの経過時間(秒)を表す。 セッションSTATUSが現在INACTIVEである場合は、セッションが非アクティブになってからの経過時間(秒)を表す。