【问题标题】:PostgreSQL: Temporarily disable connectionsPostgreSQL:暂时禁用连接
【发布时间】:2011-03-12 05:54:24
【问题描述】:

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

因此脚本将转储恢复到my_temp_database。然后它应该将my_database重命名为my_old_database,将my_temp_database重命名为my_database,并最终删除my_old_database

如何断开所有客户端(无论是否为超级用户)与 my_database 的连接,以便对其进行重命名?我怎样才能暂时阻止他们重新连接?

有没有更好的方法来做我需要的事情?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    将数据库“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”的用户。尽管在后端真正完成断开连接之前实际上可能存在延迟?

    【讨论】:

    • 在8.3你可以试试select pg_terminate_backend(pid) from pg_stat_activity;
    • @araqnid 命令“更新 pg_database set datallowconn = false where datname = 'applogs';”奇迹般有效! “REVOKE CONNECT ON DATABASE”对我不起作用!向上!向上!向上!向上!向上!起来!
    【解决方案2】:

    终止当前活动连接后,您还可以发出仅允许超级用户登录的命令。这假设您可以接受所有超级用户仍然可以访问。希望您不要将超级用户权限授予任何人。

    ALTER DATABASE your_db CONNECTION LIMIT 0;
    

    【讨论】:

      【解决方案3】:

      启动 PostgreSQL 9.5 我们终于可以:

      ALTER DATABASE db WITH ALLOW_CONNECTIONS false;
      

      【讨论】:

      • 尝试使用此方法,但仅当相关数据库不是您连接的数据库并且执行命令的用户是数据库(或 su)的所有者时才有效。
      • 听起来合乎逻辑
      【解决方案4】:

      我有一个不同的使用场景,我想永久禁用每个人(包括超级用户)的数据库,但还没有明确地删除它,以便能够在需要时快速重新激活它。

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

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

      【讨论】:

        【解决方案5】:

        如果您在会话中与要禁止连接的数据库连接,并且在您禁止连接后仍保持在同一会话中连接,则使用此:

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

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

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

        ALTER DATABASE _db_name_ WITH ALLOW_CONNECTIONS false ;
        

        ((我意识到这几乎是上面答案的总结))

        【讨论】:

          猜你喜欢
          • 2011-07-19
          • 2016-09-27
          • 1970-01-01
          • 2012-12-25
          • 2014-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多