【发布时间】:2009-04-07 19:12:06
【问题描述】:
有没有办法强制客户端与 PostgreSQL 断开连接?我正在寻找 DB2 的 force application all 的等效项。
我想在我的开发机器上执行此操作,因为当我打开数据库控制台时,我无法加载数据库转储。我得先戒掉他们。
【问题讨论】:
标签: postgresql
有没有办法强制客户端与 PostgreSQL 断开连接?我正在寻找 DB2 的 force application all 的等效项。
我想在我的开发机器上执行此操作,因为当我打开数据库控制台时,我无法加载数据库转储。我得先戒掉他们。
【问题讨论】:
标签: postgresql
杀死 PostgreSQL 8.4 中的空闲进程:
SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
WHERE current_query LIKE '<IDLE>';
【讨论】:
SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE state LIKE 'idle';
结合pg_terminate_backend 函数和pg_stat_activity 系统视图。
【讨论】:
This SO answer精美解释(横线之间araqnid全文引用,然后是我):
将数据库“applogs”标记为不接受新连接:
update pg_database set datallowconn = false where datname = 'applogs';
另一种可能性是撤销客户端角色对数据库的“连接”访问权限。
断开用户与数据库的连接 = 终止后端。因此,要断开所有其他用户与“applogs”数据库的连接,例如:
select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'applogs' and procpid <> pg_backend_pid();
完成这两项操作后,您就是唯一连接到“applogs”的用户。尽管在后端真正完成断开连接之前实际上可能存在延迟?
来自MarkJL 的更新:在后端完成断开连接之前确实存在延迟。
再说一遍:话虽如此,请注意 procpid 列在 PostgreSQL 9.2 及更高版本中已重命名为 pid。
我认为这比 Milen A. Radev 的回答更有帮助,虽然技术上相同,但没有提供使用示例和实际建议。
【讨论】:
我发布我的答案是因为我无法在我的脚本服务器 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 安装中。
由超级用户在问题数据库之外进行操作对我来说非常完美。
【讨论】:
可能应该使用更严厉的方法,但是:
for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done
【讨论】:
我在邮件列表中找到了this thread。它建议使用 SIGTERM 使客户端断开连接。
不如db2 force application all干净。
【讨论】: