4

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

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

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

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

我试图了解 phppgadmin 代码,以了解它是如何做到的。我发现了一行(Schemas.php 中的 257),上面写着:

$data->dropSchema(...)

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

任何指针将不胜感激。

4

2 回答 2

12

首先,找到所有当前使用您的数据库的进程 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';
于 2010-03-12T12:26:01.710 回答
0

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

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

于 2010-03-12T12:19:04.807 回答