使用PostgreSQL强制客户端断开连接

33

有没有一种方法可以强制让客户端从PostgreSQL断开连接?我正在寻找类似于DB2的 force application all 的等价命令。

我想在我的开发环境中这样做,因为当我打开数据库控制台时,我无法加载数据库转储。我必须先退出它们。

6个回答

39

杀死 PostgreSQL 8.4 中的空闲进程:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
   WHERE current_query LIKE '<IDLE>';

在Postgres v9.1.4中运行得非常好。感谢您的见解! - JP Beaudry
19
在最新的PostgreSQL版本中:SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE state LIKE 'idle'; 的意思是查找所有空闲状态的进程,并终止它们的执行。其中,pid代表进程ID,pg_terminate_backend函数用于结束指定pid的进程。 - Mike Weller
这个可以运行...但是当pgAdmin尝试重新连接时崩溃了!回到原点 :( - kashiraja

22

2
pg_cancel_backend() 不会断开连接,它只取消当前查询。下一个查询可以在任何时候使用仍存在的旧连接进来。 - Frank Heikens

7

这个Stack Overflow的回答很好地解释了(引用自araqnid在水平线之间,然后是我):


将数据库“applogs”标记为不接受新连接:

update pg_database set datallowconn = false where datname = 'applogs';

另一个可能的方法是对客户端角色撤销对数据库的“连接”访问权限。

断开用户与数据库的连接=终止后端。因此,要从“applogs”数据库中断开所有其他用户的连接,例如:

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'applogs' and procpid <> pg_backend_pid();

一旦你完成了这两个步骤,你就是唯一连接到'applogs'的用户。虽然实际上在后端完成断开连接之前可能会有延迟?
来自MarkJL的更新:后端确实需要一段时间才能完成断开连接。
再说一遍,要注意的是,在PostgreSQL 9.2及更高版本中,procpid列已被重命名为pid
我认为这比Milen A. Radev的答案更有帮助,虽然技术上相同,但它提供了使用示例和现实生活建议。

后端断开连接肯定存在延迟。 - MarkJL

4

我发布我的答案,因为在我的脚本中无法使用它们,服务器版本为9.3:

psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';"

在下一行,您可以对“my_database_to_alter”进行任何操作。正如您所看到的,您可以从“postgres”数据库执行查询,该数据库在几乎所有postgresql安装中都存在。
对于我来说,以超级用户身份并在问题数据库之外进行操作非常完美。

1
也许应该采用更加温和的方法,但是:
for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done

0
我在邮件列表中发现了这个帖子。它建议使用SIGTERM来导致客户端断开连接。
不如db2 force application all干净。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接