我试图删除我的数据库,并通过命令行创建一个新的数据库。
我使用psql -U username登录,然后执行\connect template1,然后执行DROP DATABASE databasename;。
psql -U username
\connect template1
DROP DATABASE databasename;
就得到了错误
数据库“databasename”被其他用户访问
我关闭Apache并再次尝试,但我仍然得到这个错误。我做错什么了吗?
试试这个。注意,没有指定数据库-它只是“在服务器上”运行
psql -U postgres -c "drop database databasename"
SELECT * FROM pg_prepared_xacts;
然后对于你看到的每个id,运行这个:
ROLLBACK PREPARED '<id>';
你可以在命令行中运行dropdb命令:
dropdb 'database name'
注意,您必须是超级用户或数据库所有者才能删除它。
你也可以检查pg_stat_activity视图来查看当前在你的数据库中发生的活动类型,包括所有空闲进程。
pg_stat_activity
SELECT * FROM pg_stat_activity WHERE datname='database name';
注意,从PostgreSQL v13开始,你可以自动断开用户连接
DROP DATABASE dbname WITH (FORCE);
或
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;
这招对我很管用:
select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
对于9.2以下版本的postgresql,将pid替换为procpid
pid
procpid
DROP DATABASE "YourDatabase";
http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection-processes/