Last active
November 11, 2025 01:34
-
-
Save kuuruni/bc6f98ef3dffd2cf754ac33553d16f57 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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