Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

53.4. PostgreSQL 系统状态与管理

53.4.1. 查看配置文件位置

		
postgres=# SHOW config_file;
                  config_file                  
-----------------------------------------------
 /var/lib/postgresql/18/docker/postgresql.conf
(1 row)
		
			

53.4.2. 连接数

		
[root@development ~]# docker exec -it postgres psql -h 127.0.0.1 -U postgres
psql (18.3 (Debian 18.3-1.pgdg13+1))
Type "help" for help.

postgres=# SHOW max_connections;
 max_connections 
-----------------
 100
(1 row)		
		
			

连接数/使用率

		
postgres=# SELECT
  current_setting('max_connections')::int AS max_conn,
  count(*) AS current_conn,
  round(count(*)::numeric / current_setting('max_connections')::numeric * 100, 1) AS usage_pct
FROM pg_stat_activity;
 max_conn | current_conn | usage_pct 
----------+--------------+-----------
      100 |           58 |      58.0
(1 row)
		
			

按用户/库连接数

		
SELECT datname, usename, count(*) FROM pg_stat_activity GROUP BY 1,2;
		
			

长事务

		
SELECT pid, datname, usename, now() - xact_start AS xact_duration, query
FROM pg_stat_activity
WHERE state = 'idle in transaction'
ORDER BY xact_duration DESC;
		
			

53.4.3. 查看总连接数

查看当前总连接数,可使用如下SQL语句:

		
SELECT COUNT(*) AS total_connections FROM pg_stat_activity;		
		
			

查看连接状态分布

		
连接状态通常包括active(活跃)、idle(空闲)、idle in transaction(事务中空闲)等。可通过以下SQL统计各类连接状态:
SELECT state, COUNT(*) AS count FROM pg_stat_activity GROUP BY state;

State	描述
active	当前正在执行SQL语句
idle	连接空闲,未执行任何操作
idle in transaction	连接处于事务中但未执行任何操作
fastpath function call	使用快速路径调用函数		
		
			

53.4.4. 杀掉空闲超久的连接

		
-- 空闲 > 5 分钟的连接
SELECT pid, datname, usename, state, query_start, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'idle' AND now() - query_start > interval '5 min'
ORDER BY duration DESC;

-- 执行终止(替换 PID)
SELECT pg_terminate_backend(PID);
		
			

53.4.5. 杀掉长事务 / 锁等待

		
-- 运行超过 1 分钟的活跃查询
SELECT pid, datname, usename, state, query, now() - query_start AS duration
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction')
  AND now() - query_start > interval '1 min'
ORDER BY duration DESC;

-- 终止
SELECT pg_terminate_backend(PID);
		
			

53.4.6. pg_available_extensions

		
SELECT * FROM pg_available_extensions;			
		
			
		
postgres=# SELECT * FROM pg_available_extensions;
  name   | default_version | installed_version |           comment
---------+-----------------+-------------------+------------------------------
 plpgsql | 1.0             | 1.0               | PL/pgSQL procedural language
(1 row)
		
			

53.4.7. pg_shadow

		
postgres=# SELECT * FROM pg_shadow;
 usename  | usesysid | usecreatedb | usesuper | usecatupd | userepl |               passwd                | valuntil | useconfig
----------+----------+-------------+----------+-----------+---------+-------------------------------------+----------+-----------
 postgres |       10 | t           | t        | t         | t       |                                     |          |
 wechat   |    16385 | f           | f        | f         | f       | md55bf335eef50073dbc3a4a2103e7b3757 |          |
 test     |    16387 | f           | f        | f         | f       | md505a671c66aefea124cc08b76ea6d30bb |          |
 dba      |    16384 | t           | t        | t         | f       | md5a1453e5a69943d1674eb2f7100efa04c |          |
(4 rows)