DROP DATABASE в PostgreSQL: полное руководство по удалению БД
Удаление ненужных, дублирующихся и тестовых баз данных (БД) в PostgreSQL — процесс несложный, но ответственный. Если сделать что-то не так, можно потерять важную информацию. Рассказываем, как действовать безошибочно и что учесть.

Подготовка к удалению базы данных
Удаление БД — необратимое действие, которое уничтожает все объекты базы: таблицы, индексы, ключи, функции и данные. Если нет резервной копии или настроенного механизма PITR (Point-In-Time Recovery — восстановление на момент времени с использованием WAL-логов), восстановить удаленное стандартными средствами PostgreSQL не получится. В некоторых конфигурациях с непрерывным архивированием WAL данные могут быть восстановлены до определенного момента времени даже без явно созданного бэкапа, но это требует предварительной настройки и не отменяет необходимость регулярного резервного копирования.
Предварительные шаги
Проверьте, есть ли резервные копии баз данных. Если нет, сделайте их с помощью утилиты pg_dump, которая позволяет сохранять структуру БД и содержимое в виде SQL-скрипта или архива. Проверьте корректность созданных копий. Убедитесь, что файлы сохранились полностью и без ошибок.
В средах с высокими требованиями к безопасности дополнительно применяются физические бэкапы — с помощью утилиты pg_basebackup (которая создает побитовую копию всего кластера через протокол репликации PostgreSQL) или с помощью инструментов резервного копирования на уровне файловой системы (например, rsync, снапшоты LVM/ZFS, dd).
Можно настроить резервное копирование автоматически с помощью сервиса Evolution Managed PostgreSQL от Cloud.ru. В нем также реализована возможность Point-in-Time Recovery (PITR) — восстановления данных на любой момент времени.
Проверка активных подключений
Удалить базу данных PostgreSQL не получится, если к ней есть активные подключения. Это защитный механизм: СУБД предотвращает случайное удаление БД, с которой прямо сейчас работают пользователи или приложения. Перед удалением проверьте, кто и как использует базу.
Информация о подключениях отображается в системном представлении pg_stat_activity. Администратор может выполнить запрос и увидеть все сессии, связанные с нужной БД. Активные подключения необходимо правильно завершить с помощью функции pg_terminate_backend.
В версиях 9.1 и ниже для идентификации подключений используется колонка procpid, а не pid. Начиная с версии 9.2 и выше используйте колонку pid. Для завершения подключений потребуются права суперпользователя или членство в роли pg_signal_backend.
Перед этим нужно найти приложения и сервисы, которые используют базу данных, чтобы у пользователей не выходили сообщения об ошибке подключения.

Использование команды DROP DATABASE
Для удаления базы данных из кластера PostgreSQL применяется SQL-команда DROP DATABASE. Чтобы правильно ее использовать, разберитесь в синтаксисе и доступных опциях.
Базовый синтаксис
В базовом виде команда содержит имя базы данных, которая будет удалена. Синтаксис выглядит так:
Чтобы выполнить команду, нужно быть владельцем базы данных или иметь привилегию DROP. Если условия не соблюдены, сервер откажет в операции.
Опция IF EXISTS
Опция IF EXISTS поможет предотвратить ошибки, если база данных не существует. Без нее PostgreSQL прерывает выполнение команды DROP DATABASE, что нежелательно при автоматическом развертывании окружений и в скриптах администрирования.
Если используется IF EXISTS, сервер не выдает ошибку и не завершает выполнение команды. Он выводит предупреждение о том, что база данных не найдена. Это актуально для случаев, если вы не знаете, существует БД или нет.
Пример использования опции IF EXISTS в составе команды для удаления:

