ansible-role-postgresql-pgpool/templates/pgpool_recovery_stage_1.j2

55 lines
2.1 KiB
Django/Jinja

#!/bin/bash
# PGpool stage 1 recovery script
# Reference: http://michael.stapelberg.de/Artikel/replicated_postgresql_with_pgpool
#
TS=$(date +%Y-%m-%d_%H-%M-%S)
MASTER_HOST=$(hostname -f)
# $1 is {{ psql_data_dir }} while $3 is {{ psql_data_dir }}
#MASTER_DATA="{{ psql_data_dir }}"
MASTER_DATA="${1}"
RECOVERY_TARGET="${2}"
#RECOVERY_DATA="{{ psql_data_dir }}"
RECOVERY_DATA="${3}"
logger "pgpool_recovery_1: MASTER_DATA=$MASTER_DATA"
logger "pgpool_recovery_1: RECOVERY_DATA=$RECOVERY_DATA"
# Ensure that postgres is shut down on the target node
ssh -T $RECOVERY_TARGET sudo /bin/systemctl stop postgresql
logger "pgpool_recovery_1: stopped postgresql"
# Move the PostgreSQL data directory out of our way.
ssh -T "$RECOVERY_TARGET" "[ -d $RECOVERY_DATA ] && mv $RECOVERY_DATA $RECOVERY_DATA.$TS"
logger "pgpool_recovery_1: moved the old data directory on $RECOVERY_TARGET"
# We only use archived WAL logs during recoveries, so delete all
# logs from the last recovery to limit the growth.
rm "$MASTER_DATA/archive_log/*"
logger "pgpool_recovery_1: removed the archive logs"
# With this file present, our archive_command will actually
# archive WAL files.
touch "$MASTER_DATA/archive_log/backup_in_progress"
logger "pgpool_recovery_1: touched the backup_in_progress file"
logger "pgpool_recovery_1: ssh -T $RECOVERY_TARGET pg_basebackup -h $MASTER_HOST -p {{ psql_db_port }} -D $RECOVERY_DATA"
# Perform a backup of the database.
ssh -T "$RECOVERY_TARGET" "pg_basebackup -h $MASTER_HOST -p {{ psql_db_port }} -D $RECOVERY_DATA"
logger "pgpool_recovery_1: backup of the database from $MASTER_HOST to $RECOVERY_TARGET completed"
# Configure the restore_command to use the archive_log WALs we will copy
# over in 2nd_stage.sh.
{% if psql_version >= 12 %}
echo "restore_command = 'cp $RECOVERY_DATA/archive_log/%f %p'" | ssh -T $RECOVERY_TARGET "cat >> $RECOVERY_DATA/postgresql.auto.conf"
ssh -T "$RECOVERY_TARGET" "touch $RECOVERY_DATA/recovery.signal"
{% else %}
echo "restore_command = 'cp $RECOVERY_DATA/archive_log/%f %p'" | ssh -T $RECOVERY_TARGET "cat > $RECOVERY_DATA/recovery.conf"
{% endif %}
logger "pgpool_recovery_1: create the restore command on $RECOVERY_TARGET"