我想删除当前打开的到特定PostgreSQL数据库的所有连接(会话),但不重新启动服务器或断开与其他数据库的连接。

我该怎么做? />

评论

我读过某个地方,您可以使用lowth.com/cutter实现这一目标。

#1 楼

这是我对StackOverflow上非常类似的问题的回答。

取决于您的postgresql版本,您可能会遇到一个错误,这会使pg_stat_activity忽略掉线用户的活动连接。这些连接也未在pgAdminIII内部显示。

如果您正在执行自动测试(您还将在其中创建用户),则可能是这种情况。

在这种情况下,您需要还原为以下查询:

 SELECT pg_terminate_backend(pg_stat_activity.procpid) 
 FROM pg_stat_get_activity(NULL::integer) 
 WHERE datid=(SELECT oid from pg_database where datname = 'your_database');


评论


错误:表“ pg_stat_activity”(psql(9.6.1))缺少FROM子句条目

–user1767316
17年7月19日在14:51



这不再起作用....得到上述错误^

–轻巧
17年12月6日在18:25

这对我有用,@ Szymon Guz的解决方案现在应该是公认的答案:从pg_stat_activity中选择pg_terminate_backend(pid),其中datname ='DB_NAME';

–克里斯
20-4-26下午14:53

#2 楼

这样的查询应该有帮助(假设数据库名为“ db”):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';


pid以前称为procpid,因此,如果您使用的是低于9.2的postgres您可以尝试以下操作:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';


但是您必须是超级用户才能断开其他用户的连接。

它也可能对REVOKE CONNECT ON DATABASE FROM PUBLIC或类似的东西很有用,然后在随后对它进行GRANT

#3 楼

这可以用来从客户端连接中“释放”数据库,以便例如您可以重命名它:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;


请注意,这可能会导致您的行为出现问题。客户端应用。实际上,不应因使用事务而破坏数据。