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

我使用psql -U用户名登录,然后做一个\connect template1,后面跟着一个DROP DATABASE数据库名;

就得到了错误

数据库“databasename”被其他用户访问

我关闭Apache并再次尝试,但我仍然得到这个错误。我做错什么了吗?


当前回答

当它说用户已连接时,查询“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。如果不是,这可能需要调整到其他的东西,而不是local / ident在第一行,像host…yourusername。

现在你应该能够做:

psql postgres
drop database mydatabase;

其他回答

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

psql -U postgres -c "drop database databasename"

如果这不起作用,我看到postgres持有孤立的准备语句的问题。 要清理它们,可以这样做:

SELECT * FROM pg_prepared_xacts;

然后对于你看到的每个id,运行这个:

ROLLBACK PREPARED '<id>';

这招对我很管用:

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/

可以在命令行中执行dropdb命令:

dropdb 'database name'

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

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

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

注意,从PostgreSQL v13开始,你可以自动断开用户连接

DROP DATABASE dbname WITH (FORCE);

or

dropdb -f dbname

当它说用户已连接时,查询“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。如果不是,这可能需要调整到其他的东西,而不是local / ident在第一行,像host…yourusername。

现在你应该能够做:

psql postgres
drop database mydatabase;