phppgadmin: Как это выгнать пользователей из postgres, чтобы он мог db_drop? - PullRequest
4 голосов
/ 12 марта 2010

У меня есть одна база данных Posgresql (я владелец), и я хотел бы удалить ее и заново создать из дампа.

Проблема в том, что есть пара приложений (два веб-сайта, rails и perl), которые регулярно обращаются к БД. Поэтому я получаю сообщение об ошибке «Доступ к базе данных осуществляют другие пользователи».

Я читал, что одна возможность - получить список процессов и убить их по отдельности. Я хотел бы сделать что-нибудь почище, если это возможно.

Phppgadmin, кажется, делает то, что я хочу: я могу отбрасывать схемы, используя его веб-интерфейс, даже когда веб-сайты работают, без ошибок Итак, я исследую, как работает его код. Однако я не эксперт по PHP.

Я пытаюсь понять код phppgadmin, чтобы увидеть, как он это делает. Я обнаружил строку (257 в Schemas.php), где написано:

$data->dropSchema(...)

$data - глобальная переменная, и я не смог найти, где она определена.

Любые указатели будут с благодарностью.

Ответы [ 2 ]

12 голосов
/ 12 марта 2010

Сначала найдите все текущие процессы, используя вашу базу данных:

SELECT usename, procpid FROM pg_stat_activity WHERE datname = current_database();

Во-вторых, убейте процессы, которые вам не нужны:

SELECT pg_terminate_backend(your_procpid);

Это работает с версии 8.4, в противном случае pg_terminate_backend () неизвестен, и вам придется завершить процесс на уровне ОС.


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

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='YourDB';

В более поздних версиях Postgres (по крайней мере, 9.2+, вероятно, ранее) имена столбцов изменились, и запрос:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='YourDB';
0 голосов
/ 12 марта 2010

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

См: http://www.postgresql.org/docs/current/static/sql-lock.html

...