はじめに
SQL の実行に時間がかかってしまい、処理を強制的に終了したい場合は、CLOSE_SESSION 関数を利用します。本記事は、CLOSE_SESSION 関数で特定セッションを強制的に終了する方法をご紹介します。
CLOSE_SESSION 関数の実行手順
1) QUERY_REQUESTS システムテーブルで、SQL の実行に時間がかかっているセッションを特定します。後述「注意点」を事前にご確認ください。
=> \x
Expanded display is on.
=> select node_name, user_name, session_id, request, memory_acquired_mb, start_timestamp, is_executing
-> from query_requests
-> where is_executing='t' order by start_timestamp desc;
-[ RECORD 1 ]------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
node_name | v_testdb_node0001
user_name | dbadmin
session_id | v_testdb_node0001-1889050:0x157 //★終了したいセッションIDを確認
request | select node_name, user_name, session_id, request, memory_acquired_mb, start_timestamp, is_executing from query_requests where is_executing='t' order by start_timestamp desc;
memory_acquired_mb | 127.2
start_timestamp | YYYY-MM-DD HH24:MI:SS.ffffff
is_executing | t
-[ RECORD 2 ]------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
node_name | v_testdb_node0001
user_name | dbadmin
session_id | v_testdb_node0001-1889050:0x123
request | copy CUSTOMER from '/home/dbadmin/copy/customer.tbl' ;
memory_acquired_mb | 284.07
start_timestamp | YYYY-MM-DD HH24:MI:SS.ffffff //★開始時間を確認
is_executing | t[QUERY_REQUESTS]
カラム名 | 説明 |
|---|---|
NODE_NAME | SQLが実行されたノード名 |
USER_NAME | SQLを実行したDBユーザ名 |
SESSION_ID | セッションID |
REQUEST | 実行されたSQL |
MEMORY_ACQUIRED_MB | SQLによって取得されたメモリサイズ(MB単位) |
START_TIMESTAMP | SQLの開始時間 |
IS_EXECUTING | t: 現在実行中のSQLを対象とする場合 |
2) CLOSE_SESSION 関数で「session_id=v_testdb_node0001-1889050:0x123」を指定し、終了します。
=> select close_session('v_testdb_node0001-1889050:0x123');
-[ RECORD 1 ]-+-------------------------------------------------------------------
close_session | Session close command sent. Check v_monitor.sessions for progress.3) SQL を実行していたセッション「session_id=v_testdb_node0001-1889050:0x123」は終了し、ユーザには以下のエラーが返されます。
=> copy CUSTOMER from '/home/dbadmin/copy/customer.tbl' ;
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.強制的にセッションを終了できない場合
SQL がハングしてしまい、CLOSE_SESSION 関数の実行では、特定セッションを強制的に終了できない場合があります。その場合は、以下の記事をご参考に対応してください。
SQL実行中のセッションを強制的に終了する方法②
https://www.ashisuto.co.jp/cm/analytics-database/session-close2.html
注意点
DBが稼働中の状態で、強制的にOSシャットダウンをした場合に、QUERY_REQUESTS システムテーブルに記録されるセッションのステータスが更新されず、セッションが残存しているように見える事があります。このような場合は、QUERY_REQUESTS システムテーブルだけでなく、SESSIONS システムテーブルも確認し、セッションが切断されたことをご確認ください。
こちらは、ハングしたセッション(v_test_node0001-3171788:0x4d48a)を切断するために、強制的にOSシャットダウンした後にQUERY_REQUESTS システムテーブルを確認した結果です。
=> \x
Expanded display is on.
=> select node_name, user_name, session_id, request, memory_acquired_mb, start_timestamp, is_executing
-> from query_requests
-> where is_executing='t' order by start_timestamp desc;
-[ RECORD 1 ]------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
node_name | v_test_node0001
user_name | dbadmin
session_id | v_test_node0001-3171788:0x4d48a
request | copy CUSTOMER from '/home/dbadmin/copy/customer.tbl' ;
memory_acquired_mb | 283.83
start_timestamp | YYYY-MM-DD HH24:MI:SS.ffffff
is_executing | t //★処理は完了済みだが、OSシャットダウンをしたので「t」と表示される複数ノード構成の場合は、SESSIONS システムテーブルを検索することで、各ノードのログイン・セッション情報を取得可能です。SESSIONS システムテーブルを用いたセッションの確認方法です。
=> \x
Expanded display is on.
=> select node_name, user_name, session_id, statement_start, to_char(getdate() - statement_start,'HH24:MI:SS') as execution_time, current_statement
-> from sessions
-> order by execution_time desc ;
-[ RECORD 1 ]-----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
node_name | v_testdb_node0001
user_name | dbadmin
session_id | v_testdb_node0001-1889050:0x27a
statement_start |
execution_time |
current_statement |
-[ RECORD 2 ]-----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
node_name | v_testdb_node0001
user_name | dbadmin
session_id | v_testdb_node0001-1889050:0x157
statement_start | YYYY-MM-DD HH24:MI:SS.ffffff
execution_time | 00:00:00
current_statement | select node_name, user_name, session_id, statement_start, to_char(getdate() - statement_start,'HH24:MI:SS') as execution_time, current_statement from sessions order by execution_time desc ;[SESSIONS]
カラム名 | 説明 |
|---|---|
NODE_NAME | 接続しているノード |
USER_NAME | 接続したDBユーザ名 |
SESSION_ID | セッションID |
STATEMENT_START | セッションが開始した時刻 |
EXECUTION_TIME | セッションの接続経過時間 |
CURRENT_STATEMENT | 現在実行中のSQL |
参考情報
CLOSE_SESSION
https://docs.vertica.com/23.3.x/en/sql-reference/functions/management-functions/session-functions/close-session/
QUERY_REQUESTS
https://docs.vertica.com/23.3.x/en/sql-reference/system-tables/v-monitor-schema/query-requests/
SESSIONS
https://docs.vertica.com/23.3.x/en/sql-reference/system-tables/v-monitor-schema/sessions/
Management Consoleから特定のセッションをクローズする方法
https://www.ashisuto.co.jp/cm/analytics-database/mc_close_session.html
セッションを全てクローズする方法
https://www.ashisuto.co.jp/cm/analytics-database/allsession-close.html
検証バージョンについて
この記事の内容はVertica 23.3で確認しています。
更新履歴
2023/08/28 バージョン23.3用に改訂、
「注意点」の項目追加、「参考情報」にマニュアルのリンクを追加
2022/05/27 バージョン11.1用に改訂、
「はじめに」と「強制的にセッションを終了できない場合」の項目追加、
「参考情報」にマニュアルとMC操作のリンク追加
2015/04/23 本記事を公開