Eu também me deparei com esse problema. A chave aqui é realmente o archive_cleanup_command
no "recovery.conf" no standby. A espera executará o comando archive_cleanup_command
quando terminar o processamento de um segmento WAL a partir do primário, portanto, nesse ponto, você sabe que pode fazer backup desse segmento do WAL e de todos os segmentos anteriores. No meu "recovery.conf" eu tenho:
archive_cleanup_command = '/var/lib/postgresql/wal_backup_mirror.sh "%r"'
O conteúdo desse script é (versão simplificada):
CURRENT_WAL_FILE="$1"
for WAL_FILE in $(find /pg_logs/main -maxdepth 1 -type f | sort | awk "\archive_cleanup_command = '/var/lib/postgresql/wal_backup_mirror.sh "%r"'
<= \"/pg_logs/main/${CURRENT_WAL_FILE}\""); do
WAL_NAME=$(basename "$WAL_FILE")
gzip -c "$WAL_FILE" > "/backups/wal/${WAL_NAME}.gz"
#now upload the just created .gz to S3 or some other offsite storage
rm -f "${WAL_FILE}"
done
Observe que excluo o segmento WAL depois de fazer backup dele para manter meu diretório de log limpo no modo de espera, mas a única advertência é ter cuidado com uma configuração de replicação em cascata, uma vez que uma espera mais abaixo da cadeia pode ainda precisa desses arquivos.
Uma observação final, lembre-se de que o backup dos segmentos do WAL não é suficiente, isso deve ser feito em combinação com algum tipo de backup completo regular (pg_basebackup). Fazemos backups completos diariamente e depois fazemos backup dos segmentos do WAL conforme necessário ao longo do dia.