はじめに
SQL の実行に時間がかかってしまい、処理を強制的に終了したい場合は、CLOSE_SESSION 関数を利用します。本記事は、CLOSE_SESSION 関数で特定セッションを強制的に終了する方法をご紹介します。CLOSE_SESSION 関数の実行手順
1) QUERY_REQUESTS システムテーブルで、SQL の実行に時間がかかっているセッションを特定します。後述「注意点」を事前にご確認ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
=> \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を対象とする場合 f: 完了したSQLを対象とする場合 |
2) CLOSE_SESSION 関数で「session_id=v_testdb_node0001-1889050:0x123」を指定し、終了します。
1 2 3 |
=> 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」は終了し、ユーザには以下のエラーが返されます。
1 2 3 4 5 6 |
=> 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実行中のセッションを強制的に終了する方法②
http://vertica-tech.ashisuto.co.jp/session-close2/
注意点
DBが稼働中の状態で、強制的にOSシャットダウンをした場合に、QUERY_REQUESTS システムテーブルに記録されるセッションのステータスが更新されず、セッションが残存しているように見える事があります。このような場合は、QUERY_REQUESTS システムテーブルだけでなく、SESSIONS システムテーブルも確認し、セッションが切断されたことをご確認ください。こちらは、ハングしたセッション(v_test_node0001-3171788:0x4d48a)を切断するために、強制的にOSシャットダウンした後にQUERY_REQUESTS システムテーブルを確認した結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
=> \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 システムテーブルを用いたセッションの確認方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
=> \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 NULLは現在処理がないことを示す |
参考情報
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から特定のセッションをクローズする方法
http://vertica-tech.ashisuto.co.jp/mc_close_session/
セッションを全てクローズする方法
http://vertica-tech.ashisuto.co.jp/allsession-close/
検証バージョンについて
この記事の内容はVertica 23.3で確認しています。更新履歴
2023/08/28 バージョン23.3用に改訂、「注意点」の項目追加、「参考情報」にマニュアルのリンクを追加
2022/05/27 バージョン11.1用に改訂、
「はじめに」と「強制的にセッションを終了できない場合」の項目追加、
「参考情報」にマニュアルとMC操作のリンク追加
2015/04/23 本記事を公開
- 投稿タグ
- CLOSE_ALL_SESSIONS, セッション, 強制, 終了, 全て, 特定, session, CLOSE_SESSION