Если указанная база данных есть, она будет удалена. Если нет, команда будет выполняться, но с предупреждением о несуществующей БД. Опция полезна при очистке временных и тестовых окружений, где состояние баз может меняться.
Опция WITH (FORCE)
С версии PostgreSQL 13 в составе DROP DATABASE можно использовать опцию WITH (FORCE), которая позволяет принудительно завершать активные подключения к базе и сразу после ее удалять. Это экономит время администратора, ведь без расширения ему приходится вручную искать и останавливать сессии.
Пример команды с опцией:
Полная форма:
Перед использованием опции WITH (FORCE) проверьте свою версию PostgreSQL. Если она ниже 13, команда завершится с ошибкой. В этом случае используйте классический подход с ручной остановкой активных подключений.
Альтернативные методы удаления
Помимо команды DROP DATABASE есть и другие способы удаления базы данных PostgreSQL: через графический интерфейс PgAdmin и утилиту dropdb.
Удаление в PgAdmin
PgAdmin — графический интерфейс для удобного администрирования PostgreSQL. Он предоставляет все необходимые инструменты для управления кластерами, базами данных и пользователями. Как удалить БД с его помощью без SQL-команды:
В pgAdmin найдите раздел Servers.
Подключитесь к нужному серверу.
Разверните список Databases.
Выделите базу данных, которую хотите удалить.
В контекстном меню выберите Delete/Drop.
Подтвердите действие, нажав кнопку OK или Yes.
Перед удалением таким способом выполните те же этапы подготовки, что и при использовании DROP DATABASE — сделайте резервные копии, проверьте и завершите активные подключения.
Использование утилиты командной строки dropdb
dropdb — консольная утилита PostgreSQL для удаления баз данных. Она запускается из командной строки и подключается к серверу СУБД. Пример использования утилиты:
Чтобы избежать ошибки при удалении несуществующей базы данных используйте опцию --if-exists:
Утилита поддерживает все базовые параметры подключения: хост, порт и имя базы данных. Можно указать так:
Если у вас PostgreSQL 13 и выше, с помощью dropdb можно принудительно удалять базу данных с предварительным автоматическим завершением активных подключений. Используйте опцию --force, которая соответствует WITH (FORCE) в команде DROP DATABASE:
Примеры удаления базы данных
Для удобства мы собрали типичные сценарии удаления в одну таблицу, которой можно пользоваться как шпаргалкой:
Сценарий | Пример команды | Зачем выполнять |
Удаление существующей базы | sql DROP DATABASE mydb; | Базовая команда для удаления конкретной БД |
Удаление после проверки существования БД | sql DROP DATABASE IF EXISTS mydb; | Команда, которая перед удалением позволяет проверить, что база данных действительно существует |
Удаление с принудительным завершением активных подключений | sql DROP DATABASE mydb WITH (FORCE); | Команда, которая перед удалением обнаруживает и разрывает все активные подключения к БД |
Удаление с помощью утилиты командной строки | bash dropdb mydb | Способ, который удаляет базу данных также, как с помощью команды DROP DATABASE. Удобен для удаленных действий с БД. |
Удаление БД после ручного завершения активных подключений | 1. SELECT pid FROM pg_stat_activity WHERE datname = 'mydb'; 2. SELECT pg_terminate_backend(pid); 3. DROP DATABASE mydb; | Последовательность действий, которые позволяют сначала самостоятельно завершить активные сессии, затем удалить БД |
Рекомендации и практики
Про создание резервных копий и остановку текущих подключений мы уже говорили. Еще несколько рекомендаций, которые позволят снизить риски ошибок и некорректных действий при удалении БД:
Заранее планируйте удаление и убедитесь, что база данных не нужна. Это поможет избежать потери критически важной информации, которая используется зависимыми сервисами.
Не удаляйте базу, к которой подключены. Подключитесь к другой БД и через нее выполните команду для удаления. Это предотвратит попытку ликвидировать текущую рабочую базу.
Документируйте процесс удаления. Фиксируйте в журналах, кто, почему и когда выполнял DROP. И уведомите других членов команды о таких действиях, чтобы не нарушить текущие рабочие процессы.
Проверяйте зависимости. Перед действием проверьте, что от удаляемой базы данных не зависят приложения и сервисы. Если пренебречь рекомендацией, могут возникнуть непредвиденные сбои в работе систем.
Если работаете с инструментами автоматизации, которые могут инициировать случайное удаление базы данных, используйте механизмы подтверждения действий. Например, это может быть ввод имени БД.
Заключение
Удаление базы данных с использованием DROP DATABASE — необратимый процесс, который требует осознанного подхода. Перед выполнением команды убедитесь в существовании удаляемых БД, сделайте резервные копии, остановите подключения и проверьте, есть ли зависимости среди сервисов и приложений.
