查看和终止 PostgreSQL 连接会话

session


大家好,我是只谈技术不剪发的 Tony 老师。今天给大家介绍一下如何如何查看和终止 PostgreSQL 的连接会话。

在 PostgreSQL 中,配置参数 max_connections 决定了数据库的并发连接上限,默认值为 100:

postgres=> show max_connections;
 max_connections 
-----------------
 100
(1 row)

这个数值还包括了预留给 superuser 的一些连接,具体数量由参数 superuser_reserved_connections 决定:

postgres=> show superuser_reserved_connections;
 superuser_reserved_connections 
--------------------------------
 3
(1 row)

也就是说,当连接数到达 max_connections - superuser_reserved_connections 时,只有超级用户才能建立新的数据库连接;普通用户连接时将会返回错误信息“FATAL: sorry,too many clients already.”或者“FATAL: remaining connection slots are reserved for non-replication superuser connections”。当我们遇到这种连接数过多的错误,或者由于其他原因需要找出目前存在哪些客户端的连接时,可以采用以下方法。

利用视图 pg_stat_activity 查看连接会话

PostgreSQL 动态统计视图 pg_stat_activity 中的每一行代表了一个后台进程,包含了该进程当前活动相关的信息。

postgres=> select pid,
       datname as database_name,
       usename as user_name,
       application_name,
       client_addr,
       backend_start,
       state,
       state_change,
       wait_event_type,
       wait_event,
       query,
       backend_type
from pg_catalog.pg_stat_activity;
pid  |database_name|user_name|application_name                         |client_addr |backend_start      |state |state_change       |wait_event_type|wait_event         |query                                                                                                                                                                                                                                                          |backend_type                |
-----|-------------|---------|-----------------------------------------|------------|-------------------|------|-------------------|---------------|-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------|
 1677|             |         |                                         |            |2020-07-06 09:29:33|      |                   |Activity       |AutoVacuumMain     |                                                                                                                                                                                                                                                               |autovacuum launcher         |
 1679|             |postgres |                                         |            |2020-07-06 09:29:33|      |                   |Activity       |LogicalLauncherMain|                                                                                                                                                                                                                                                               |logical replication launcher|
23483|hrdb         |postgres |DBeaver 7.1.2 - Main <hrdb>              |192.168.56.1|2020-07-08 08:09:58|idle  |2020-07-08 08:09:58|Client         |ClientRead         |SHOW search_path                                                                                                                                                                                                                                               |client backend              |
23484|hrdb         |postgres |DBeaver 7.1.2 - Metadata <hrdb>          |192.168.56.1|2020-07-08 08:09:58|idle  |2020-07-08 08:09:58|Client         |ClientRead         |SELECT t.oid,t.*,c.relkind,format_type(nullif(t.typbasetype, 0), t.typtypmod) as base_type_name¶FROM pg_catalog.pg_type t¶LEFT OUTER JOIN pg_class c ON c.oid=t.typrelid¶WHERE typnamespace=$1ORDER by t.oid                                                 |client backend              |
23486|pagila       |postgres |DBeaver 7.1.2 - SQLEditor <Script-13.sql>|192.168.56.1|2020-07-08 08:09:58|active|2020-07-08 08:10:30|               |                   |select pid,¶       datname as database_name,¶       usename as user_name,¶       application_name,¶       client_addr,¶       backend_start,¶       state,¶       state_change,¶       wait_event_type,¶       wait_event,¶       query,¶       backend_type¶fr|client backend              |
23487|pagila       |postgres |DBeaver 7.1.2 - Main <pagila>            |192.168.56.1|2020-07-08 08:09:58|idle  |2020-07-08 08:09:58|Client         |ClientRead         |SHOW search_path                                                                                                                                                                                                                                               |client backend              |
23488|pagila       |postgres |DBeaver 7.1.2 - Metadata <pagila>        |192.168.56.1|2020-07-08 08:09:58|idle  |2020-07-08 08:10:00|Client         |ClientRead         |SELECT t.oid, t.typtypmod) as base_type_name FROM pg_catalog.pg_type t¶LEFT OUTER JOIN pg_class c ON c.oid=t.typrelid¶WHERE t.oid=$1                                                                        |client backend              |
 1675|             |         |                                         |            |2020-07-06 09:29:33|      |                   |Activity       |BgWriterHibernate  |                                                                                                                                                                                                                                                               |background writer           |
 1674|             |         |                                         |            |2020-07-06 09:29:33|      |                   |Activity       |CheckpointerMain   |                                                                                                                                                                                                                                                               |checkpointer                |
 1676|             |         |                                         |            |2020-07-06 09:29:33|      |                   |Activity       |WalWriterMain      |                                                                                                                                                                                                                                                               |walwriter                   |

查询结果不仅返回了客户端连接对应的服务器进程,也包括 PostgreSQL 服务器的各种守护进程。其中,

  • pid 代表了后台进程的 id;
  • datname 是进程连接的数据库,对于后台守护进程显示为空;
  • usename 是连接数据库使用的用户名,对于后台守护进程显示为空;
  • application_name 是连接数据库的应用程序,对于后台守护进程显示为空;
  • client_addr 是客户端的 IP 地址,对于后台守护进程或者通过 Unix 套接字连接的进程显示为空;
  • backend_start 是进程启动的时间点,对于客户端的后台进程是连接服务器的时间点;
  • state 代表了进程当前的状态,可能的取值包括 active、idle、idle in transaction、idle in transaction (aborted)、fastpath function call 以及 disabled;
  • state_change 是最后一次状态的修改时间;
  • wait_event_type 表示进程正在等待的事件类型,如果没有等待显示为空;可能的取值包括 LWLock、Lock、BufferPin、Activity、Extension、Client、IPC、Timeout 以及 IO;
  • wait_event 表示进程正在等待的事件名称,如果没有等待显示为空;
  • query 是进程最后一次执行的查询语句。对于 active 状态,显示正在执行的查询;其他状态显示上一次执行的查询;
  • backend_type 是进程的类型。

相关文章

文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,...
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb...
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才...
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation...
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgr...
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解...