ChatGPT解决这个技术问题 Extra ChatGPT

PostgreSQL:通过命令行删除 PostgreSQL 数据库 [关闭]

关闭。这个问题是题外话。它目前不接受答案。想改进这个问题?更新问题,使其成为 Stack Overflow 的主题。 9年前关闭。改进这个问题

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

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

我得到错误

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

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

如果您只是从命令行运行 dropdb databasename 命令会发生什么?
它说“错误:无法删除当前打开的数据库”
使用 psql -U <user> -c "drop database protodb"(没有数据库名称)
这将重新启动 postgres 并断开所有人的连接: sudo service postgresql restart 然后执行: dropdb -h localhost -p 5432 -U "youruser" "testdb" 注意 "" 以确保特殊字符顺利进入。
drop database <dataabase_name>; 不要忘记逗号。

R
Robin

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

dropdb 'database name'

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

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

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

请注意,从 PostgreSQL v13 开始,您可以使用以下命令自动断开用户连接

DROP DATABASE dbname WITH (FORCE);

或者

dropdb -f dbname

我正在使用 dropuser 命令来删除用户。
对于版本 9,没有帮助的答案。关于打开连接的错误仍然出现。
这将重新启动 postgres 并断开所有人的连接: sudo service postgresql restart 然后执行: dropdb -h localhost -p 5432 -U "youruser" "testdb" 注意 "" 以确保特殊字符顺利进入。
使用 postgres 用户: sudo -u postgres dropdb 'database name'
\l 查看您拥有的所有数据库。
B
Brugolo

这对我有用:

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/


必须稍微改变一下才能工作:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
column "procpid" does not exist 用于亚马逊 RDS postgres 9.6 实例
嗯。运行这个,但它只是在说“SSL 连接意外关闭 [...] 试图重置:成功”之后立即重新连接。安德,我回来了。
B
Bohemian

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

psql -U postgres -c "drop database databasename"

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

SELECT * FROM pg_prepared_xacts;

然后对于您看到的每个 id,运行以下命令:

ROLLBACK PREPARED '<id>';

对不起,我是数据库新手,所以这可能是一个愚蠢的问题,但是我在哪里输入呢?在登录数据库之前对吗?我应该用我的数据库名称替换 databasename 吗?
对于 postgresql,没有“仅在服务器上”之类的东西。您必须连接到数据库。在这种情况下,您将连接到 postgres 数据库,该数据库几乎仅用于此类情况。关于准备好的交易,这是一个很好的观点,但在这种情况下,您应该收到一条错误消息,说明这是问题所在。
对不起波西米亚人,但你是错的。这是从命令行运行 createdb 时的 pg_stat_activity: postgres=# select * from pg_stat_activity ; 11564 |后勤 | 22223 | 16384 |斯玛洛 |创建数据库测试; | f | 2011-08-19 16:18:26.918933-06 | 2011-08-19 16:18:26.918933-06 | 2011-08-19 16:18:26.916578-06 | | -1 请注意,从另一个终端的命令行运行 createdb 时会发生这种情况。第一个字段是我的 createdb 脚本连接到的数据库
为什么这不是排名第一的答案?
请注意,这不适用于 Amazon RDS。它会从 psql 连接引导您并执行自动重置,然后您重新登录并返回到您开始的位置。
S
Scott Marlowe

当它说用户已连接时,查询“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上。如果不是,这可能需要在第一行调整为本地/标识以外的其他内容,例如主机...您的用户名。

现在你应该能够做到:

psql postgres
drop database mydatabase;