如何杀死我所有的postgresql连接?

我试着耙db:下降,但我得到:

ERROR:  database "database_name" is being accessed by other users
DETAIL:  There are 1 other session(s) using the database.

我尝试过关闭我从ps -ef | grep postgres中看到的进程,但这也不起作用:

kill: kill 2358 failed: operation not permitted

当前回答

远程场景。但如果你试图在rails应用程序中运行测试,你会得到

"ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR:数据库"myapp_test"正在被其他用户访问 还有另外一个会话在使用数据库。

确保在运行测试之前关闭pgAdmin或任何其他postgres GUI工具。

其他回答

只是想指出,如果一些其他后台进程正在使用数据库,哈里斯的答案可能无法工作,在我的情况下,它是延迟的工作,我做到了:

script/delayed_job stop

只有这样我才能删除/重置数据库。

可以使用pg_terminate_backend()终止连接。你必须是超级用户才能使用这个功能。这在所有操作系统上都是一样的。

SELECT 
    pg_terminate_backend(pid) 
FROM 
    pg_stat_activity 
WHERE 
    -- don't kill my own connection!
    pid <> pg_backend_pid()
    -- don't kill the connections to other databases
    AND datname = 'database_name'
    ;

在执行这个查询之前,你必须撤销CONNECT权限以避免新的连接:

REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;

如果你正在使用Postgres 8.4-9.1,请使用procpid而不是pid

SELECT 
    pg_terminate_backend(procpid) 
FROM 
    pg_stat_activity 
WHERE 
    -- don't kill my own connection!
    procpid <> pg_backend_pid()
    -- don't kill the connections to other databases
    AND datname = 'database_name'
    ;

如果你需要断开一个特定用户的会话,这有助于我:

检查当前所有连接:

select * from pg_stat_activity; 

授予你的用户一个角色(不重要):

set role "db_admin";

杀死届:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = '*** USER NAME TO DISCONNECT ***';

答案隐藏在上面的一条评论中:brew服务重新启动postgresql

MacOS,如果postgresql安装了brew:

brew services restart postgresql

删除postgresql会话/连接