PostgreSQL: викидання бази даних PostgreSQL через командний рядок [закрито]


321

Я намагаюся скинути свою базу даних і створити нову через командний рядок.

Я входжу за допомогою psql -U username а потім роблю a \connect template1, а потім a DROP DATABASE databasename;.

Я отримую помилку

доступ до бази даних бази даних отримують інші користувачі

Я закрив Apache і спробував це ще раз, але я все одно отримую цю помилку. Чи я щось роблю не так?


2
Що станеться, якщо ви просто запустите dropdb databasenameкоманду з командного рядка?
Ділан Марков

1
У ньому написано "ПОМИЛКА: не можна скинути відкриту на даний момент базу даних"
iman453

4
Використовувати psql -U <user> -c "drop database protodb"(без імені бази даних)
користувач

3
Це перезапустить postgres і відключить усіх: sudo service postgresql перезапустити Потім зробіть: 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';

3
Я використовую dropuserкоманду для видалення також користувача.
pl1nk

6
Не корисна відповідь щодо версії 9. Помилка щодо розірваних з'єднань все ще з’являється.
Павло Власов

4
Це перезапустить postgres і відключить усіх: sudo service postgresql перезапустити Потім зробіть: 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-process/


12
Довелося трохи змінити його на роботу:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
мерт

column "procpid" does not existдля amazon RDS postgres 9.6 екземпляр
anon58192932

Гм. Здійснив це, але він відразу ж відновився, сказавши: "З'єднання SSL несподівано закрилося [...] намагаючись скинути: Успішно." Еннн, я повернувся.
mlissner

67

Спробуйте це. Зауважте, що не вказана база даних - вона просто працює "на сервері"

psql -U postgres -c "drop database databasename"

Якщо це не спрацює, я побачив проблему з постгресами, що тримаються на осиротілих підготовлених заявах.
Щоб очистити їх, зробіть це:

SELECT * FROM pg_prepared_xacts;

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

ROLLBACK PREPARED '<id>';

Вибачте, я новачок у базах даних, тому це, мабуть, дурне запитання, але де я це вставлю? Перед входом у базу даних правильно? І я повинен замінити ім'я бази даних на ім'я моєї бази даних, правда?
iman453

@ iman453: Ви б запустили це прямо зі своєї оболонки / командного рядка.
mu занадто короткий

2
Немає таких речей, як "просто на сервері" для postgresql. Ви повинні підключитися до бази даних. У цьому випадку ви будете підключатися до бази даних postgres, яка майже там є для таких випадків. І хороший момент щодо підготовлених транзакцій, але в цьому випадку вам слід отримати повідомлення про помилку, в якому сказано, що це проблема.
Скотт Марлоу

1
Вибачте, богем, але ви неправі. Ось pg_stat_activity під час запуску createdb з командного рядка: postgres = # select * from pg_stat_activity; 11564 | постгреси | 22223 | 16384 | smarlowe | СТВОРИТИ ДАТАБАЗНИЙ тест; | 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 Зауважте, що це відбувається під час запуску createdb з командного рядка в іншому терміналі. Перше поле - це db, до якого був пов'язаний мій створений сценарій
Скотт Марлоу

1
Чому це не найкраща відповідь №1?
Henley Chiu

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. Якщо ні, то, можливо, потрібно буде підключити щось інше, ніж локальне / ідентифікатор у цьому першому рядку, на щось на зразок хоста ... yourusername.

Тепер ви повинні:

psql postgres
drop database mydatabase;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.