提问



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


我收到错误其他用户正在访问数据库databasename。我关闭Apache并尝试了这个,但仍然出现此错误。难道我做错了什么?

最佳参考


您可以从命令行运行dropdb命令:[12]


dropdb 'database name'


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


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


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

其它参考1


这对我有用:


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


对于早于9.2的postgresql用procpid替换pid


DROP DATABASE "YourDatabase";


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

其它参考2


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


psql -U postgres -c "drop database databasename"


如果这不起作用,我看到postgres持有孤立预备语句的问题。

要清理它们,请执行以下操作:


SELECT * FROM pg_prepared_xacts;


那么对于你看到的每个id,运行这个:


ROLLBACK PREPARED '<id>';

其它参考3


当它说用户已连接时,查询是什么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上。如果不是这可能需要调整到第一行上本地/身份以外的东西,就像主机...你的用户名。


现在你应该能够做到:


psql postgres
drop database mydatabase;