代码之家  ›  专栏  ›  技术社区  ›  Konrad Garus

PostgreSQL:暂时禁用连接

  •  19
  • Konrad Garus  · 技术社区  · 14 年前

    我在PostgreSQL中有一个脚本,每天晚上从dump恢复测试数据库。应用程序服务器和进程通过连接池访问数据库,连接池使一些连接始终处于活动状态。

    my_temp_database . 那么它应该重新命名 my_database my_old_database , 我的临时数据库 我的\u数据库 我的旧数据库 .

    如何断开所有客户端的连接(无论是否是超级用户) ,以便可以重命名?如何临时阻止它们重新连接?

    4 回复  |  直到 14 年前
        1
  •  34
  •   araqnid    14 年前

    要将数据库“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();
    

        2
  •  12
  •   Kuberchaun    13 年前

    终止当前活动连接后,还可以发出此命令,该命令只允许超级用户登录。这假设所有超级用户仍然可以访问。希望你不要把超级用户的权限交给任何人。

    ALTER DATABASE your_db CONNECTION LIMIT 0;
    
        3
  •  8
  •   Zorg    7 年前

    从PostgreSQL 9.5开始,我们终于可以:

    ALTER DATABASE db WITH ALLOW_CONNECTIONS false;
    
        4
  •  2
  •   mivk    9 年前

    我有一个不同的使用场景,在这个场景中,我想为每个人(包括超级用户)禁用一个DB,并且永远禁用它,但现在还不能简单地删除它,以便在需要时能够快速地重新激活它。

    这在一个旧的8.3 Postgres上运行良好:

    UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name';
    
        5
  •  0
  •   sol    4 年前

    如果您在会话中连接到要禁止连接的DB,并且在禁止连接后仍在同一会话中保持连接,请使用以下方法:

    UPDATE pg_database SET datallowconn = false WHERE datname = '_db_name_' ;
    

    ... 在重新启用之前,它允许您在不发生任何其他连接的情况下进行操作

    但如果您使用它,它必须来自另一个数据库中的会话:

    ALTER DATABASE _db_name_ WITH ALLOW_CONNECTIONS false ;