Reincorporar el antiguo primario como réplica tras un failover con pg_rewind
PostgreSQLReplicaciónComando
# 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 startQué hace
Hace coherente el directorio de datos del antiguo primario con el nuevo primario copiando desde este los bloques cambiados tras el punto de divergencia del timeline; lo convierte en réplica en minutos sin un basebackup completo.
Cuándo usarlo
Cuando el antiguo primario vuelve tras un failover/promote y está por detrás del nuevo timeline con cambios divergentes.
Precaución
Las transacciones que quedaron en el antiguo primario tras el failover y nunca llegaron al nuevo primario se eliminan definitivamente. pg_rewind también copia los archivos de configuración (postgresql.conf, postgresql.auto.conf, pg_hba.conf) desde el origen; corrija el puerto y los ajustes de slot antes de arrancar. Si el WAL necesario desde el punto de divergencia ya no está en el origen, obténgalo del archivo con -c (--restore-target-wal). La conexión al origen necesita un superusuario o un rol con los privilegios sobre funciones indicados en la documentación. En Patroni esto se hace automáticamente con use_pg_rewind: true.