每当我尝试删除数据库,我得到以下错误:
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 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;