Получение исключения при запросе в postgres [duplicate]

Шаг.1 $ git submodule update

Шаг 2 To be commented out the dependences of classpass

80
задан Joe Shaw 11 November 2015 в 17:11
поделиться

5 ответов

Выполнение запросов на сервере «горячего резервирования» несколько сложно: он может выйти из строя, потому что во время запроса некоторые необходимые строки могут быть обновлены или удалены на основном. Как первичный не знает, что запрос запускается вторично, он думает, что он может очистить (вакуум) старые версии своих строк. Затем вторичный должен повторить эту очистку и должен принудительно отменить все запросы, которые могут использовать эти строки.

Более длинные запросы будут отменены чаще.

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

Подробнее об этой теме и других обходных решениях объясняется в разделе «Горячий режим ожидания - обработка запросов» в документации.

49
ответ дан Tometzky 22 August 2018 в 01:01
поделиться
  • 1
    Пользователям PostgreSQL 9.1+: см. Ниже ответ eradman для практического решения. – Zoltán 8 July 2014 в 17:21

Данные таблицы на подчиненном подчиненном сервере горячего резервирования изменяются, когда выполняется длительный запрос. Решение (PostgreSQL 9.1+), чтобы убедиться, что данные таблицы не изменены, заключается в приостановке репликации и возобновлении после запроса:

select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume
4
ответ дан David Jaspers 22 August 2018 в 01:01
поделиться
  • 1
    Это требует прав суперпользователя. Поэтому в некоторых случаях это может быть не решение. – Joao Baltazar 9 April 2018 в 11:54

Нет необходимости запускать незанятые транзакции на ведущем устройстве. В postgresql-9.1 наиболее прямым способом решения этой проблемы является установка

hot_standby_feedback = on

. Это позволит мастеру узнать о длинных запросах. Из docs :

Первый параметр - установить параметр hot_standby_feedback, который не позволяет VACUUM удалять недавние мертвые строки и поэтому конфликты очистки не возникают.

Почему это не по умолчанию? Этот параметр был добавлен после первоначальной реализации, и это единственный способ, который резервный может повлиять на мастер.

56
ответ дан eradman 22 August 2018 в 01:01
поделиться

Как указано здесь около hot_standby_feedback = on:

Ну, недостатком этого является то, что резерв может раздувать мастера, что может быть удивительно для некоторых людей ,

И здесь :

С какими настройками max_standby_streaming_delay? Я предпочел бы установить значение по умолчанию, равное -1, чем по умолчанию hot_standby_feedback. Таким образом, то, что вы делаете в режиме ожидания, влияет только на режим ожидания

Итак, я добавил

max_standby_streaming_delay = -1

И не более pg_dump ошибка для нас, ни мастер-раздувание:)

37
ответ дан Gilles Quenot 22 August 2018 в 01:01
поделиться
  • 1
    @lennard, это сработало для меня. Я добавил эту конфигурацию в postgresql.conf подчиненного сервера, а затем перезапустил ведомый. – Ardee Aram 20 September 2016 в 03:49
  • 2
    Конечно, вы можете получить неограниченное отставание реплики. И если вы используете слот репликации для подключения реплики к мастеру, это может привести к чрезмерному удержанию xlog на главном компьютере, так что это действительно реально, если вы используете архивирование WAL. – Craig Ringer 18 November 2016 в 08:09
  • 3
    Как установить это на AWS RDS? – Kris MP 23 February 2017 в 03:57
  • 4
    @KrisMP Использовать psql – Yehonatan 12 April 2017 в 13:29
  • 5
    @KrisMP в группе параметров - docs.aws.amazon.com/AmazonRDS/latest/UserGuide/… – r3m0t 5 July 2017 в 17:13
17
ответ дан Max Malysh 22 August 2018 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: