【问题标题】:Force client disconnect using PostgreSQL使用 PostgreSQL 强制客户端断开连接
【发布时间】:2009-04-07 19:12:06
【问题描述】:

有没有办法强制客户端与 PostgreSQL 断开连接?我正在寻找 DB2 的 force application all 的等效项。

我想在我的开发机器上执行此操作,因为当我打开数据库控制台时,我无法加载数据库转储。我得先戒掉他们。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    杀死 PostgreSQL 8.4 中的空闲进程:

    SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
       WHERE current_query LIKE '<IDLE>';
    

    【讨论】:

    • 在 Postgres v9.1.4 中就像一个魅力。感谢您的见解!
    • 在最新的 postgres 版本上:SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE state LIKE 'idle';
    • 这行得通...除了 pgAdmin 在尝试重新连接时崩溃!回到广场一:(
    【解决方案2】:

    结合pg_terminate_backend 函数和pg_stat_activity 系统视图。

    【讨论】:

    • pg_cancel_backend() 不会断开连接,它只会取消当前查询。下一个查询可以随时使用仍然存在的旧连接。
    【解决方案3】:

    This SO answer精美解释(横线之间araqnid全文引用,然后是我):


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


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

    再说一遍:话虽如此,请注意 procpid 列在 PostgreSQL 9.2 及更高版本中已重命名为 pid

    我认为这比 Milen A. Radev 的回答更有帮助,虽然技术上相同,但没有提供使用示例和实际建议。

    【讨论】:

    • 后端断线肯定有延迟。
    【解决方案4】:

    我发布我的答案是因为我无法在我的脚本服务器 9.3 中使用它们中的任何一个:

    psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';"
    

    在下一行,你可以用“my_database_to_alter”做任何你想做的事情。如您所见,您从“postgres”数据库执行查询,该数据库几乎存在于每个 postgresql 安装中。

    由超级用户在问题数据库之外进行操作对我来说非常完美。

    【讨论】:

      【解决方案5】:

      可能应该使用更严厉的方法,但是:

      for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done
      

      【讨论】:

        【解决方案6】:

        我在邮件列表中找到了this thread。它建议使用 SIGTERM 使客户端断开连接。

        不如db2 force application all干净。

        【讨论】:

          猜你喜欢
          • 2017-05-26
          • 2014-01-09
          • 2011-06-30
          • 2010-11-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-17
          相关资源
          最近更新 更多