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

mit*_*mit 16 postgresql

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

这是用于单元测试,并且测试仅手动运行,因此不涉及危险。只有旧的死连接会受到影响。

没有其他用户连接到这些 un​​ittest 数据库。

旧的死联系来自发展。当正在编写或失败的测试没有退出干净时,这种情况总是发生。


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


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

gsi*_*ems 17

您可以尝试以 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( )
    );
Run Code Online (Sandbox Code Playgroud)

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

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记撤销 CONNECT 权限,否则用户在您拥有独占访问权限之前会创建新的连接。 (2认同)
  • 在 PostgreSQL 9.2 中,`procpid` 被重命名为 `pid`,所以要注意这一点。 (2认同)