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

Luk*_*ncl 30 postgresql

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

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

bon*_*iii 36

杀死PostgreSQL 8.4中的空闲进程:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
   WHERE current_query LIKE '<IDLE>';
Run Code Online (Sandbox Code Playgroud)

  • 在最新的postgres版本中:`SELECT pid,(SELECT pg_terminate_backend(pid))从pg_stat_activity中被杀死WHERE状态LIKE'idle';` (15认同)

Mil*_*dev 20

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

  • pg_cancel_backend()不会断开连接,它只取消当前查询.下一个查询可以使用仍然存在的相同旧连接随时进入. (2认同)

mir*_*los 5

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


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

update pg_database set datallowconn = false where datname = 'applogs';
Run Code Online (Sandbox Code Playgroud)

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

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

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'applogs' and procpid <> pg_backend_pid();
Run Code Online (Sandbox Code Playgroud)

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


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

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

我认为这比Milen A. Radev的答案更有帮助,Milen A. Radev虽然在技术上是相同的,但没有提供使用示例和现实生活中的建议.