项目场景:
当你尝试执行以下命令时:
sql
ALTER DATABASE target_db RENAME TO new_name;
-- 或
DROP DATABASE target_db;
PostgreSQL 会返回类似错误:
clike
ERROR: database "target_db" is being accessed by other users
DETAIL: There are 3 other sessions using the database.
这是因为当前有活动连接正在使用该数据库,PostgreSQL为了保证数据一致性,禁止在此状态下进行修改或删除操作。
解决方案:
1、查看哪些会话正在连接目标数据库。
2、逐个终止这些会话(排除当前自己的会话)。
3、重新执行重命名或删除操作。
第一步:查询当前使用该数据库的会话
连接到任意其他数据库(如 postgres 或 template1),然后执行以下查询:
sql
SELECT
pid,
usename AS username,
application_name,
client_addr AS client_ip,
backend_start AS connection_start_time,
state AS connection_state
FROM
pg_stat_activity
WHERE
datname = 'target_db';
返回:

💡 说明:
- pid 是进程ID,用于后续终止会话。
- client_ip 为 连接会话的ip。
- state 为 idle 可被终止,active终止需要慎重。但是注意不要终止当前连接会话。
第二步:终止所有连接到该数据库的会话
使用 pg_terminate_backend() 函数批量终止会话,注意排除当前会话自身(否则报错)。
sql
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'target_db'
AND pid <> pg_backend_pid(); -- pid为上一步查询的进程ID
执行后,返回结果为 t 的行表示成功终止。
逐个将pid进行终止。
验证: 再次执行第一步的查询,该pid对应的记录应该已经消失(终止会话)。
第三步:执行数据库重命名或删除操作,或者你的目标操作
此时操作应成功执行,不再报错。
通过 pg_stat_activity 定位会话 + pg_terminate_backend() 强制清理,解决 PostgreSQL 数据库重命名/删除时"被其他会话占用"的问题。此方法同样适用于修改数据库参数(如 ALTER DATABASE SET)等需要独占访问的场景。
友情提示: 本文所述操作会立即中断数据库连接,请务必备份重要数据并在测试环境验证后再用于生产库。