2014-11-28 3 views
1

DROP INDEX CONCURRENTLY впервые появился в PSQL 9.2, но мой сервер работает 9.1. К сожалению, эта операция блокирует мое приложение за непредсказуемое количество времени, это очень печальный факт, когда он делает это на производстве.Снижение индекса одновременно PostgreSQL 9.1

Есть ли способ отбросить индекс одновременно?

+1

Вы сказали это сами: вам нужно 9.2 (или, возможно, до 9.3 моментально). –

+0

Возможно, взлом/обходной путь существует ... –

ответ

0

Нет, нет простого обходного пути - в противном случае, скорее всего, DROP INDEX CONCURRENTLY был бы добавлен в 9.2.

Тем не менее, вы можете убить все сессии, чтобы заставить drop произойти незамедлительно.

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

Так, в одной сессии:

DROP INDEX my_index; 

В другой сессии, в качестве привилегированного пользователя, прекратить все другие сессии, используя следующую непроверенную запрос, который вы должны будете адаптироваться соответствующим образом и тест перед использованием:

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE procpid <> (
    SELECT pid 
    FROM pg_stat_activity 
    WHERE query = 'DROP INDEX my_index;') 
    AND 
    procpid <> pg_backend_pid(); 

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

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

Смежные вопросы