PostgreSQL:通过命令行删除PostgreSQL数据库


321

我正在尝试删除数据库并通过命令行创建一个新数据库。

我使用登录,psql -U username然后执行\connect template1,然后执行DROP DATABASE databasename;

我得到错误

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

我关闭了Apache,然后重试了一次,但仍然出现此错误。难道我做错了什么?


2
如果仅从命令行运行dropdb databasename命令会怎样?
Dylan Markow

1
它说:“错误:无法删除当前打开的数据库”
iman453

4
使用psql -U <user> -c "drop database protodb"(无数据库名称)
用户

3
这将重新启动postgres并断开所有人的连接:sudo service postgresql restart然后执行以下操作:dropdb -h localhost -p 5432 -U“ youruser”“ testdb”注意“”以确保特殊字符不会出现问题。
unom 2014年

drop database <dataabase_name>;不要忘记逗号。
Sandip Subedi

Answers:


455

您可以从命令行运行dropdb命令:

dropdb 'database name'

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

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

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

3
我正在使用dropuser命令删除用户。
pl1nk 2012年

6
对于版本9来说没有帮助。有关打开的连接的错误仍然出现。
帕维尔·弗拉索夫

4
这将重新启动postgres并断开所有人的连接:sudo service postgresql restart然后执行以下操作:dropdb -h localhost -p 5432 -U“ youruser”“ testdb”注意“”以确保特殊字符不会出现问题。
unom 2014年

1
使用postgres用户:sudo -u postgres dropdb'数据库名称'
leszek.hanusz 2015年

\l查看您拥有的所有数据库。
Sandip Subedi

115

这为我工作:

select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';

对于9.2之前的postgresql替换pidprocpid

DROP DATABASE "YourDatabase";

http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection-processes/


12
不得不将其更改为可以工作:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
mrt

column "procpid" does not existfor Amazon RDS postgres 9.6实例
anon58192932 '18年

嗯 进行了此操作,但在说“ SSL连接意外重置并尝试成功:成功后,立即将其重新连接。” Ann,我回来了。
mlissner

67

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

psql -U postgres -c "drop database databasename"

如果那不起作用,我发现postgres保留孤立的准备好的语句存在问题。
要清理它们,请执行以下操作:

SELECT * FROM pg_prepared_xacts;

然后针对您看到的每个ID运行以下命令:

ROLLBACK PREPARED '<id>';

抱歉,我是数据库新手,所以这可能是一个愚蠢的问题,但是在哪里输入呢?在登录数据库之前对吗?我应该用数据库名称替换databasename对吗?
iman453

@ iman453:您可以直接在shell /命令行中运行它。
亩太短了,

2
对于postgresql,没有“仅在服务器上”这样的东西。您必须连接到数据库。在这种情况下,您将连接到postgres数据库,该数据库仅在这种情况下存在。对于准备好的交易来说,这是一个好主意,但是在那种情况下,您应该会收到一条错误消息,指出这就是问题所在。
Scott Marlowe

1
对不起,波西米亚风格,但您是错的。这是从命令行运行createdb时的pg_stat_activity:postgres =#select * from pg_stat_activity; 11564 | postgres | 22223 | 16384 | smarlowe | 创建数据库测试;| 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
为什么这不是最重要的第一答案?
亨利·邱

16

当它说用户已连接时,查询“从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。如果不是这样,可能需要将其调整为第一行中本地/ ident以外的其他内容,例如host ... yourusername。

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

psql postgres
drop database mydatabase;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.