Postgres删除数据库错误:pq:无法删除当前正在使用的数据库。

91
我试图这样删除我当前连接的数据库,但是我得到了这个错误:

我正在尝试删除我当前连接的数据库,但是我遇到了这个错误:

pq: cannot drop the currently open database

如果我必须关闭连接,那么我真的不明白如何能够删除数据库,因为这样我似乎无法使用dbConn.Exec来执行我的DROP DATABASE语句。

dbConn *sql.DB

func stuff() error {
  _, err := dbConn.Exec(fmt.Sprintf(`DROP DATABASE %s;`, dbName))
  if err != nil {
    return err
  }

  return dbConn.Close()
}

我想我可以连接到一个不同的数据库,然后在该连接上执行它,但我甚至不确定这样是否有效,而且好像必须连接到新的数据库才能删除不同的数据库,这看起来很奇怪。有什么想法吗?谢谢。

9个回答

84
因为您正在尝试在已经打开连接的数据库上执行“dropDb”命令。
根据postgres文档,您不能连接到即将删除的数据库。相反,连接到template1或任何其他数据库,然后再次运行此命令。
这是有道理的,因为当您删除整个数据库时,所有引用该数据库的打开连接都变得无效。因此,推荐的方法是连接到不同的数据库,然后再次执行此命令。
如果您面临的情况是,不同的客户端连接到数据库,而您确实想要删除数据库,则可以强制断开所有与该特定数据库相关的客户端连接。
例如,要强制从数据库“mydb”断开所有客户端:
如果PostgreSQL < 9.2: SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'mydb'; 否则: SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb'; 请注意:此命令需要超级用户权限。
然后,您可以连接到不同的数据库,并再次运行“dropDb”命令。

3
自9.2版本起,需要使用pid替换procpid。 SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb'; - t_io
2
自从PostgreSQL 13以来,您可以使用DROP DATABASE mydb WITH (FORCE);代替。 - Lord Elrond
1
@LordElrondpsql (13.3 (Debian 13.3-1.pgdg100+1)) 键入“help”获取帮助。dbname=# drop database dbname with (force); 错误:无法删除当前打开的数据库 dbname=# - Eugene Gr. Philippov
1
@EugeneGr.Philippov,你仍然需要切换到另一个数据库连接。 - Lord Elrond
如果你不是所有者,就无法删除数据库。 - Thomas
显示剩余2条评论

47
如果您在IntelliJ中遇到了这个问题,可以通过下拉菜单更改模式为postgres。
之后,您就能够删除数据库了。
参考以下截图:enter image description here

19

删除数据库:

\c postgres

然后使用DROP DATABASE your_database命令即可。


直截了当地回答问题,简单解决问题而不多说废话,我批准。 - raphael.oester

7

我正在使用Windows 10上的PostgreSQL 12和pgAdmin-4。为了删除一个数据库,我不得不使用以上答案的组合,因为我无法在pgAdmin中删除该数据库,因为我无法关闭所有打开的连接。

关闭pgAdmin-4。

在Windows命令行中,假设我的服务器名称为postgres,我的数据库名称为mydb:

C:\> psql -U postgres

我用服务器密码登录。

然后关闭了所有已打开的连接到mydb的连接:

postgres-# SELECT * FROM pg_stat_activity WHERE pg_stat_activity.datname='mydb';
postgres-# SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb';

最终,我成功地删除了mydb:

postgres-# DROP DATABASE mydb;

现在,如果我回到pgAdmin-4,它已经消失了。

5

使用 \c 数据库名称 连接到另一个数据库,然后使用 drop database 数据库名称; 删除所需的数据库。


你的答案可以通过提供更多支持性信息来改进。请点击[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。你可以在帮助中心找到有关如何撰写良好答案的更多信息。 - Community

4
很简单,只需连接到另一个数据库\c database2。 连接到该数据库后执行删除数据库命令即可。

3

如果您正在使用DBeaver,请确保没有连接到您想要删除的数据库。请转到编辑连接并查看数据库名称。

切换到其他数据库连接,然后再删除您想要的数据库。


1

由于我试图通过pgAdmin进行操作,但是它会在我删除数据库连接时保持连接不断开,所以这些方法对我都不起作用。

解决方案:

C:\Program Files\PostgreSQL\11\scripts\runpsql.bat

在提供正确信息后,您将能够获得pg命令提示符,这里您只需键入:

dbdrop yourdatabase

之后你可能仍然可以在pgAdmin中看到数据库,但现在你可以通过右键点击并选择DELETE/DROP选项来简单地删除它。


-1

您可以通过以下命令强制删除数据库:DROP DATABASE mydb WITH (FORCE)


10
这仍然给我一个“ERROR: cannot drop the currently open database”的错误。 - Mark
1
我的数据库仍然存在。 - Baris Senyerli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接