代码之家  ›  专栏  ›  技术社区  ›  kikito

phppgadmin:它是如何将用户从Postgres中踢出的,这样它就可以让db下降?

  •  4
  • kikito  · 技术社区  · 15 年前

    我有一个posgresql数据库(我是所有者),我想删除它,然后从一个转储文件中重新创建它。

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

    我已经读过一种可能性,那就是获取涉及到的进程的pid并逐个杀死它们。如果可能的话,我想做些更干净的事情。

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

    我试图理解phppgadmin代码,以了解它是如何做到的。我发现了 a line (在schemas.php中是257),其中表示:

    $data->dropSchema(...)
    

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

    任何指点都会非常感激。

    2 回复  |  直到 12 年前
        1
  •  12
  •   deceze    12 年前

    首先,使用数据库查找所有当前的procesid:

    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';
    
        2
  •  0
  •   Frank Heikens    12 年前

    不确定PostgreSQL,但我认为一个可能的解决方案是锁定表,这样其他进程在试图访问它时就会失败。

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