通过命令行删除PostgreSQL数据库

Drop PostgreSQL database through command line

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

我使用psql -U username登录然后执行\connect template1,然后执行DROP DATABASE databasename;

我收到了错误

database databasename is being accessed by other users

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


您可以从命令行运行dropdb命令:

1
dropdb 'database name'

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

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

1
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

1
DROP DATABASE"YourDatabase";

How to force-drop a postgresql database by killing off connection processes


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

1
psql -U postgres -c"drop database databasename"

如果这不起作用,我看到postgres持有孤立的准备语句的问题。
要清理它们,请执行以下操作:

1
SELECT * FROM pg_prepared_xacts;

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

1
ROLLBACK PREPARED '<id>';


当它说用户已连接时,查询是什么"select * from pg_stat_activity;"说?现在除了你自己以外的其他用户了吗?如果是这样,您可能必须编辑pg_hba.conf文件以拒绝来自其他用户的连接,或者关闭访问pg数据库的任何应用程序以便能够删除它。我有时会在制作中遇到这个问题。将pg_hba.conf设置为两行,如下所示:

1
2
LOCAL   ALL         ALL                               ident
host    ALL         ALL         127.0.0.1/32          reject

并告诉pgsql重新加载或重新启动(即sudo /etc/init.d/postgresql reload或pg_ctl reload),现在连接到你的机器的唯一方法是通过本地套接字。我假设你在Linux上。如果不是这可能需要调整到第一行上本地/身份以外的东西,就像主机... yourusername。

现在你应该能够做到:

1
2
psql postgres
DROP DATABASE mydatabase;