SQL

強制的にプロセスをKILL(ロック解除)を行うSQL

  • このエントリーをはてなブックマークに追加

SQLを実行したけど、結果が返ってこなくて、ロックがかかってしまうことは良くあると思います。

そういった場合に使える、強制的にプロセスをKILLするサンプルSQLになります。

SQLのプロセスをKILL(ロック解除)する方法

プロセスがロックされている状態

SQL> DROP TABLE TB_SAMPLE;

行1でエラーが発生しました。:
ORA-00054: リソース・ビジー。NOWAITが指定されているか、タイムアウトしました

ロックされているSQLの情報を抽出する

V$SESSIONV$SQLV$LOCKを使用してロックされているSQLの情報を抽出できます。

SQLのSESSIONNをKILLするためにはSIDSERIALが必須になります。

また、SQL文も抽出しないと、KILLしたいSIDSERIALがどれなのかを見つけることができないので、SQL文を抽出するのも必須かと思います。

SELECT
    X.SID
  , X.SERIAL#
  , TO_CHAR(
        X.SQL_EXEC_START
      , 'YYYY/MM/DD HH24:MI:SS'
    ) AS SQL_EXEC_START
  , Y.SQL_TEXT
FROM
    V$SESSION X
        INNER JOIN V$SQL Y
           ON Y.HASH_VALUE = X.SQL_HASH_VALUE
          AND Y.ADDRESS    = X.SQL_ADDRESS
WHERE
    X.STATUS = 'ACTIVE'
AND X.SID IN (
        SELECT
            Z.SID
        FROM
            V$LOCK Z
        WHERE
            Z.TYPE IN ('TM','TX')
    )
;

 SID  SERIAL# SQL_EXEC_START       SQL_TEXT
---- -------- -------------------- ----------------------------------------------------------------------------------------------------------
98 3349
2018/04/05 01:31:19 INSERT INTO TB_SAMPLE (ID,NAME,MEMO1,MEMO2,MEMO3,MEMO4,MEMO5) VALUES(:B7 ,:B6 ,:B5 ,:B4 ,:B3 ,:B2 ,:B1 )

SID,SERIAL#を使ってKILL(ロック解除)

ALTER SYSTEM KILL SESSION 
'98, 3349'
システムが変更されました。

ロックされているプロセスが無いことを確認

SELECT
    X.SID
  , X.SERIAL#
  , TO_CHAR(
        X.SQL_EXEC_START
      , 'YYYY/MM/DD HH24:MI:SS'
    ) AS SQL_EXEC_START
  , Y.SQL_TEXT
FROM
    V$SESSION X
        INNER JOIN V$SQL Y
           ON Y.HASH_VALUE = X.SQL_HASH_VALUE
          AND Y.ADDRESS    = X.SQL_ADDRESS
WHERE
    X.STATUS = 'ACTIVE'
AND X.SID IN (
        SELECT
            Z.SID
        FROM
            V$LOCK Z
        WHERE
            Z.TYPE IN ('TM','TX')
    )
;

レコードが選択されませんでした。

ロック解除したため操作可能

SQL> DROP TABLE TB_SAMPLE;

表が削除されました。

以上です。

  • このエントリーをはてなブックマークに追加

コメントを残す

*