每当我尝试删除数据库,我得到以下错误:

ERROR:  database "pilot" is being accessed by other users
DETAIL:  There is 1 other session using the database.

当我使用:

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB';

我终止了来自该数据库的连接,但如果我试图在此之后删除数据库,则有人以某种方式自动连接到该数据库并给出此错误。那是什么? 除了我,没人用这个数据库。


当前回答

REVOKE CONNECT将不阻止来自db所有者或超级用户的连接。因此,如果您不希望任何人连接db, follow命令可能会有用。

alter database pilot allow_connections = off;

然后使用:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'pilot';

其他回答

Postgresql12

流行的回答对我没有帮助。

对我来说一个不明显的解决方案:如果使用kafka/rabbit,在DROP TABLE之前禁用管理器

sudo service supervisor stop

只需检查连接是什么,它来自哪里。你可以看到这些:

SELECT * FROM pg_stat_activity WHERE datname = 'TARGET_DB';

也许这是你们之间的联系?

你可以阻止未来连接:

REVOKE CONNECT ON DATABASE thedb FROM public;

(可能还有其他用户/角色;查看psql中的\l+

然后你可以终止所有到这个db的连接,除了你自己的:

SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = current_database() AND pid <> pg_backend_pid();

在旧版本中,pid被称为procpid,所以你必须处理这个问题。

既然您已经撤销了CONNECT权限,那么试图自动连接的任何程序都不能再这样做了。

现在可以删除DB了。

如果您使用超级用户连接进行正常操作,这将不起作用,但如果您正在这样做,则需要首先解决这个问题。


删除数据库后,如果再次创建数据库,可以执行以下命令恢复访问

GRANT CONNECT ON DATABASE thedb TO public;

在macOS中尝试通过控制台使用以下命令重新启动postgresql数据库:

brew services restart postgresql

我找到了这个问题的解决方案,尝试在终端运行这个命令

ps -ef | grep postgres

使用此命令终止进程

sudo kill -9 PID