如果有活动的连接,如何删除一个PostgreSQL数据库?
如果有活动的连接,如何删除一个PostgreSQL数据库?
我需要编写一个脚本来删除 PostgreSQL 数据库。它可能有很多连接,但是脚本应该忽略它们。
当存在打开的连接时,标准的 DROP DATABASE db_name
查询无法工作。
我该如何解决这个问题?
admin 更改状态以发布 2023年5月22日
在PostgreSQL 9.2及以上版本中,要从连接的数据库中断除您的会话外的所有内容:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid();
在旧版本中,操作相同,只需将pid
改为procpid
。要从不同的数据库断开连接,只需将current_database()
改为您要从中断用户的数据库名称。
您可能需要在断开用户连接之前从数据库用户中REVOKE
CONNECT
权限,否则用户将继续重新连接,您将永远没有机会删除数据库。请参见此评论及其相关的问题如何从数据库中断开所有其他用户的连接。
如果您只想断开空闲用户,请参见这个问题。
这将断开除你以外的现有的所有连接:
查询 pg_stat_activity
并获取你想要终止的进程id,然后向它们发出 SELECT pg_terminate_backend(pid int)
命令。
PostgreSQL 9.2 及以上版本:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB AND pid <> pg_backend_pid();
PostgreSQL 9.1 及以下版本:
SELECT pg_terminate_backend(pg_stat_activity.procpid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB AND procpid <> pg_backend_pid();
一旦你断开了所有人的连接,你将需要从另一个数据库的连接中断开并发出 DROP DATABASE 命令,这个数据库不能是你尝试删除的数据库。
注意将 procpid
列的重命名为 pid
。请参阅 这个邮件列表线程。