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

Force client disconnect using PostgreSQL

有没有办法强制客户端与PostgreSQL断开连接? 我正在寻找DB2的force application all的等价物。

我想在我的开发盒上执行此操作,因为当我打开数据库控制台时,我无法加载数据库转储。 我必须先退出他们。


杀死PostgreSQL 8.4中的空闲进程:

1
2
SELECT procpid, (SELECT pg_terminate_backend(procpid)) AS killed FROM pg_stat_activity
   WHERE current_query LIKE '<IDLE>';


结合pg_terminate_backend功能和pg_stat_activity系统视图。


这个SO答案精美地解释了(完全引用了araqnid之间的横向规则,然后我再次):

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

1
UPDATE pg_database SET datallowconn = FALSE WHERE datname = 'applogs';

另一种可能性是撤消数据库中对客户端角色的"连接"访问。

断开用户与database = kill后端的连接。因此,要将所有其他用户与"applogs"数据库断开连接,例如:

1
2
3
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的答案更有帮助,Milen A. Radev虽然在技术上是相同的,但没有提供使用示例和现实生活中的建议。


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

1
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

我在邮件列表上找到了这个帖子。它建议使用SIGTERM使客户端断开连接。

不像db2 force application all那样干净。