豚吐露@wiki

SQL*Plusの応答が全く返って来なくなったら…

最終更新:

ohden

- view
管理者のみ編集可

SQL*Plusの応答が全く返って来なくなったら…

Oracle Database 11gR2 11.2.0.1.0
Windows Server 2008R2

Windows 7-64bit Professional
SQL*Plus 11.2.0.1.0


とりあえず、何とかなった方法をφ(..*)メモメモ...
もちろん何の保証も無いので、自己責任でお願いします。


応答無くなったsqlplus(コマンドプロンプト)を終了。
Ctrl+Cやwindowのcloseボタンでダメだったら、タスクマネージャーからプロセスの終了。

これでOracleから切断できてれば、大丈夫らしい。
OracleってTransaction残ったまま切断されたりしたら、強制的にrollbackしてくれるらしい。
この強制rollbackに期待して作業を進める。


強制終了したsqlplusの接続(session)がちゃんと終わってるかの確認。

コマンドプロンプト立ち上げて、sqlplus使って接続。以下のSQLを実行。
SQL> SET LINESIZE 9999
SQL> SET PAGESIZE 100
SQL> SELECT * FROM V$SESSION WHERE PROGRAM='sqlplus.exe';
※『sqlplus.exe』は小文字ね。
で、レコードが1件だけ見つかれば、今いじってるこのsqlplusだけが接続されてるって分かるので、大丈夫。
止まってたsqlplusに出してた要求がどうなってるか確認して大丈夫そうなら終了ですね。

もし、複数の人が繋いだりしてる環境だったら、当然複数レコード見つかるのでUSERNAMEやOSUSER、MACHINE、TERMINALで絞り込んでやる。
自分の環境からの複数のsessionが見つかったら...さっきのsessionが切れてないって事。

自分のSID調べて
SQL>  SELECT USERENV('SID') SID FROM DUAL;
このSIDに該当しないのが多分、ちゅうぶらりんになってるsession。

他にもまだレコードが見つかったら、現在実行中のSQLを調べて判断する。
SQL> SELECT S.*, Q.SQL_TEXT FROM V$SESSION S, V$SQL Q WHERE PROGRAM = 'sqlplus.exe' AND S.SQL_ID = Q.SQL_ID;
V$SQL.SQL_TEXT にそのsessionが実行中のSQLが表示される。

見つかったsessionに強制終了したsqlplusが残ってたら...sessionの強制終了。
今まで実行したV$SESSIONへのSQLを見たら、問題のsqlplusのsessionの『SID』と『SERIAL#』がわかるハズ。
以下のSQLにSIDとSERIAL#を指定して実行すれば対象のsessionを強制終了できる。
SQL> ALTER SYSTEM KILL SESSION '【SID】,【SERIAL#】';

e.g.) SIDが123、SERIAL#が4567の場合
SQL> ALTER SYSTEM KILL SESSION '123,4567';

上記の強制終了SQLを実行して再び
SQL> SELECT * FROM V$SESSION WHERE PROGRAM='sqlplus.exe';
を実行。問題のsessionが強制終了されてるのを確認する。

ただ、自分がやった時って、session終了の要求だしてもなかなかsessionが消えてくれんかったんで、止まったSQLや環境によってはしばらく残ってしまうようです。
ま、それでも、わしの場合で1分も残って無かったと思うが...

繰り返しますが、自己責任でお試しください。


更新日: 2016年03月31日 (木) 11時08分02秒

名前:
コメント:

すべてのコメントを見る
記事メニュー
目安箱バナー