Postgres 删除数据库错误: pq: 不能删除当前打开的数据库

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

pq: cannot drop the currently open database

如果必须关闭连接,我真的不明白要如何删除数据库,因为那样我就不能使用 dbConn 了。执行我的 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()
}

我想我可以连接到一个不同的数据库,然后在那个连接上执行它,但我甚至不确定这是否可行,而且只是为了删除一个不同的数据库而不得不连接到一个新的数据库看起来真的很奇怪。有什么想法吗?谢谢。

139243 次浏览

因为,您正在尝试在数据库上执行 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命令。

所有这些对我来说都不起作用,因为我试图通过 pgAdmin 做到这一点,它保持数据库连接打开,只要我删除它们。

解决方案:

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

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

dbdrop yourdatabase

在此之后,您可能仍然会在 pgAdmin 中看到数据库,但是现在您只需右键单击和 DELETE/DROP选项就可以删除它。

如果在 IntelliJ 中遇到此问题,请将模式更改为 postgres,下拉列表如下。

在那之后,我可以放弃一个分贝。

enter image description here

我在 Windows10中使用 PostgreSQL12和 pgAdmin-4。我必须使用上述答案的组合来删除一个数据库,我无法在 pgAdmin 中删除这个数据库,因为我无法在 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,它就消失了。

我的桌子结构:

资料库
Postgres 傻瓜1
Fo2
Fo3
Foo4
Fo5

打开时,数据库 foo2\c foo2然后 \dt-我可以查看数据库表下的数据库 foo2

当检查数据库后,我不需要再次使用数据库,所以我需要用 DROP DATABASE foo2删除数据库。

我得到了上面的错误,接下来的问题是。

删除数据库:

\c postgres

然后 DROP DATABASE foo2成功了

可以使用 DROP DATABASE mydb WITH (FORCE)强制删除数据库

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

只需使用 c db _ name 连接到另一个数据库; 然后使用数据库 db _ name 删除所需的数据库;

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

将连接切换到其他数据库,然后删除所需的数据库。