This guide describes how to create and restore backups of the BlueGreenCity KI PostGIS database using the automated backup script.
The scripts/backup_postgis.ps1 script creates automated backups in two formats:
Create both backup formats (default):
.\scripts\backup_postgis.ps1
.\scripts\backup_postgis.ps1 -Format custom
.\scripts\backup_postgis.ps1 -Format sql
Keep only the last 5 backups of each format:
.\scripts\backup_postgis.ps1 -Format both -KeepLast 5 -CleanupOld
Create both formats, keep last 3, and cleanup old files:
.\scripts\backup_postgis.ps1 -Format both -KeepLast 3 -CleanupOld
| Parameter | Type | Default | Description |
|---|---|---|---|
-Format |
String | both |
Backup format: both, custom, or sql |
-KeepLast |
Integer | 5 |
Number of backups to keep per format |
-CleanupOld |
Switch | false |
Enable automatic cleanup of old backups |
| Feature | Custom (.backup) | Plain SQL (.sql) |
|---|---|---|
| File Size | ~45 MB (compressed) | ~157 MB (uncompressed) |
| Restore Speed | Fast | Slower |
| Human Readable | No (binary) | Yes (text) |
| Selective Restore | Yes (tables/schemas) | No |
| Compatibility | PostgreSQL only | Universal |
| Best For | Regular backups, quick restore | Archival, version control |
Full database restore (run from the repo root; replace <yyyy-MM> and the timestamp):
docker exec -i bgcki-postgis pg_restore -U bgcki_admin -d bgcki -c < data\backups\postgis\yyyy-MM\bgcki_backup_TIMESTAMP.backup
Restore specific schema:
docker exec -i bgcki-postgis pg_restore -U bgcki_admin -d bgcki -n bgcki < data\backups\postgis\yyyy-MM\bgcki_backup_TIMESTAMP.backup
Restore specific table:
docker exec -i bgcki-postgis pg_restore -U bgcki_admin -d bgcki -t bgcki.trees_inventory < data\backups\postgis\yyyy-MM\bgcki_backup_TIMESTAMP.backup
Full database restore:
docker exec -i bgcki-postgis psql -U bgcki_admin -d bgcki < data\backups\postgis\yyyy-MM\bgcki_backup_TIMESTAMP.sql
Note: SQL format does not support selective restore. For selective restore, use the Custom format.
All backups are stored under data/backups/postgis/<yyyy-MM>/ (the script
writes relative to the repo root, grouped by year-month):
bluegreencity-ki/
└── data/backups/postgis/
└── 2025-10/
├── bgcki_backup_20251014_010159.backup (Custom format)
├── bgcki_backup_20251014_010159.sql (SQL format)
└── ...
Daily backup (automated via Task Scheduler):
.\scripts\backup_postgis.ps1 -Format both -KeepLast 7 -CleanupOld
Weekly backup (manual or scheduled):
# Create backup with descriptive name
$timestamp = Get-Date -Format "yyyyMMdd"
.\scripts\backup_postgis.ps1 -Format custom
Rename-Item "data\backups\postgis\<yyyy-MM>\bgcki_backup_*.backup" -NewName "bgcki_weekly_$timestamp.backup"
After creating a backup, verify its integrity:
# Check backup file size
Get-Item data\backups\postgis\yyyy-MM\bgcki_backup_TIMESTAMP.backup | Select-Object Name, Length, LastWriteTime
# Verify Custom format backup
docker exec bgcki-postgis pg_restore -U bgcki_admin -l backups/bgcki_backup_TIMESTAMP.backup
Error: Container 'bgcki-postgis' is not running!
Solution:
docker compose up -d
Error: Custom backup file is empty!
Possible causes:
Solution:
# Check Docker logs
docker logs bgcki-postgis
# Check disk space
Get-PSDrive C
# Restart container
docker compose restart postgis
Error during restore: ERROR: database "bgcki" already exists
Solution: Drop and recreate database before restore:
# Connect to postgres database
docker exec -it bgcki-postgis psql -U bgcki_admin -d postgres
# Drop and recreate database
DROP DATABASE IF EXISTS bgcki;
CREATE DATABASE bgcki;
\q
# Now restore
docker exec -i bgcki-postgis pg_restore -U bgcki_admin -d bgcki < data\backups\postgis\yyyy-MM\bgcki_backup_TIMESTAMP.backup
taskschd.msc)powershell.exe-ExecutionPolicy Bypass -File "C:\Path\To\bluegreencity-ki\scripts\backup_postgis.ps1" -Format both -KeepLast 7 -CleanupOldC:\Path\To\bluegreencity-kiTest the scheduled task manually:
# Run task
schtasks /run /tn "BlueGreenCity PostGIS Backup"
# Check task status
schtasks /query /tn "BlueGreenCity PostGIS Backup"
Current database size (as of October 2025):
bgcki.trees_inventory: 51,063 rowsbgcki.context_osm_highways: variesbgcki.analysis_tree_risk_scores: 51,063 rowsdocker-compose.yml (repo root; not part of the docs site)scripts/backup_postgis.ps1 (repo root; not part of the docs site)| Date | Version | Changes |
|---|---|---|
| 2025-10-14 | 1.0 | Initial backup script and documentation |