【问题标题】:phppgadmin : How does it kick users out of postgres, so it can db_drop?phppgadmin:它是如何将用户踢出 postgres 的,所以它可以 db_drop?
【发布时间】:2010-03-12 12:09:50
【问题描述】:

我有一个 Posgresql 数据库(我是所有者),我想删除它并从转储中重新创建它。

问题是,有几个应用程序(两个网站,rails 和 perl)定期访问数据库。所以我得到一个“其他用户正在访问数据库”错误。

我读过一种可能性是获取所涉及进程的 pid 并单独杀死它们。如果可能的话,我想做一些更清洁的事情。

Phppgadmin 似乎在做我想做的事:我可以使用其 Web 界面删除模式,即使网站处于打开状态,也不会出错。所以我正在研究它的代码是如何工作的。但是,我不是 PHP 专家。

我正在尝试理解 phppgadmin 代码以了解它是如何工作的。我发现a line(Schemas.php 中的 257)在哪里写着:

$data->dropSchema(...)

$data 是一个全局变量,我找不到它的定义位置。

任何指针将不胜感激。

【问题讨论】:

    标签: php postgresql phppgadmin


    【解决方案1】:

    首先,找到所有当前使用您的数据库的进程 ID:

    SELECT usename, procpid FROM pg_stat_activity WHERE datname = current_database();
    

    其次,杀掉你不想要的进程:

    SELECT pg_terminate_backend(your_procpid);
    

    这适用于版本 8.4,否则 pg_terminate_backend() 是未知的,您必须在操作系统级别终止该进程。


    要快速删除连接到给定数据库的所有连接,此快捷方式效果很好。必须以超级用户身份运行:

    SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='YourDB';
    

    在较新的 Postgres 版本(至少 9.2+,可能更早)上,列名已更改,查询为:

    SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='YourDB';
    

    【讨论】:

    • 我不知道 pg_terminate_backend。听起来当然是最好的解决方案。我会接受这是最好的问题,并在另一个答案中发布我的进步。谢谢!
    • 好吧,原来我使用的是 Pg 8.3.9 :/ 。我最终杀死了进程(使用 sudo 和所有东西)......有点乱,但它有效。还是谢谢。
    【解决方案2】:

    不确定 PostgreSQL,但我认为可能的解决方案是锁定表,以便其他进程在尝试访问它时会失败。

    见: http://www.postgresql.org/docs/current/static/sql-lock.html

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2021-01-15
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      相关资源
      最近更新 更多