Skip to content

Instantly share code, notes, and snippets.

@kuuruni
Last active November 11, 2025 01:34
Show Gist options
  • Select an option

  • Save kuuruni/bc6f98ef3dffd2cf754ac33553d16f57 to your computer and use it in GitHub Desktop.

Select an option

Save kuuruni/bc6f98ef3dffd2cf754ac33553d16f57 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -euo pipefail
usage() {
echo "Usage: $0 [options] <database>"
echo
echo "Required options:"
echo " --host <host> Database host"
echo " --port <port> Database port"
echo " --user <username> Database username"
echo " --password <password> Database password"
echo
echo "Backup mode options:"
echo " --only-data Backup only table data (no schema)"
echo " --only-structure Backup only table structure (no data)"
echo " --all Backup structure + data (default)"
echo
echo "Docker options:"
echo " --docker <container> Run pg_dump inside a Docker container"
echo
echo "Examples:"
echo " $0 --host 127.0.0.1 --port 5432 --user postgres --password secret mydb --all"
echo " $0 --docker pg_container --user postgres --password secret mydb --only-structure"
exit 1
}
MODE="all"
DOCKER_CONTAINER=""
# Parse arguments
if [[ $# -lt 1 ]]; then usage; fi
while [[ $# -gt 0 ]]; do
case "$1" in
--host)
HOST="$2"
shift 2
;;
--port)
PORT="$2"
shift 2
;;
--user)
USER="$2"
shift 2
;;
--password)
PASSWORD="$2"
shift 2
;;
--docker)
DOCKER_CONTAINER="$2"
shift 2
;;
--only-data)
MODE="data"
shift
;;
--only-structure)
MODE="structure"
shift
;;
--all)
MODE="all"
shift
;;
-h | --help) usage ;;
*)
DB_NAME="$1"
shift
;;
esac
done
[[ -z "${USER:-}" || -z "${PASSWORD:-}" || -z "${DB_NAME:-}" ]] && usage
DATE=$(date +%Y%m%d_%H%M%S)
OUTPUT="backup_${DB_NAME}_${MODE}_${DATE}.sql"
# Export password for pg_dump
export PGPASSWORD="$PASSWORD"
# Build pg_dump base command
PG_DUMP_CMD=(pg_dump -U "$USER")
[[ -n "${HOST:-}" ]] && PG_DUMP_CMD+=(-h "$HOST")
[[ -n "${PORT:-}" ]] && PG_DUMP_CMD+=(-p "$PORT")
case "$MODE" in
structure) PG_DUMP_CMD+=(--schema-only) ;;
data) PG_DUMP_CMD+=(--data-only) ;;
esac
PG_DUMP_CMD+=("$DB_NAME")
if [[ -n "$DOCKER_CONTAINER" ]]; then
echo "🐳 Running pg_dump inside Docker container '$DOCKER_CONTAINER'..."
docker exec -e PGPASSWORD="$PASSWORD" "$DOCKER_CONTAINER" "${PG_DUMP_CMD[@]}" >"$OUTPUT"
else
echo "💾 Running pg_dump locally..."
"${PG_DUMP_CMD[@]}" >"$OUTPUT"
fi
unset PGPASSWORD
echo "✅ Backup complete: $OUTPUT"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment