LoginSignup
6

More than 5 years have passed since last update.

SQL文の強制停止機能を試す (Oracle Database 18c)

Last updated at Posted at 2018-09-03

Oracle Database 18c の新機能である SQL 文の強制終了機能を試してみました。負荷が高いSQL文を実行してしまった場合に、外部から SQL 文のみを強制的に停止することができます。

セッションの切断

Oracle Database 18c よりも前のバージョンでは、実行中の SQL 文を外部から停止するにはセッションを強制切断するしかありませんでした。外部からセッションを強制的に切断するには ALTER SYSTEM KILL SESSION 文または ALTER SYSTEM DISCONNECT SESSION 文を実行します。パラメーターとしてセッション識別子(SID)、セッション・シリアル番号(SERIAL#)、インスタンス番号(INST_ID)を指定します。これらの情報は GV$SESSION ビューから入手できます。

SQL> SELECT INST_ID, SID, SERIAL# FROM GV$SESSION WHERE USERNAME='SCOTT';

   INST_ID        SID    SERIAL#
---------- ---------- ----------
         1        395      39236

SQL> ALTER SYSTEM KILL SESSION '395, 39236, @1';

System altered.

Oracle Real Application Clusters 環境でなければインスタンス番号は不要になり、検索するビューも V$SESSION ビューになります。
切断されたクライアントはにはエラー「ORA-00028 your session has been killed」が発生して処理を継続できません。

...
        C1 C2
---------- -----
    145014 data1
    145015 data1
    145016 data1
    145017 data1
    145018 data1
    145019 data1
    145020 data1
ERROR:
ORA-00028: your session has been killed

145020 rows selected.

SQL 文の停止

Oracle Database 18c では、セッションを維持したまま SQL 文の実行だけを停止できるようになりました。SQL 文を停止するには ALTER SYSTEM CANCEL SQL 文を実行します。指定するパラメーターは ALTER SYSTEM KILL SESSION 文に指定した情報に加えて SQL識別子(SQL_ID)を追加するだけです。

SQL> SELECT INST_ID, SID, SERIAL#, SQL_ID FROM GV$SESSION WHERE USERNAME='SCOTT';

   INST_ID        SID    SERIAL# SQL_ID
---------- ---------- ---------- -------------
         1        395      50025 6cgru9ybzwr89

SQL> ALTER SYSTEM CANCEL SQL '395, 50025, @1, 6cgru9ybzwr89';

System altered.

SQL識別子を省略することもできます。その場合には現在実行中の SQL 文がキャンセルされます。キャンセルされた SQL 文には、エラー「ORA-01013: user requested cancel of current operation」が発生してSQL文が停止されます。

...

        C1 C2
---------- -----
    246984 data1
    246985 data1
    246986 data1
    246987 data1
    246988 data1
    246989 data1
    246990 data1
ERROR:
ORA-01013: user requested cancel of current operation

246990 rows selected.

SQL>

マニュアル

マニュアルは こちら です。

実は

この機能は Oracle Database 12c Release 2 (12.2) でも実行できることがわかりました
ただしマニュアルには記載されておらず、Oracle Database 18c の新機能ガイドに載っているのでサポート対象かはわかりません。

SQL> SELECT BANNER FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

SQL> SELECT SID, SERIAL# FROM V$SESSION WHERE USERNAME='SCOTT';

       SID    SERIAL#
---------- ----------
       159      20923

SQL> ALTER SYSTEM CANCEL SQL '159, 20923';

System altered.

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6