Force client disconnect using PostgreSQL
有没有办法强制客户端与PostgreSQL断开连接? 我正在寻找DB2的
我想在我的开发盒上执行此操作,因为当我打开数据库控制台时,我无法加载数据库转储。 我必须先退出他们。
杀死PostgreSQL 8.4中的空闲进程:
1 2 | SELECT procpid, (SELECT pg_terminate_backend(procpid)) AS killed FROM pg_stat_activity WHERE current_query LIKE '<IDLE>'; |
结合
这个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及更高版本中,
我认为这比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使客户端断开连接。
不像