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

时间:2009-04-07 19:12:07

标签: postgresql

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

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

6 个答案:

答案 0 :(得分:36)

杀死PostgreSQL 8.4中的空闲进程:

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

答案 1 :(得分:20)

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

答案 2 :(得分:5)

This SO answer精美地解释(水平规则之间araqnid的完整引用,然后我再次说明):


标记数据库&#39; applogs&#39;因为不接受新的联系:

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

另一种可能性是撤销&#39; connect&#39;在数据库上访问客户端角色。

断开用户与database = kill后端的连接。所以要断开所有其他用户与#34; applogs&#34;数据库,例如:

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

完成这两项操作后,您就是唯一连接到&#39; applogs&#39;的用户。虽然在后端实际完成断开连接之前可能会有延迟?


MarkJL更新:在后端完成断开连接之前确实存在延迟。

现在我再说一遍:请注意,在PostgreSQL 9.2及更高版本中,procpid列已重命名为pid

我认为这比Milen A. Radev的答案更有帮助,Milen A. Radev虽然技术上相同,却没有附带用法示例和现实生活中的建议。

答案 3 :(得分: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安装中。

超级用户和问题数据库之外的做法本身对我来说非常适合。

答案 4 :(得分:1)

然后应该使用更加严厉的方法,但是:

for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done

答案 5 :(得分:0)

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

不像db2 force application all那样干净。