В PostgreSQL * вы не можете удалить базу данных, когда к ней подключены клиенты.
По крайней мере, не с помощью dropdb
утилиты, которая является простой оболочкой DROP DATABASE
для запроса к серверу.
Весьма надежный обходной путь выглядит следующим образом:
Подключайтесь к вашему серверу как суперпользователь , используя psql
или другой клиент. Как не использовать базу данных , которую вы хотите отказаться.
psql -h localhost postgres postgres
Теперь, используя простой клиент базы данных, вы можете принудительно удалить базу данных, выполнив три простых шага:
Убедитесь, что никто не может подключиться к этой базе данных. Вы можете использовать один из следующих методов (второй кажется более безопасным, но не мешает соединениям от суперпользователей).
/* 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; */
Принудительное отключение всех клиентов, подключенных к этой базе данных, используя pg_terminate_backend
.
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'; */
Удалите базу данных.
DROP DATABASE mydb;
Шаг 1 требует привилегий суперпользователя для 1-го метода и привилегий владельца базы данных для 2-го. Шаг 2 требует привилегий суперпользователя . Шаг 3 требует привилегии владельца базы данных .
* Это относится ко всем версиям PostgreSQL, вплоть до версии 11.