有没有办法强制客户端与PostgreSQL断开连接?我正在寻找DB2 force application all
的等价物。
我想在我的开发盒上执行此操作,因为当我打开数据库控制台时,我无法加载数据库转储。我必须先退出他们。
答案 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
那样干净。