如何通过命令行删除PostgreSQL数据库

403

我正在尝试通过命令行删除我的数据库并创建一个新的。我使用psql -U用户名登录,然后执行\connect template1,接着是DROP DATABASE databasename;

我收到了以下错误信息:

数据库databasename正在被其他用户访问

我关闭了Apache并再次尝试,但仍然出现此错误。我做错了什么吗?


3
如果只从命令行运行dropdb databasename命令会发生什么? - Dylan Markow
1
它说:“错误:无法删除当前打开的数据库”。 - iman453
4
请使用命令 psql -U <user> -c "drop database protodb" (不需要输入数据库名称)来删除数据库。 - user
3
这将重新启动Postgres并断开所有连接: sudo service postgresql restart 然后执行以下操作: dropdb -h localhost -p 5432 -U "youruser" "testdb" 请注意使用 "" 以确保特殊字符能够正确输入。 - unom
3
删除数据库 <database_name>,不要忘记逗号。 - Sandip Subedi
显示剩余2条评论
4个回答

572
您可以从命令行运行dropdb命令:
dropdb 'database name'

请注意,您必须是超级用户或数据库所有者才能删除它。

您还可以检查pg_stat_activity视图,查看当前正在针对您的数据库执行哪种类型的活动,包括所有空闲进程。

SELECT * FROM pg_stat_activity WHERE datname='database name';

请注意,从PostgreSQL v13开始,您可以使用以下方法自动断开用户:

DROP DATABASE dbname WITH (FORCE);
或者
dropdb -f dbname

3
我正在使用 dropuser 命令来删除用户。 - pl1nk
6
对于版本9来说,这个回答没有帮助。关于打开连接的错误仍然存在。 - Pavel Vlasov
4
这将重新启动postgres并断开所有连接: sudo service postgresql restart 然后执行以下操作: dropdb -h localhost -p 5432 -U "youruser" "testdb" 注意使用 "" 确保特殊字符无误地输入。 - unom
2
使用postgres用户:sudo -u postgres dropdb '数据库名称' - leszek.hanusz
输入\l可以查看您拥有的所有数据库。 - Sandip Subedi
创建一个不同于正在删除的数据库的连接,然后执行以下操作: DROP DATABASE dbname WITH (FORCE); 这完全解决了问题!!! - DanielV

131

12
必须稍作修改才能运行:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase'; 翻译成中文是:"必须稍作修改才能执行:在datname='YourDatabase'的pg_stat_activity中选择pg_terminate_backend(pid)" - mrt
Amazon RDS Postgres 9.6实例中的列“procpid”不存在。 - fIwJlxSzApHEZIl
嗯,我运行了这个程序,但它立即重新连接了,然后显示“SSL连接意外关闭[...]尝试重置:成功”。然后,我又回来了。 - mlissner

83

试试这个。注意没有指定数据库 - 它只是在“服务器”上运行。

psql -U postgres -c "drop database databasename"
如果那行不通,我曾经看到过PostgreSQL会保留孤立的预处理语句的问题。要清理它们,请执行以下操作:
SELECT * FROM pg_prepared_xacts;

那么对于每个id,运行以下代码:

ROLLBACK PREPARED '<id>';

2
对于postgresql来说,不存在仅仅“在服务器上”的情况。您必须连接到数据库。在这种情况下,您将连接到几乎专为此类情况而设的postgres数据库。关于准备事务,很好的一点是,如果出现问题,您应该会收到一个错误消息。 - Scott Marlowe
1
抱歉 Bohemian,但你错了。这里是从命令行运行 createdb 时的 pg_stat_activity:postgres=# select * from pg_stat_activity ; 11564 | postgres | 22223 | 16384 | smarlowe | CREATE DATABASE test; | f | 2011-08-19 16:18:26.918933-06 | 2011-08-19 16:18:26.918933-06 | 2011-08-19 16:18:26.916578-06 | | -1请注意,这是在另一个终端中从命令行运行 createdb 时发生的。第一个字段是我创建的 createdb 脚本连接到的数据库。 - Scott Marlowe
1
为什么这不是最好的、排名第一的答案呢? - Henley
由于我的用户不是“postgres”,我还必须添加:--dbname=postgres到我的命令中。 - Taytay
1
请注意,这对于Amazon RDS无效。它会从psql连接中断开您的连接并执行自动重置,然后您需要重新登录,回到起点。 - fIwJlxSzApHEZIl
显示剩余8条评论

19

当说用户已连接时,查询“select * from pg_stat_activity;”表示什么?除你以外的其他用户现在是否已连接?如果是,可能需要编辑您的pg_hba.conf文件以拒绝其他用户的连接,或者关闭正在访问pg数据库的应用程序才能够删除它。在生产中,我偶尔会遇到这个问题。将pg_hba.conf设置为像这样的两行:

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

并告诉pgsql重新加载或重启(即sudo /etc/init.d/postgresql reload或pg_ctl reload),现在连接到您的计算机的唯一方法是通过本地套接字。我假设您正在使用Linux。如果不是,则可能需要将第一行中的本地/身份验证调整为其他内容,例如host ... yourusername。

现在您应该能够执行以下操作:

psql postgres
drop database mydatabase;

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