【ORACLE】他サーバやマシンからの接続セッションを特定する方法


V$SESSION.MACHINEにマシン名で検索をかけて、

あとはLOGON_TIMEやV$SQL.SQLTEXT等を見ればある程度わかるけど、

そのあたりがはっきりしない場合に接続元マシンから探り当てる方法。

※例によって経験則なので確実かどうかわかりません

※Linuxを前提にしていますがWindowsでも似た考えでできると思います


0.下記のようなケースであったとします

 接続元サーバ:MACHINE_A(192.168.0.100)

 接続先サーバ:MACHINE_B(192.168.0.101)

 要するに

 MACHINE_AがWEBアプリケーションとかバッチとかを実行している大元で

 MACHINE_BがDBサーバ。

 このときMACHINE_Aの特定のプロセスに対応する

 Oracleのセッションを探り当てる。

 

1.MACHINE_Aで対象のプロセスのPIDを取得

 たとえば特定のjavaプロセスなら

 ps -efa | grep java

2.MACHIBE_Aでnetstatして、1.のPIDとMACHINE_BのIPでgrepする

 たとえば1.のPIDが1234なら

 netstat -anop | grep 1234 | grep 192.168.0.101

3.上記2.の結果の中からMACHINE_Bの1521ポートを使ってるのを探す

 ↑こういうの

 このときの192.168.0.100側(Loacl Address部)のポート番号(この例では23456)を控える

4.MACHINE_Bでnetstatして、3.のポート番号でgrepする

 netstat -anop | grep 23456

 ↑このときの「PID/Program name」(のPID部分 つまり/の左側=22286)が

 1.で特定しようと思ったプロセスに対応するDBサーバ側のプロセスID。

 

この4.はV$PROCESS.SPIDに対応するレコードが存在している。

あとは下記の記事に示したやり方(V$PROCESSからV$SESSIONを特定)でSIDが特定できる。


この例でいうと、

・MACHINE_Aが非常に混み合ってる時間帯で

 MACHINE_AからMACHINE_Bに大量のACTIVEセッションが発生している

・MACHINE_Aにひとつ長時間走行しているプロセスがある(ので殺したい)

・MACHINE_Bには大量のMACHINE_Aのセッションがあるので

 どれが長時間走行してるセッションなのかわらかない

というときにこの方法を個人的によく使います。

なお、netstatはroot(権限を持つユーザー)でやった方が良いかもしれません。