From aed0c982a8639a301b852528ad5dfdef3a30d0a2 Mon Sep 17 00:00:00 2001 From: skobkin Date: Wed, 6 Nov 2024 18:31:04 +0000 Subject: [PATCH] postgresql_backup. Allow multiple servers. --- postgresql_backup/pg_backup.sh | 74 +++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/postgresql_backup/pg_backup.sh b/postgresql_backup/pg_backup.sh index 2c55f29..fae5843 100644 --- a/postgresql_backup/pg_backup.sh +++ b/postgresql_backup/pg_backup.sh @@ -8,32 +8,60 @@ else exit 1 fi -# Set file extension based on DUMP_FORMAT -EXTENSION="dump" # Default extension for custom format -if [[ "$DUMP_FORMAT" == "sql" ]]; then - EXTENSION="sql.gz" +# Ensure BACKUP_PATH is set +if [ -z "$BACKUP_PATH" ]; then + echo "BACKUP_PATH not set in .env file!" + exit 1 fi -# Create backup directory if it doesn't exist -mkdir -p "$BACKUP_PATH" +# Extract unique database prefixes (DB1, DB2, ...) +DATABASE_PREFIXES=$(env | grep -o 'DB[0-9]*_' | sort -u) -# Get a list of all databases, excluding template databases -DATABASES=$(psql -h "$HOST" -p "$PORT" -U "$USER" -d postgres -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;") +# Loop through each database configuration prefix +for PREFIX in $DATABASE_PREFIXES; do + HOST_VAR="${PREFIX}HOST" + PORT_VAR="${PREFIX}PORT" + USER_VAR="${PREFIX}USER" + FORMAT_VAR="${PREFIX}DUMP_FORMAT" -# Loop over each database and create a backup -for DB in $DATABASES; do - BACKUP_FILE="$BACKUP_PATH/$DB.$EXTENSION" - - if [[ "$DUMP_FORMAT" == "custom" ]]; then - # Create a compressed custom-format backup - pg_dump -h "$HOST" -p "$PORT" -U "$USER" -Fc "$DB" -f "$BACKUP_FILE" - elif [[ "$DUMP_FORMAT" == "sql" ]]; then - # Create a plain-text SQL backup and compress it with gzip - pg_dump -h "$HOST" -p "$PORT" -U "$USER" "$DB" | gzip > "$BACKUP_FILE" - else - echo "Invalid DUMP_FORMAT specified: $DUMP_FORMAT" - exit 1 + HOST=${!HOST_VAR} + PORT=${!PORT_VAR} + USER=${!USER_VAR} + DUMP_FORMAT=${!FORMAT_VAR:-"custom"} # Default to "custom" if not set + + if [ -z "$HOST" ] || [ -z "$PORT" ] || [ -z "$USER" ]; then + echo "Incomplete configuration for $PREFIX. Skipping..." + continue fi - echo "Backup for database '$DB' created at '$BACKUP_FILE'" -done \ No newline at end of file + # Create a directory for each server using host and port + SERVER_DIR="$BACKUP_PATH/${HOST}_${PORT}" + mkdir -p "$SERVER_DIR" + + # Get a list of all databases for this server, excluding template databases + DATABASES=$(psql -h "$HOST" -p "$PORT" -U "$USER" -d postgres -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;") + + # Loop over each database and create a backup + for DB_NAME in $DATABASES; do + # Set file extension based on DUMP_FORMAT + EXTENSION="dump" + if [[ "$DUMP_FORMAT" == "sql" ]]; then + EXTENSION="sql.gz" + fi + + # Set backup file path within the server-specific directory + BACKUP_FILE="$SERVER_DIR/$DB_NAME.$EXTENSION" + + # Perform the backup based on the specified format + if [[ "$DUMP_FORMAT" == "custom" ]]; then + pg_dump -h "$HOST" -p "$PORT" -U "$USER" -Fc "$DB_NAME" -f "$BACKUP_FILE" + elif [[ "$DUMP_FORMAT" == "sql" ]]; then + pg_dump -h "$HOST" -p "$PORT" -U "$USER" "$DB_NAME" | gzip > "$BACKUP_FILE" + else + echo "Invalid DUMP_FORMAT for $PREFIX: $DUMP_FORMAT. Skipping..." + continue + fi + + echo "Backup for database '$DB_NAME' created at '$BACKUP_FILE'" + done +done