Postgresql - 由于一些自动连接到数据库的原因,无法删除数据库。

10 浏览
0 Comments

Postgresql - 由于一些自动连接到数据库的原因,无法删除数据库。

每当我尝试删除数据库时,我都会遇到以下错误:

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

我终止了该数据库的连接,但如果我在那之后尝试删除数据库,某种方式会自动连接到那个数据库并给出这个错误。是什么在做这个呢?

除我之外没有人使用这个数据库。

admin 更改状态以发布 2023年5月22日
0
0 Comments

每当我尝试删除数据库时,我都会收到以下提示:

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

首先需要撤消权限

REVOKE CONNECT ON DATABASE TARGET_DB FROM public;

然后使用以下命令:

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

它一定会起作用。

0
0 Comments

Postgres 13+

使用 WITH (force)

参见https://stackoverflow.com/a/68982312/398670

Postgres 12及更早版本

您可以通过以下方式阻止未来的连接:

REVOKE CONNECT ON DATABASE thedb FROM public;

(以及可能的其他用户/角色;在psql中查看\l+)

然后,您可以终止除自己之外的所有连接到此数据库:

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

在旧版本中,pid称为procpid,所以您需要处理这个问题。

由于已经吊销了CONNECT权限,任何尝试自动连接的东西现在都不能这样做了。

您现在就可以删除数据库了。

如果您正在为正常操作使用超级用户连接,则此方法不适用,但是如果您正在这样做,则需要先解决该问题。


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

GRANT CONNECT ON DATABASE thedb TO public;

0