我有一个Posgresql数据库(我是所有者),我想放弃它并从转储中重新创建它。
问题是,有几个应用程序(两个网站,rails和perl)定期访问数据库。所以我得到“其他用户正在访问数据库”错误。
我已经读过一种可能性是获取所涉及的过程的pid并单独杀死它们。如果可能的话,我想做一些更清洁的事情。
Phppgadmin似乎做了我想做的事情:我能够使用其网络界面删除模式,即使网站已开启,也不会出错。所以我正在研究它的代码是如何工作的。但是,我不是PHP专家。
我正在尝试了解phppgadmin代码以了解它是如何做到的。我发现了a line(在Schemas.php中为257),其中说:
$data->dropSchema(...)
$data
是一个全局变量,我无法找到它的定义位置。
任何指针都会非常感激。
答案 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