phppgadmin: как он выгоняет пользователей из postgres, чтобы он мог db_drop?

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

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

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

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

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

$data->dropSchema(...)

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

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


person kikito    schedule 12.03.2010    source источник


Ответы (2)


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

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';
person Frank Heikens    schedule 12.03.2010
comment
Я не знал о pg_terminate_backend. Конечно звучит как лучшее решение. Я приму это как лучший вопрос и опубликую свои достижения в другом ответе. Спасибо! - person kikito; 16.03.2010
comment
Ну получается, что я использовал Pg 8.3.9 :/ . В итоге я убил процессы (с помощью sudo и всего остального) ... немного грязно, но это работает. Спасибо, в любом случае. - person kikito; 30.03.2010

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

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

person Morfildur    schedule 12.03.2010