Реплика отстала, а нужный ей журнал уже удалён
Ошибка «requested WAL segment … has already been removed» на реплике PostgreSQL: ведущий сервер удалил журнал, который реплика ещё не получила. Реплика остановилась. Как восстановить и как не допустить снова.
Что это значит
Реплика PostgreSQL получает журнал изменений (WAL) с ведущего сервера. Если она отстала, а ведущий уже удалил старые сегменты журнала, догнать не получится: нужного куска нет. Реплика перестаёт обновляться, и если на неё рассчитывали при аварии, рассчитывать уже не на что.
Так бывает после долгого простоя реплики, сетевых проблем или всплеска изменений на ведущем, когда журнал вращается быстрее, чем реплика успевает.
Как проверить
- На ведущем: подключена ли реплика и насколько отстаёт:
select client_addr, state, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) lag
from pg_stat_replication;
- Есть ли слот репликации и активен ли он:
select * from pg_replication_slots; - Есть ли архив журнала, из которого реплика могла бы взять недостающее (
restore_command).
Что сделать
- Пересоздать реплику с ведущего сервера (
pg_basebackupили средствами вашего кластера). - Чтобы не повторилось: использовать слот репликации или настроить
restore_commandиз архива WAL. Слот держит журнал до тех пор, пока реплика его не заберёт. - У слота есть обратная сторона: если реплика пропадёт надолго, журнал будет копиться на ведущем и может заполнить диск. Ограничить это помогает
max_slot_wal_keep_sizeи алерт на неактивный слот.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать