Мне нужно написать скрипт, который удалит базу данных PostgreSQL. С ним может быть много связей, но скрипт должен это игнорировать.
Стандартный DROP DATABASE db_name
запрос не работает при открытых соединениях.
Как я могу решить проблему?
postgresql
Роман Приходченко
источник
источник
Ответы:
Это приведет к удалению существующих подключений, кроме вашего:
Запросите
pg_stat_activity
и получите значения pid, которые хотите убить, а затем введитеSELECT pg_terminate_backend(pid int)
их.PostgreSQL 9.2 и выше:
PostgreSQL 9.1 и ниже:
После того, как вы отключите всех, вам придется отключить и выполнить команду DROP DATABASE из соединения с другой базой данных, а не той, которую вы пытаетесь сбросить.
Обратите внимание на переименование
procpid
столбца вpid
. Смотрите эту ветку списка рассылки .источник
; drop database TARGET_DB;
в моем случае это работало хорошо, чтобы убедиться, что база данных исчезла к тому времени, когда все начало повторяться.dropdb --force
.В PostgreSQL 9.2 и выше отключить все, кроме сеанса, от базы данных, к которой вы подключены:
В старых версиях то же самое, просто измените
pid
наprocpid
. Чтобы отключиться от другой базы данных, просто изменитеcurrent_database()
имя базы данных, от которой вы хотите отключить пользователей.Вы можете
REVOKE
вCONNECT
праве от пользователей базы данных перед отключением пользователей, в противном случае пользователи будут просто держать на Reconnecting и вы никогда не получите шанс понизить БД. Посмотрите этот комментарий и вопрос, с которым он связан, как мне отсоединить всех других пользователей от базы данных .Если вы просто хотите отключить незанятых пользователей, посмотрите этот вопрос .
источник
Вы можете уничтожить все соединения перед удалением базы данных, используя
pg_terminate_backend(int)
функцию.Вы можете получить все запущенные бэкэнды, используя системное представление
pg_stat_activity
Я не совсем уверен, но следующее, вероятно, убьет все сессии:
Конечно, вы не можете быть подключены к этой базе данных
источник
В зависимости от вашей версии postgresql вы можете столкнуться с ошибкой, которая делает
pg_stat_activity
за которой пропускаются активные соединения от сброшенных пользователей. Эти соединения также не показаны внутри pgAdminIII.Если вы выполняете автоматическое тестирование (в котором вы также создаете пользователей), это может быть вероятным сценарием.
В этом случае вам нужно вернуться к таким запросам, как:
ПРИМЕЧАНИЕ. В версии 9.2+ вам нужно изменить
procpid
наpid
.источник
procpid
наpid
этот фрагмент работает на 9.3.Я заметил, что postgres 9.2 теперь вызывает pid столбца, а не procpid.
Я склонен называть это из оболочки:
Надеюсь, что это полезно. Спасибо @JustBob за sql.
источник
Я просто перезапускаю сервис в Ubuntu, чтобы отключить подключенных клиентов.
источник
В командной строке Linux я бы сначала остановил все запущенные процессы postgresql, связав эту команду sudo /etc/init.d/postgresql restart
введите команду bg, чтобы проверить, работают ли другие процессы postgresql
затем следует dropdb dbname для удаления базы данных
Это работает для меня в командной строке Linux
источник
PostgreSQL 9.2 и выше:
SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'
источник
Вот мой хак ... = D
Я поставил этот ответ, потому что включить команду (выше), чтобы заблокировать новые подключения и потому, что любая попытка с командой ...
... не работает, чтобы заблокировать новые подключения!
Спасибо @araqnid @GoatWalker! = D
https://stackoverflow.com/a/3185413/3223785
источник
Предстоящий PostgreSQL 13 представит
FORCE
опцию.источник
В моем случае мне пришлось выполнить команду, чтобы сбросить все соединения, включая мое активное соединение администратора
который разорвал все соединения и показал мне фатальное сообщение об ошибке:
FATAL: terminating connection due to administrator command SQL state: 57P01
После этого можно было сбросить базу данных
источник
У меня ничего не получалось, за исключением того, что я вошел в систему с помощью pgAdmin4, и на панели инструментов я отключил все соединения, кроме pgAdmin4, а затем смог переименовать его, щелкнув правой кнопкой мыши на базе данных и свойствах, и набрал новое имя.
источник