Verwaltet man viele Postgres-Datenbanken auf einem Server, benötigt man unbedingt ein Tool um alle Postgres-Datenbanken einzeln zu sichern. So ist im Ernstfall eine einzelne, beschädigte Datenbank sehr schnell wiederherstellbar ohne Andere in Mitleidenschaft zu ziehen.  Das folgende Script macht genau das:

#!/bin/bash
#
# backup-postgres.sh 1.0.2
#
# Dumps all databases to seperate files.
# All files are created in a folder named by the current date.
# Folders exceeding the defined hold time are purged automatically.
# 
# (c)2020 Harald Schneider
#

# Setup.start
#

HOLD_DAYS=7 
TIMESTAMP=$(date +"%F")
BACKUP_DIR="/Users/hschneider/Work/_BACKUP/Postgres"

DB_USR="postgres"
DB_PWD="postgres"
DB_HOST="127.0.0.1"
DB_PORT="5432"

# Use this on Linux
#
#DB_DUMP_CMD=/usr/bin/pg_dump
#DB_DUMPALL_CMD=/usr/bin/pg_dumpall
#DB_TOOL_CMD=/usr/bin/pg_psql

# Use this with the Postges App on macOS:
#
DB_DUMP_CMD=/Applications/Postgres.app/Contents/Versions/9.5/bin/pg_dump
DB_DUMPALL_CMD=/Applications/Postgres.app/Contents/Versions/9.5/bin/pg_dumpall
DB_TOOL_CMD=/Applications/Postgres.app/Contents/Versions/9.5/bin/psql

#
# Setup.end

# Backup
#
echo
echo "Starting backup ..."
mkdir -p "$BACKUP_DIR/$TIMESTAMP"

DBLIST=`PGPASSWORD=$DB_PWD  $DB_TOOL_CMD -p $DB_PORT -U $DB_USR -d $DB_PWD -h $DB_HOST -q -t -c 'SELECT datname from pg_database where datallowconn'`
for DB_NAME in $DBLIST
do
     echo " Dumping $DB_NAME ...";
     PGPASSWORD=$DB_PWD $DB_DUMP_CMD -U $DB_USR $DB_NAME -Fc| gzip > "$BACKUP_DIR/$TIMESTAMP/$DB_NAME.gz" 
done

echo " Dumping GLOBALS ...";
PGPASSWORD=$DB_PWD $DB_DUMPALL_CMD -U $DB_USR --globals-only| gzip > "$BACKUP_DIR/$TIMESTAMP/GLOBALS.gz" 

echo " Cleaning up ..."
find $BACKUP_DIR -maxdepth 1 -mindepth 1 -type d -mtime +$HOLD_DAYS -exec rm -rf {} \;
echo "-- DONE!"

Das Postgres Backupscript im Detail

Das Script erzeugt für jeder PostgreSQL-Datenbank einen eigenen, komprimierten SQL-Dump. Am Ende wird noch ein separater Dump mit allen Benutzer-Rollen erzeugt (GLOBALS.gz), so daß diese auch einzeln wiederherstellbar sind. Die Haltezeit der so erzeugten Backups ist frei einstellbar. Ältere Backupsets werden automatisch gelöscht.

Zur Konfiguration:

  • HOLD_DAYS: Die Haltezeit des Backups in Tagen.
  • TIMESTAMP: Das aktuelle Systemdatum.
  • BACKUP_DIR: Das Zielverzeichnis.
  • DB_USR, DB_PWD, DB_HOST, DB_PORT: Die Server-Verbindungsdaten.
  • DB_DUMP_CMD, DB_DUMPALL_CMD, DB_TOOL_CMD: Pfade zu den Postgres Query-Tools.

Das Script akzeptiert auch die Verbindungsdaten eine Remote PostgreSQL-Servers. Hier sollte jedoch beachtet werden, daß lokale und remote Version des Postgres Servers übereinstimmen.