Drop PostgreSQL database through command line
我正在尝试删除我的数据库并通过命令行创建一个新数据库。
我使用psql -U username登录然后执行\connect template1,然后执行DROP DATABASE databasename;。
我收到了错误
database databasename is being accessed by other users
我关闭Apache并再次尝试这个,但我仍然收到此错误。 难道我做错了什么?
-
如果您只是从命令行运行dropdb databasename命令会发生什么?
-
它说"错误:无法删除当前打开的数据库"
-
使用psql -U -c"drop database protodb"(没有数据库名称)
-
这将重新启动postgres并断开所有人:sudo service postgresql restart然后执行:dropdb -h localhost -p 5432 -U"youruser""testdb"注意"确保特殊字符顺利进入。
-
drop database ;不要忘记逗号。
您可以从命令行运行dropdb命令:
请注意,您必须是超级用户或数据库所有者才能删除它。
您还可以检查pg_stat_activity视图以查看当前针对您的数据库执行的活动类型,包括所有空闲进程。
1
| SELECT * FROM pg_stat_activity WHERE datname='database name'; |
-
我正在使用dropuser命令删除用户。
-
对于版本9,没有帮助的答案。打开的连接的错误仍然显示。
-
这将重新启动postgres并断开所有人:sudo service postgresql restart然后执行:dropdb -h localhost -p 5432 -U"youruser""testdb"注意"确保特殊字符顺利进入。
-
使用postgres用户:sudo -u postgres dropdb'database name'
-
\l查看您拥有的所有数据库。
这对我有用:
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
-
不得不改变一点工作:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
-
column"procpid" does not exist为亚马逊RDS postgres 9.6实例
-
嗯。跑了这个,但它刚刚重新连接,说:"SSL连接意外关闭[...]试图重置:成功。"安妮,我回来了。
试试这个。请注意,没有指定数据库 - 它只是"在服务器上运行"
1
| psql -U postgres -c"drop database databasename" |
如果这不起作用,我看到postgres持有孤立的准备语句的问题。
要清理它们,请执行以下操作:
1
| SELECT * FROM pg_prepared_xacts; |
那么对于你看到的每个id,运行这个:
1
| ROLLBACK PREPARED '<id>'; |
-
对不起,我是数据库的新手,所以这可能是一个愚蠢的问题,但我在哪里输入?在登录数据库之前吗?我应该用我的数据库名称替换databasename吗?
-
@ iman453:你可以从shell /命令行直接运行。
-
对于postgresql,没有"只在服务器上"这样的东西。您必须连接到数据库。在这种情况下,您将连接到postgres数据库,这几乎就是这样的情况。准备交易的好点,但在这种情况下,你应该收到一条错误消息,说明问题。
-
@Scott - 不是这样。您可以运行"服务器"级别命令而无需连接到特定数据库,例如drop / create database命令,如我的答案中的示例所示。
-
对不起波西米亚人,但你是错的人。这是从命令行运行createdb时的pg_stat_activity:postgres =#select * from pg_stat_activity; 11564 | postgres | 22223 | 16384 | smarlowe | CREATE DATABASE测试; | 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脚本连接到的数据库
-
要进一步证明,请删除postgres数据库并尝试createdb脚本命令。它会失败。
-
有趣。因此,如果您未指定数据库,则仍会连接到默认的"postgres"数据库。好的 - 谢谢你的信息。我没有意识到这一点。不错的研究btw +1
-
是的,命令行utils如createdb和createuser命中维护db,默认情况下是postgres。在旧版本中,它是template1,但这通常会妨碍createdb等,因此更改了并添加了postgres db来处理此作业。
-
为什么这不是顶级的,#1答案?
-
由于我的用户不是"postgres",我还必须在我的命令中添加:--dbname=postgres。
-
请注意,这不适用于Amazon RDS。它会从psql连接引导您并执行自动重置,然后您重新登录并返回到您开始的位置。
当它说用户已连接时,查询是什么"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; |