如何从Postgres数据库中分离所有其他用户?


13

我需要对数据库的独占访问权。是否可以使用SQL命令从Postgres数据库中“分离”所有其他用户。或者关闭所有其他连接,然后获得独占访问权限。

这是用于单元测试,并且测试只能手动运行,因此没有危险。仅旧的无效连接将受到影响。

没有其他用户连接到这些单元测试数据库。

旧的死联系来自发展。当正在编写或失败的测试没有清除时,就会一直发生这种情况。


如果在生产环境中断开其他用户的连接后还需要将其锁定一段时间,请参阅下面的Scott Marlowe的回答:https : //dba.stackexchange.com/a/6184/2024


另请参见dba上的类似问题:如何在不停止服务器的情况下删除与特定数据库的所有连接?

Answers:


14

您可以尝试以postgres用户身份连接到数据库并运行:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )    -- 1. don't terminate your own session
    AND datname =                     -- 2. don't terminate connections to 
    (SELECT datname                   --    other databases in the cluster
       FROM pg_stat_activity
      WHERE procpid = pg_backend_pid( )
    );

更新 一个更好的查询摆脱了子选择:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );

2
不要忘记撤销CONNECT权限,否则用户将在您具有独占访问权之前创建新的连接。
Frank Heikens 2011年

@弗兰克·海肯斯-好的收获。我已经键入了“手动单元测试”,但是如果除了进行单元测试的个人之外还有其他连接,那么“从...撤消<datname>上的连接”将是必不可少的。
gsiems 2011年

在PostgreSQL 9.2中,procpid已重命名为pid,因此请当心。
Craig Ringer

除了与有问题的用户进行撤销之外,我还必须撤销..... public-需要提防的事情!
David N. Welton 2014年

在9.3上,似乎pg_stat_activity.procpid现在称为pg_stat_activity.pid。否则工作正常。
JL Peyret 2015年

4

这里的问题是双重的,首先,您需要断开这些用户的连接,其次,您需要将其保留在服务器之外。我通常不使用吊销连接权限,而是使用pg_hba.conf拒绝来自某些机器和/或用户的新连接,然后执行pg_ctl -m快速停止; pg_ctl开始删除所有当前连接。用笨拙的方式进行DDL更改非常有必要,否则您到处都会陷入僵局。


6
我总是使用一个允许CONNECT的角色,并被所有其他角色继承。撤销连接以使用此单一角色即可完成。使用pg_terminate_backend()将其包装在一个函数中,这样就可以控制何时必须停止所有当前连接。
Frank Heikens 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.