Вернуть старый primary как реплику после failover через pg_rewind
PostgreSQLРепликацияКоманда
# Prerequisite (must be set BEFORE the incident): wal_log_hints = on OR data checksums; full_page_writes = on
pg_controldata $PGDATA | grep -E 'wal_log_hints|checksum'
# 1) The old primary must be stopped:
pg_ctl -D $PGDATA stop -m fast
# 2) Dry run first:
pg_rewind --target-pgdata=$PGDATA --source-server='host=<new_primary_host> port=5432 user=postgres dbname=postgres' --progress --dry-run
# 3) Actual rewind + standby configuration (standby.signal + primary_conninfo):
pg_rewind --target-pgdata=$PGDATA --source-server='host=<new_primary_host> port=5432 user=postgres dbname=postgres' --progress --write-recovery-conf
# 4) Review postgresql.auto.conf copied from the source (port, primary_slot_name), then start:
pg_ctl -D $PGDATA startЧто делает
Приводит каталог данных старого primary в соответствие с новым primary, копируя с нового primary блоки, изменённые после точки расхождения timeline; за минуты превращает его в реплику без полного basebackup.
Когда использовать
Когда старый primary возвращается после failover/promote и отстаёт от нового timeline с разошедшимися изменениями.
Внимание
Транзакции, оставшиеся на старом primary после failover и так и не дошедшие до нового primary, удаляются безвозвратно. pg_rewind также копирует с источника файлы конфигурации (postgresql.conf, postgresql.auto.conf, pg_hba.conf); перед запуском исправьте настройки порта и слота. Если WAL, нужный с точки расхождения, на источнике уже отсутствует, получите его из архива с -c (--restore-target-wal). Для подключения к источнику нужен суперпользователь или роль с привилегиями на функции, перечисленные в документации. В Patroni это выполняется автоматически при use_pg_rewind: true.