DBAtlas · Atlas de operações de banco de dados

Reintegrar o antigo primário como réplica após um failover com pg_rewind

PostgreSQLReplicação

Comando

# 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

O que faz

Torna o diretório de dados do antigo primário consistente com o novo primário copiando do novo primário os blocos alterados após o ponto de divergência da timeline; transforma-o em réplica em minutos, sem basebackup completo.

Quando usar

Quando o antigo primário volta após um failover/promote e fica atrás da nova timeline com mudanças divergentes.

Atenção

As transações deixadas no antigo primário após o failover que nunca chegaram ao novo primário são removidas definitivamente. O pg_rewind também copia da origem os arquivos de configuração (postgresql.conf, postgresql.auto.conf, pg_hba.conf); corrija as configurações de porta e de slot antes de iniciar. Se o WAL necessário desde o ponto de divergência não estiver mais na origem, busque-o do archive com -c (--restore-target-wal). A conexão de origem precisa de um superusuário ou de uma role com os privilégios de função listados na documentação. No Patroni isso é feito automaticamente com use_pg_rewind: true.

Abrir no DBAtlas →

Relacionados