如何在不停止服务器的情况下删除与特定数据库的所有连接?


45

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

我怎样才能做到这一点?


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

Answers:


22

这是我对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');

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

4
这不再起作用了。...得到上面的错误^
轻量级,

请参见下面的答案,Szymon
Guz

子句缺失,不起作用
Vipul

78

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

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

pid过去称为procpid,因此,如果您使用的Postgres版本高于9.2,则可以尝试以下操作:

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;

请注意,这可能会导致客户端应用程序出现问题。实际上,不应由于使用事务而破坏数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.