Удалить базу данных PostgreSQL через командную строку

263

Я пытаюсь удалить свою базу данных и создать новую через командную строку.

Я psql -U username в систему, используя psql -U username а затем выполняю \connect template1, за которым следует имя DROP DATABASE databasename; ,

Я получаю ошибку

база данных к базе данных обращаются другие пользователи

Я выключил Apache и попробовал это снова, но я все еще получаю эту ошибку. Я делаю что-то неправильно?

  • 1
    Что произойдет, если вы просто запустите команду dropdb databasename из командной строки?
  • 1
    Он говорит: «ОШИБКА: невозможно удалить текущую открытую базу данных»
Показать ещё 2 комментария
Теги:
database

4 ответа

388
Лучший ответ

Вы можете запустить команду dropdb из командной строки:

dropdb 'database name'

Обратите внимание, что вы должны быть суперпользователем или владельцем базы данных, чтобы иметь возможность отказаться от него.

Вы также можете проверить представление pg_stat_activity, чтобы узнать, какой вид активности в данный момент происходит в вашей базе данных, включая все незанятые процессы.

SELECT * FROM pg_stat_activity WHERE datname='database name';
  • 3
    Я использую команду dropuser чтобы удалить также пользователя.
  • 3
    Бесполезный ответ, как для версии 9. По-прежнему появляется ошибка об открытых соединениях.
Показать ещё 2 комментария
99

Это сработало для меня:

select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';

для postgresql ранее 9.2 замените pid на procpid

DROP DATABASE "YourDatabase";

http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection-processes/

  • 11
    Пришлось немного его изменить, чтобы работать: select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
  • 0
    column "procpid" does not exist для экземпляра Amazon RDS postgres 9.6
Показать ещё 1 комментарий
55

Попробуйте это. Обратите внимание: база данных не указана - она ​​просто запускается "на сервере"

psql -U postgres -c "drop database databasename"

Если это не сработает, я видел проблему с postgres, держащей сиротские подготовленные заявления.
Чтобы очистить их, сделайте следующее:

SELECT * FROM pg_prepared_xacts;

то для каждого идентификатора, который вы видите, запустите это:

ROLLBACK PREPARED '<id>';
  • 0
    Извините, я новичок в базах данных, так что это, вероятно, глупый вопрос, но где мне это напечатать? Перед входом в базу данных правильно? И я должен заменить имя базы данных на имя моей базы данных, верно?
  • 0
    @ iman453: Вы запускаете это прямо из командной строки или оболочки.
Показать ещё 9 комментариев
12

Когда он говорит, что пользователи подключены, что делает запрос "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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню