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

321

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

Я вхожу с помощью psql -U usernameи затем делаю \connect template1, а затем DROP DATABASE databasename;.

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

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

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

iman453
источник
2
Что произойдет, если вы просто запустите dropdb databasenameкоманду из командной строки?
Дилан Марков
1
Он говорит: «ОШИБКА: невозможно удалить
текущую
4
Использование psql -U <user> -c "drop database protodb"(без имени базы данных)
пользователь
3
Это перезапустит postgres и отключит всех: sudo service postgresql restart Затем выполните: dropdb -h localhost -p 5432 -U "youruser" "testdb" Обратите внимание на "", чтобы убедиться, что специальные символы вводятся без помехи.
Unom
drop database <dataabase_name>;Не забывайте запятую.
Сандип Субеди

Ответы:

455

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

dropdb 'database name'

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

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

SELECT * FROM pg_stat_activity WHERE datname='database name';
csano
источник
3
Я использую dropuserкоманду, чтобы удалить также пользователя.
PL1NK
6
Бесполезный ответ как для версии 9. По-прежнему появляется ошибка об открытых соединениях.
Павел Власов
4
Это перезапустит postgres и отключит всех: sudo service postgresql restart Затем выполните: dropdb -h localhost -p 5432 -U "youruser" "testdb" Обратите внимание на "", чтобы убедиться, что специальные символы вводятся без помехи.
Unom
1
используя пользователя postgres: sudo -u postgres dropdb 'имя базы данных'
leszek.hanusz
\l чтобы увидеть все базы данных у вас есть.
Сандип Субеди
115

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

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/

Евгений
источник
12
Пришлось немного изменить это, чтобы работать:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
MRT
column "procpid" does not existдля amazon RDS postgres 9.6 экземпляр
anon58192932
Гектометр Запустил это, но он сразу же переподключился, сказав: «Соединение SSL неожиданно закрылось [...] при попытке сброса: успешно». Энн, я вернулся.
mlissner
67

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

psql -U postgres -c "drop database databasename"

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

SELECT * FROM pg_prepared_xacts;

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

ROLLBACK PREPARED '<id>';
Богемский
источник
Извините, я новичок в базах данных, так что это, вероятно, глупый вопрос, но где мне это напечатать? Перед входом в базу данных правильно? И я должен заменить имя базы данных на имя моей базы данных правильно?
iman453
@ iman453: Вы запускаете это прямо из командной строки или оболочки.
мю слишком коротка
2
Для postgresql нет таких вещей, как «только на сервере». Вы должны подключиться к базе данных. В этом случае вы будете подключаться к базе данных postgres, которая в значительной степени существует только для подобных случаев. И хороший момент для подготовленных транзакций, но в этом случае вы должны получить сообщение об ошибке, в котором говорится, что это проблема.
Скотт Марлоу
1
Извините, богемец, но вы тот, кто не прав. Вот pg_stat_activity во время запуска созданногоb из командной строки: postgres = # select * from pg_stat_activity; 11564 | Postgres | 22223 | 16384 | смарлоу | Тест 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 Обратите внимание, что это происходит при запуске созданного из командной строки в другом терминале. Это первое поле - это БД, к которой был подключен мой скрипт creatb
Скотт Марлоу
1
Почему это не лучший ответ № 1?
Хенли Чиу
16

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