PostgreSQL セッション管理

説明する

データベースの CPU 使用率が高い状態が続いている場合、データベース内で大規模なクエリやより複雑な SQL が実行されている可能性があります。処理が時間内に行われないと、ビジネスに影響を及ぼす可能性があります。この時点で、「犯人」を見つける必要があります。クエリ セッションを通じて、それを強制終了し、サンプル ステートメントを使用して最適化します。

MySQL では、processlist を通じてセッション関連情報をクエリできます。また、PostgreSQL では、運用および保守担当者にセッション統計ビュー pg_stat_activity が提供されます。この記事では、ビューの各フィールドの意味と使用スキルを紹介します。

1. クエリセッション

テーブルフィールドが多いため、ターミナルでクエリすると重なって見づらくなるため、\GMySQLと同様に拡張表示を有効にする必要があります。

postgres=# \x
Expanded display is on.

現在アクティブなセッションをクエリします。

postgres=# select * from pg_stat_activity where state != 'idle';
-[ RECORD 1 ]----+-------------------------------------------------------
datid            | 13593
datname          | postgres
pid              | 65695
usesysid         | 10
usename          | postgres
application_name | psql
client_addr      | 
client_hostname  | 
client_port      | -1
backend_start    | 2023-06-28 14:39:27.102519+08
xact_start       | 2023-06-28 16:06:16.063186+08
query_start      | 2023-06-28 16:06:16.063186+08
state_change     | 2023-06-28 16:06:16.06322+08
wait_event_type  | 
wait_event       | 
state            | active
backend_xid      | 
backend_xmin     | 691
query            | select * from pg_stat_activity where state != 'idle' ;
backend_type     | client backend

2. 概要を見る

2.1 過去形

このバックエンドが接続されているデータベースの OID。

2.2 データ名

このバックエンドが接続されているデータベースの名前。

2.3ピド

セッションを強制終了するときに、このバックエンドのプロセス ID が必要になります。

2.4 usesysid

このバックエンドにログインしたユーザーの OID。

ごま 2.5個

このバックエンドにログインしているユーザーの名前。

2.6 アプリケーション名

このバックエンドに接続されているアプリケーションの名前。

2.7 クライアントアドレス

このバックエンドに接続するクライアントの IP アドレス。このフィールドが空の場合は、クライアントがサーバー マシン上の Unix ソケットを介して接続しているか、これが内部プロセス (自動クリーニングなど) であることを示します。

2.8 クライアントホスト名

client_addr の逆引き DNS ルックアップによって報告される、接続されたクライアントのホスト名。このフィールドは、IP 接続の場合、および log_hostname が有効な場合にのみ null 以外になります。

2.9 クライアントポート

クライアントがこのバックエンドと通信するために使用する TCP ポート番号、または Unix ソケットを使用する場合は -1。

2.10 バックエンド_スタート

このプロセスが開始される時刻は、クライアントがクライアント バックエンドのサーバーに接続する時刻です。

2.11 xact_start

このプロセスの現在のトランザクションが開始された時刻。アクティブなトランザクションがない場合は空です。現在のクエリが最初のトランザクションである場合、この列は query_start と等しくなります。

2.12 クエリ開始

現在のアクティブなクエリが開始された時刻。状態がアクティブでない場合、このフィールドは前のクエリが開始された時刻になります。

2.13 状態変化

状態が最後に変更された時刻。

2.14 wait_event_type

