我试图通过命令行删除数据库并创建一个新数据库。
我使用
psql -U username
登录,然后执行\connect template1
,然后执行DROP DATABASE databasename;
。出现错误
其他用户正在访问数据库数据库名
我关闭了Apache并再次尝试了此操作,但是我仍然出现此错误。我做错什么了吗?
#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;
评论
如果仅从命令行运行dropdb databasename命令会发生什么?它显示“错误:无法删除当前打开的数据库”
使用psql -U <用户> -c“删除数据库protodb”(不带数据库名称)
这将重新启动postgres并断开所有人的连接:sudo service postgresql restart然后执行以下操作:dropdb -h localhost -p 5432 -U“ youruser”“ testdb”注意“”以确保特殊字符可以顺利插入。
删除数据库