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

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

出现错误


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


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

评论

如果仅从命令行运行dropdb databasename命令会发生什么?

它显示“错误:无法删除当前打开的数据库”

使用psql -U <用户> -c“删除数据库protodb”(不带数据库名称)

这将重新启动postgres并断开所有人的连接:sudo service postgresql restart然后执行以下操作:dropdb -h localhost -p 5432 -U“ youruser”“ testdb”注意“”以确保特殊字符可以顺利插入。

删除数据库;不要忘记逗号。

#1 楼

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

请注意,您必须是超级用户或数据库所有者才能删除它。
还可以检查pg_stat_activity视图以查看当前针对数据库进行的活动类型,包括所有空闲进程。
SELECT * FROM pg_stat_activity WHERE datname='database name';

请注意,从PostgreSQL v13开始,可以使用
DROP DATABASE dbname FORCE;

or
 dropdb -f dbname
 


评论


我正在使用dropuser命令删除用户。

–pl1nk
2012年9月5日15:26



对于版本9来说没有帮助。有关打开的连接的错误仍然出现。

– Pavel Vlasov
2014年4月17日在9:25

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

– Unom
2014年6月26日6:10



使用postgres用户:sudo -u postgres dropdb'数据库名称'

–leszek.hanusz
15年1月24日在12:06

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

– Sandip Subedi
19年4月4日在20:39



#2 楼

这对我有用:

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


对于早于9.2的Postgresql,用pid替换procpid

DROP DATABASE "YourDatabase";


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

评论


必须对其进行一些更改才能起作用:从pg_stat_activity中选择pg_terminate_backend(pid),其中datname ='YourDatabase';

–mrt
13年8月16日在9:47

亚马逊RDS postgres 9.6实例不存在“ procpid”列

–anon58192932
18年5月9日在13:10

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

– mlissner
18年11月12日在19:03

#3 楼

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

psql -U postgres -c "drop database databasename"


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

SELECT * FROM pg_prepared_xacts;


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

ROLLBACK PREPARED '<id>';


评论


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

– iman453
2011年8月16日下午5:11

@ iman453:您可以直接从shell /命令行运行它。

–mu太短
2011年8月16日下午5:26

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

–斯科特·马洛(Scott Marlowe)
2011年8月17日在3:11



对不起,波希米亚,但你是错的。这是从命令行运行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)
2011年8月19日在22:19



为什么这不是最重要的第一答案?

–邱汉ley
16-10-31在14:22

#4 楼

当说用户已连接时,查询“从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以外的其他内容,例如主机... yourusername。

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

psql postgres
drop database mydatabase;