PostgreSQL:通过命令行删除 PostgreSQL 数据库 [关闭]
Posted
技术标签:
【中文标题】PostgreSQL:通过命令行删除 PostgreSQL 数据库 [关闭]【英文标题】:PostgreSQL: Drop PostgreSQL database through command line [closed] 【发布时间】:2011-10-27 18:37:30 【问题描述】:我正在尝试删除我的数据库并通过命令行创建一个新数据库。
我使用psql -U username
登录,然后输入\connect template1
,然后输入DROP DATABASE databasename;
。
我得到了错误
database 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>;
别忘了逗号。
【参考方案1】:
您可以从命令行运行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
查看您拥有的所有数据库。【参考方案2】:
这对我有用:
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 连接意外关闭 [...] 尝试重置:成功”之后立即重新连接。安德,我回来了。【参考方案3】:
试试这个。请注意,没有指定数据库 - 它只是“在服务器上”运行
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
连接引导您并执行自动重置,然后您重新登录并回到您开始的位置。【参考方案4】:
当它说用户已连接时,查询“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;
【讨论】:
以上是关于PostgreSQL:通过命令行删除 PostgreSQL 数据库 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章