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.