Verwaltet man viele PostgreSQL-Datenbanken auf einem Server, benötigt man unbedingt ein Tool um alle PostgreSQL-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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#!/bin/bash # # backup-postgres.sh 1.0.7 # # 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-2023 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/psql # Use this with the Postgres 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 # Use this with EDB Postgres on macOS: # #DB_DUMP_CMD=/Library/PostgreSQL/9.0/bin/pg_dump #DB_DUMPALL_CMD=/Library/PostgreSQL/9.0/bin/pg_dumpall #DB_TOOL_CMD=/Library/PostgreSQL/9.0/bin/psql # # Setup.end # Backup # echo echo "Starting backup ..." if [ ! -d "$BACKUP_DIR" ]; then echo "Backup destination does not exist!" exit fi mkdir -p "$BACKUP_DIR/$TIMESTAMP" DBLIST=`PGPASSWORD=$DB_PWD $DB_TOOL_CMD -p $DB_PORT -U $DB_USR -d postgres -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 -d $DB_NAME -h $DB_HOST| gzip > "$BACKUP_DIR/$TIMESTAMP/$DB_NAME.sql.gz" done echo " Dumping GLOBALS ..."; PGPASSWORD=$DB_PWD $DB_DUMPALL_CMD -U $DB_USR -h $DB_HOST --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 PostgreSQL Backup-Skript 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.