Das folgende PowerShell Skript sichert alle Postgres-Datenbanken einzeln als komprimierte Archive. Pro Tag wird 1 eigener Ordner im Backupverzeichnis angelegt. Alte Postgres-Backups werden nach frei einstellbarer Haltezeit automatisch bereinigt:
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 |
# backup-postgres.ps1 1.0.0 # # Dumps all databases to separate files. # All files are created in a folder named by the current date. # Folders exceeding the defined hold time are purged automatically. # # Automate via Task Scheduler: # Start Executable: powershell.exe # Parameters: -ExecutionPolicy Bypass -File "C:\bin\backup-postgres.ps1" # # (c)2024 Harald Schneider # # Setup.start $HOLD_DAYS = 7 $TIMESTAMP = Get-Date -Format "yyyy-MM-dd" $BACKUP_DIR = "C:\Work\_backup\Postgres" $DB_USR = "postgres" $DB_PWD = "YOUR_PASSWORD" $DB_HOST = "127.0.0.1" $DB_PORT = "5432" $DB_DUMP_CMD = "C:\Program Files\PostgreSQL\16\bin\pg_dump.exe" $DB_DUMPALL_CMD = "C:\Program Files\PostgreSQL\16\bin\pg_dumpall.exe" $DB_TOOL_CMD = "C:\Program Files\PostgreSQL\16\bin\psql.exe" # Setup.end $env:PGPASSWORD = $DB_PWD # Backup Write-Host "`nStarting backup ..." # Check if backup directory exists if (-not (Test-Path -Path $BACKUP_DIR)) { Write-Host "Backup destination does not exist!" exit } # Create directory for the current backup New-Item -ItemType Directory -Path "$BACKUP_DIR\$TIMESTAMP" -Force # Get list of databases $DBLIST = & $DB_TOOL_CMD -p $DB_PORT -U $DB_USR -d postgres -h $DB_HOST -c "SELECT datname FROM pg_database WHERE datallowconn" -t -A -F " " # Iterate over each database and dump it foreach ($DB_NAME in $DBLIST) { Write-Host " Dumping $DB_NAME ..." & $DB_DUMP_CMD -U $DB_USR -d $DB_NAME -h $DB_HOST | & "C:\Program Files\7-Zip\7z.exe" a -tgzip -si "$BACKUP_DIR\$TIMESTAMP\$DB_NAME.sql.gz" } # Dump global objects Write-Host " Dumping GLOBALS ..." & $DB_DUMPALL_CMD -U $DB_USR -h $DB_HOST --globals-only | & "C:\Program Files\7-Zip\7z.exe" a -tgzip -si "$BACKUP_DIR\$TIMESTAMP\GLOBALS.gz" # Clean up old backups Write-Host " Cleaning up ..." Get-ChildItem -Directory $BACKUP_DIR | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$HOLD_DAYS) } | Remove-Item -Recurse -Force Write-Host "-- DONE!" |
Für die Datenkompression verwendet das Skript 7Zip.
Postgres Backup per Skript: Die Konfiguration
Zur Konfiguration werden folgende Variablen verwendet:
- $HOLD_DAYS: Die Haltezeit der archivierten Backups.
- $TIMESTAMP: Der Zeitstempel für den Backup-Ordner.
- $BACKUP_DIR: Der Zielordner.
- $DB_USR: Postgres Admin User
- $DB_PWD: Postgres Admin Passwort.
- $DB_HOST: Die Adresse des Postgres Servers.
- $DB_PORT: Der Port des Postgres Servers.
- $DB_DUMP_CMD: Der Pfad zu dump.exe, passend zur Postgres-Version.
- $DB_DUMPALL_CMD: Der Pfad zu dumpall.exe, passend zur Postgres-Version.
- $DB_TOOL_CMD: Der Pfad zu psql.exe, passend zur Postgres-Version.
Über die folgenden Kommandos kann das Skript dann in den Windows Aufgabenplaner eingetragen werden:
- Ausführbare Datei: powershell.exe
- Startparameter: -ExecutionPolicy Bypass -File “C:\bin\backup-postgres.ps1”
In diesem Beispiel befindet sich das Skript in C:\bin\.
Auf diese Weise sind Backups im laufenden Betrieb möglich, der Postgres-Dienst muss dazu nicht angehalten werden.