Postgresql - 由于一些自动连接到数据库的原因,无法删除数据库。
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日
每当我尝试删除数据库时,我都会收到以下提示:
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';
它一定会起作用。
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;