文章目录
大家好,我是只谈技术不剪发的 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=$1 ¶ORDER 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 是进程的类型。
原文地址:https://tonydong.blog.csdn.net
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。