Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
セッションをより確実に殺す(Oracle編)
05-19-2014, 05:08 PM, (This post was last modified: 05-20-2014, 01:39 PM by umemura.)
#1
セッションをより確実に殺す(Oracle編)
★point1
 通常は ALTER SYSTEM KILL SESSION で殺す
★point2
 だめなら orakill コマンドで殺す


以前、あるSQLの実行結果が、DBサーバから戻ってこない、という問題が起きた際、
原因となっているDBのセッションを殺す、ということを行いました。

通常、私は、SQL Developer を使っているので、[ツール]->[セッションのモニター]で、
SYSDBA権限を持った接続を開き、[WAIT_SECONDS]の値が大きくなっているレコードを、
右クリックメニューの[セッションの中断]を選んで消しています。
(ALTER SYSTEM KILL SESSION と同等)

ただ、この操作をしたときに、下記のような例外が起こり、
即座にセッションがキルされない、ということが何度もあります。
この例外が発生すると、セッションのレコードで STATUS が、KILLED にはなるのですが、
しばらく(数時間以上)経っても、レコードが残り続ける状態になってしまいます。

■セッションキル時に発生する例外
リクエストされた操作の実行中にエラーが発生しました:

ORA-00031: セッションは強制終了されます。
00031. 00000 - "session marked for kill"
*Cause: The session specified in an ALTER SYSTEM KILL SESSION command
cannot be killed immediately (because it is rolling back or blocked
on a network operation), but it has been marked for kill. This
means it will be killed as soon as possible after its current
uninterruptable operation is done.
*Action: No action is required for the session to be killed, but further
executions of the ALTER SYSTEM KILL SESSION command on this session
may cause the session to be killed sooner.
ベンダー・コード31


こうなってしまうと、何度同様の手順でセッションを殺そうとしても、同じエラーが出るだけで、
セッションが残り続けてしまい、
それだけならまだしも、ほかに何の処理をしていなくても、
この、KILLEDになったセッションがいるだけで、DBサーバのCPU利用率が50%を超えた状態が続いてしまう、という状況でした。

エラー内容を読む限り、ロールバック等の処理をおこなってからセッションが切られます、ということのようですが、
対象のSQLはSELECT文なので、ロールバックする処理はないはずです。

なぜにセッションが残ってしまうのか、原因はわからないのですが、
とりあえず、ALTER SYSTEM KILL SESSION よりさらにアクティブにセッションを殺す方法として、
orakill コマンドというものがあったので、下記に備忘録を残しておきます。
あまり推奨されていないコマンドのようなので利用には注意が必要かも、です。

■orakillコマンド
orakill sid(※1) thread(※2)
※1:対象DBのサービスID セッションID(v$session.sid)ではないことに注意
※2:プロセスID(v$process.spid)

■orakill コマンドに必要なSPIDを特定するためのSELECT文
select spid, s.sid, s.serial#, s.status , osuser, s.program,s.username, s.event from
v$process p, v$session s where p.addr=s.paddr and s.status = 'KILLED';
(STATUSが「KILLED」になっているプロセスIDを確認

■参考 [Oracle]強制終了したセッションが「killed」で残ってしまう場合の対処方法
http://www.popolog.net/articles/2013/04/..._kill.html
02-13-2016, 02:27 PM,
#2
RE: セッションをより確実に殺す(Oracle編)
あまり推奨されていないコマンドのようなので利用には注意が必要かも、です。

Forum Jump:


Users browsing this thread:
1 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('1084')