/* Method 1: update system catalog */
UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'mydb';
/* Method 2: use ALTER DATABASE. Superusers still can connect!
ALTER DATABASE mydb CONNECTION LIMIT 0; */
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydb';
/* For old versions of PostgreSQL (up to 9.1), change pid to procpid:
SELECT pg_terminate_backend(procpid)
FROM pg_stat_activity
WHERE datname = 'mydb'; */
-- Connecting to the current user localhost's postgres instance
psql
-- Making sure the database exists
SELECT * from pg_database where datname = 'my_database_name'
-- Disallow new connections
UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'my_database_name';
ALTER DATABASE my_database_name CONNECTION LIMIT 1;
-- Terminate existing connections
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'my_database_name';
-- Drop database
DROP DATABASE my_database_name
DB="my_database_name" psql <<EOF
-- Making sure the database exists
SELECT * from pg_database where datname = '${DB}';
-- Disallow new connections
UPDATE pg_database SET datallowconn = false WHERE datname = '${DB}';
ALTER DATABASE ${DB} CONNECTION LIMIT 1;
-- Terminate existing connections
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${DB}';
-- Drop database
DROP DATABASE ${DB};
EOF
PostgreSQL 13添加:
手册:
在PostgreSQL 12 及更早版本中,当客户端连接到数据库时,您无法删除该数据库。
至少,不是使用
dropdb
实用程序——它只是一个简单的DROP DATABASE
服务器查询包装器。相当强大的解决方法如下:
使用超级用户
psql
或其他客户端连接到您的服务器。不要使用要删除的数据库。现在使用普通的数据库客户端,您可以使用三个简单的步骤强制删除数据库:
确保没有人可以连接到此数据库。您可以使用以下方法之一(第二种似乎更安全,但不会阻止超级用户的连接)。
使用 .强制断开连接到该数据库的所有客户端
pg_terminate_backend
。删除数据库。
步骤 1 第一种方法需要超级用户权限,第二种方法需要数据库所有者权限。第 2 步需要超级用户权限。第 3 步需要数据库所有者权限。
Postgres 13添加
FORCE
了DROP DATABASE
. 请参阅filiprem 的答案。shell 实用程序
dropdb
基本上只是 SQL 命令的包装器,并继承了相同的选项。所以现在从 shell 也很简单可靠:或简称:
对于Postgres 12 和更早版本,shell 实用程序
dropdb
&pg_ctl
(或pg_ctlcluster
在 Debian 及其衍生版本中)也有一种方法。但是filiprem 的方法在那里更胜一筹,原因如下:dropdb
命令。我引用
man pg_ctlcluster
:或者
或者
紧随其后的是:
可能在用于立即继承的脚本中。
在我的案例中使用@filiprem 的答案并简化它:
对于那些现在发现这个问题的人,8 年后,PostgreSQL 13 终于添加了
--force
这个问题要求的标志:DROP DATABASE database_to_drop WITH (FORCE)
或者
dropdb [-f/--force] database_to_drop
将要
https://www.postgresql.org/docs/13/sql-dropdatabase.html
使用@Dorian 的答案,修复和增强:
如果您使用的是 RDS 之类的东西,其中未选择数据库的连接将您放入您要求默认创建的数据库中,您可以执行此变体来绕过自己成为最后一个打开的连接。