バックエンドが待機しているイベントのタイプ。イベントが存在しない場合は NULL。可能な値は次のとおりです。

  • LWLock: バックエンドは軽量ロックを待機しています。このような各ロックは、共有メモリ内の特定のデータ構造を保護します。
  • ロック: バックエンドは重量ロックを待機しています。ヘビーウェイト ロックは、ロック マネージャー ロックまたは単純ロックとも呼ばれ、主にテーブルなどの SQL に表示されるオブジェクトを保護します。
  • BufferPin: サーバー プロセスは、他のプロセスがバッファをチェックしていない間、データ バッファへのアクセスを待機しています。別のプロセスがオープン カーソルを保持し、最終的にアクセス中のバッファからデータを読み取る場合、バッファ ピンの待機が遅れることがあります。
  • アクティビティ: サーバー プロセスはアイドル状態です。これは、メイン処理ループでアクティビティを待機しているシステム プロセスによって使用されます。wait_even は特定の待機ポイントを識別します。
  • 拡張機能: サーバー プロセスは拡張モジュール内のアクティビティを待機しています。このカテゴリは、カスタム待機ポイントを追跡するモジュールに使用されます。
  • クライアント: サーバー プロセスはユーザー アプリケーションからの何らかのアクティビティをソケット上で待機しており、サーバーは内部処理とは関係のない何かが発生することを期待しています。wait_even は特定の待機ポイントを識別します。
  • IPC: サーバー プロセスは、サーバー内の別のプロセスからの何らかのアクティビティを待機しています。wait_even は特定の待機ポイントを識別します。
  • タイムアウト: サーバー プロセスはタイムアウトが発生するのを待機しています。wait_even は特定の待機ポイントを識別します。
  • IO: サーバー プロセスは IO が完了するのを待っています。wait_even は特定の待機ポイントを識別します。

2.15 待機イベント

バックエンドが現在待機中の場合は待機イベントの名前、それ以外の場合は NULL。

2.16 状態

このバックエンドの現在の全体的なステータス。可能な値は次のとおりです。

  • active: バックエンドがクエリを実行しています。
  • idle: 現時点ではアイドル状態にあり、新しいクライアント コマンドを待っています。
  • トランザクション中アイドル: バックエンドはトランザクション中ですが、現在クエリを実行していません。
  • トランザクション中のアイドル (中止): この状態は、トランザクション内のステートメントによってエラーが発生したことを除いて、トランザクション中のアイドルと似ています。
  • ファストパス関数呼び出し: バックエンドはファストパス関数を実行しています。
  • 無効: このバックエンドで track_activities が無効になっている場合、このステータスが報告されます。

2.17 バックエンド_xid

このバックエンドのトップレベルのトランザクション識別子 (存在する場合)。

2.18 バックエンド_xmin

バックエンドの現在の xmin 範囲。

2.19 クエリ

このバックエンドによって最近クエリされたテキスト。状態がアクティブな場合、このフィールドには現在実行中のクエリが表示されます。他のすべての状態では、最後に実行されたクエリが表示されます。デフォルトでは、クエリテキストは 1024 文字に切り詰められます。この値はパラメータ track_activity_query_size を介して変更できます。

2.20 バックエンドタイプ

現在のバックエンドのタイプ。可能なタイプは、自動バキューム ランチャー、自動バキューム ワーカー、論理レプリケーション ランチャー、論理レプリケーション ワーカー、パラレル ワーカー、バックグラウンド ライター、クライアント バックエンド、チェックポイント作成者、スタートアップ、walreceiver、walsender、および walwriter です。これに加えて、拡張機能によって登録されたバックグラウンド ワーカーには追加のタイプがある場合があります。

3. セッションを管理する

3.1 クエリセッション

会話は以下のクエリを使用して表示できます。

#查看活跃会话
select * from pg_stat_activity where state != 'idle' ;

#查看包含在事物内的会话
select * from pg_stat_activity where state like '%idle%transaction%';

#查看耗时1s以上的活跃会话
select * from pg_stat_activity where state<>'idle' and now()-query_start > interval '1 s' order by query_start ; 

3.2 セッションを強制終了する

次のコマンドを使用して、pg のバックグラウンドからこのプロセスを強制終了し、貴重な接続リソースを解放できます。

select pg_terminate_backend($pid);

エラー:サーバーへの接続が失われました

実行中の SQL を終了するだけでは接続は解放されません。

SELECT pg_cancel_backend($pid);

エラー: ユーザー要求によりステートメントをキャンセルしています

おすすめ

転載: blog.csdn.net/qq_42768234/article/details/131438205
おすすめ