通过命令行删除PostgreSQL数据库

ima*_*453 295 database postgresql

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

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

我收到了错误

其他用户正在访问数据库databasename

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

csa*_*ano 428

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

dropdb 'database name'
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * FROM pg_stat_activity WHERE datname='database name';
Run Code Online (Sandbox Code Playgroud)

  • 对于版本9,没有帮助的答案.打开的连接的错误仍然显示. (5认同)
  • 这将重新启动postgres并断开所有人:sudo service postgresql restart然后执行:dropdb -h localhost -p 5432 -U"youruser""testdb"注意""以确保特殊字符顺利进入. (4认同)
  • 我正在使用`dropuser`命令删除用户. (3认同)
  • 使用 postgres 用户: sudo -u postgres dropdb 'database name' (2认同)

小智 111

这对我有用:

select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
Run Code Online (Sandbox Code Playgroud)

PostgreSQL的早于9.2替换pidprocpid

DROP DATABASE "YourDatabase";
Run Code Online (Sandbox Code Playgroud)

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

  • 不得不改变一点工作:`从pg_stat_activity中选择pg_terminate_backend(pid),其中datname ='YourDatabase';` (11认同)

Boh*_*ian 65

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

psql -U postgres -c "drop database databasename"
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM pg_prepared_xacts;
Run Code Online (Sandbox Code Playgroud)

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

ROLLBACK PREPARED '<id>';
Run Code Online (Sandbox Code Playgroud)

  • 对于postgresql,没有"只在服务器上"这样的东西.您必须连接到数据库.在这种情况下,你将连接到postgres数据库,这就是这样的情况.准备交易的好点,但在这种情况下,你应该收到一条错误消息,说明问题. (2认同)

Sco*_*owe 15

当它说用户已连接时,查询是什么"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
Run Code Online (Sandbox Code Playgroud)

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

现在你应该能够做到:

psql postgres
drop database mydatabase;
Run Code Online (Sandbox Code Playgroud)