我试图删除我的数据库,并通过命令行创建一个新的数据库。
我使用psql -U用户名登录,然后做一个\connect template1,后面跟着一个DROP DATABASE数据库名;
就得到了错误
数据库“databasename”被其他用户访问
我关闭Apache并再次尝试,但我仍然得到这个错误。我做错什么了吗?
我试图删除我的数据库,并通过命令行创建一个新的数据库。
我使用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;