phppgadmin:它如何帮助用户摆脱postgres,所以它可以db_drop?

时间:2010-03-12 12:09:51

标签: php postgresql phppgadmin

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

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

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

Phppgadmin似乎做了我想做的事情:我能够使用其网络界面删除模式,即使网站已开启,也不会出错。所以我正在研究它的代码是如何工作的。但是,我不是PHP专家。

我正在尝试了解phppgadmin代码以了解它是如何做到的。我发现了a line(在Schemas.php中为257),其中说:

$data->dropSchema(...)

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

任何指针都会非常感激。

2 个答案:

答案 0 :(得分:12)

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

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';

答案 1 :(得分:0)

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

请参阅: http://www.postgresql.org/docs/current/static/sql-lock.html