47 lines
1.9 KiB
Bash
Executable File
47 lines
1.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
for command_name in pg_dump pg_restore createdb dropdb psql; do
|
|
command -v "$command_name" >/dev/null || {
|
|
echo "Required PostgreSQL tool is missing: $command_name" >&2
|
|
exit 1
|
|
}
|
|
done
|
|
|
|
source_database="${TIKU_BACKUP_SOURCE_DATABASE:-tiku}"
|
|
if [[ ! "$source_database" =~ ^[A-Za-z0-9_]+$ ]] || [[ "$source_database" == "postgres" ]]; then
|
|
echo "TIKU_BACKUP_SOURCE_DATABASE must be a safe non-maintenance database name." >&2
|
|
exit 1
|
|
fi
|
|
|
|
restore_database="tiku_restore_drill_$(date -u +%Y%m%d%H%M%S)_$$"
|
|
if [[ ! "$restore_database" =~ ^tiku_restore_drill_[0-9]+_[0-9]+$ ]]; then
|
|
echo "Refusing unsafe restore database name." >&2
|
|
exit 1
|
|
fi
|
|
|
|
drill_directory="$(mktemp -d "${TMPDIR:-/tmp}/tiku-restore-drill.XXXXXX")"
|
|
dump_path="$drill_directory/tiku.dump"
|
|
cleanup() {
|
|
dropdb --if-exists --maintenance-db=postgres "$restore_database" >/dev/null 2>&1 || true
|
|
rm -rf "$drill_directory"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
echo "Creating compressed backup from database '$source_database'..."
|
|
pg_dump --format=custom --compress=6 --no-owner --no-acl --file="$dump_path" "$source_database"
|
|
test -s "$dump_path"
|
|
|
|
echo "Restoring backup into temporary database '$restore_database'..."
|
|
createdb --maintenance-db=postgres "$restore_database"
|
|
pg_restore --exit-on-error --no-owner --no-acl --dbname="$restore_database" "$dump_path"
|
|
|
|
migration_count="$(psql --no-psqlrc --tuples-only --no-align --dbname="$restore_database" --command='SELECT count(*) FROM "__EFMigrationsHistory";')"
|
|
tenant_count="$(psql --no-psqlrc --tuples-only --no-align --dbname="$restore_database" --command='SELECT count(*) FROM tenants;')"
|
|
if [[ ! "$migration_count" =~ ^[1-9][0-9]*$ ]] || [[ ! "$tenant_count" =~ ^[0-9]+$ ]]; then
|
|
echo "Restore verification failed: migrations='$migration_count', tenants='$tenant_count'." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Restore rehearsal passed: migrations=$migration_count, tenants=$tenant_count. Temporary database will be removed."
|