You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
33 lines
1.3 KiB
33 lines
1.3 KiB
#!/bin/bash
|
|
set -Eeuo pipefail
|
|
|
|
export PGHOST=/var/run/postgresql
|
|
|
|
BACKUP_DIR=/var/lib/postgresql/backup/$(date +%Y-%m-%d_%H-%M-%S)/
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
echo "Starting complete backup of the whole PostgreSQL server..."
|
|
pg_basebackup --pgdata=$BACKUP_DIR --format=tar --manifest-checksums=SHA256 --verbose
|
|
echo "Starting backup of individual databases..."
|
|
psql -c "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1', 'postgres');" -t | while read db; do
|
|
if [ -z "$db" ]; then
|
|
continue
|
|
fi
|
|
|
|
echo "Backup of database $db..."
|
|
pg_dump -c --if-exists "$db" | gzip -c > "$BACKUP_DIR/dump-$db.sql.gz"
|
|
done
|
|
echo "Backup stored in $BACKUP_DIR."
|
|
|
|
# backup rotation / retention policy
|
|
POSTGRES_BACKUP_RETENTION=${POSTGRES_BACKUP_RETENTION:-7}
|
|
if [[ "$POSTGRES_BACKUP_RETENTION" -gt 0 ]] && ls -1ct /var/lib/postgresql/backup/*/backup_manifest &>/dev/null; then
|
|
echo "Applying backup retention policy: keeping the last $POSTGRES_BACKUP_RETENTION backups."
|
|
ls -1ct /var/lib/postgresql/backup/*/backup_manifest | tail -n "+$((POSTGRES_BACKUP_RETENTION + 1))" | while read old_backup; do
|
|
old_backup=$(dirname "$old_backup")
|
|
echo "Removing old backup: $old_backup"
|
|
rm -rf "$old_backup"
|
|
done
|
|
else
|
|
echo "No backup retention policy applied."
|
|
fi
|
|
|