#!/bin/bash # ============================================================================== # MongoDBRestore — obnovení MongoDB databází ze zálohy # ============================================================================== # # CO DĚLÁ: # Pro každou databázi v zadané zálohovací složce najde nejnovější archiv # a obnoví ho do MongoDB pomocí mongorestore. # # POUŽITÍ: # bash mongodbrestore_from_backup.sh # Příklad: # bash mongodbrestore_from_backup.sh /mnt/user/Backup/Critical/MongoDBBackup/tower # # Skript sám najde nejnovější zálohu pro každou DB v zadaném adresáři. # Struktura: //YYYY-MM-DD_HHMM/.archive.gz # # TECHNICKÉ DETAILY: # - mongorestore --archive --gzip: čte binární archiv ze stdin # - docker exec -i: interaktivní stdin = stream ze souboru na hostiteli # - --drop: před obnovením smaže existující kolekce (čistý restore) # - --numParallelCollections=4: rychlejší restore přes paralelní zpracování # - Obnovuje: indexy, metadata, validátory, všechny kolekce # # POZOR: # --drop smaže data v cílové DB před obnovením! # Používat jen při vědomém restore, ne jako test konzistence. # ============================================================================== set -x # ============================================================================== # KONFIGURACE # ============================================================================== CONTAINER_NAME="MongoDB" # název Docker kontejneru na Tower MONGO_HOST="localhost" MONGO_PORT="27017" # Cesta k záloze — předávána jako první argument skriptu. # Může být bud přímo adresář konkrétní zálohy, nebo základní cesta s DB podsložkami. BACKUP_BASE_PATH="$1" # ============================================================================== # VALIDACE VSTUPŮ # ============================================================================== if [ -z "$BACKUP_BASE_PATH" ]; then echo "Usage: $0 " echo "Example: $0 /mnt/user/Backup/Critical/MongoDBBackup/tower" exit 1 fi if [ ! -d "$BACKUP_BASE_PATH" ]; then echo "ERROR: Backup path does not exist: $BACKUP_BASE_PATH" exit 1 fi echo "Starting MongoDB restore from: $BACKUP_BASE_PATH" START_TS=$(date '+%Y-%m-%d %H:%M:%S') # ============================================================================== # RESTORE PROCESS # ============================================================================== # Iterujeme přes podadresáře base_path — každý podadresář = jedna databáze. # Struktura: $BACKUP_BASE_PATH/DB_NAME/YYYY-MM-DD_HHMM/DB_NAME.archive.gz for DB_DIR in "$BACKUP_BASE_PATH"/*; do if [ ! -d "$DB_DIR" ]; then continue # přeskoč soubory (pokud by nějaké byly) fi DB_NAME=$(basename "$DB_DIR") echo "------------------------------------------" echo "Processing database: $DB_NAME" # Najdi nejnovější zálohu pro tuto DB. # ls -td: vypíše adresáře seřazené dle času, nejnovější první. # head -1: vezmeme jen první = nejnovější. LATEST_BACKUP=$(ls -td "$DB_DIR"/*/ 2>/dev/null | head -1) if [ -z "$LATEST_BACKUP" ]; then echo "WARNING: No backup found for $DB_NAME" continue fi BACKUP_FILE="$LATEST_BACKUP/${DB_NAME}.archive.gz" # archiv pro tuto DB ERR_FILE="$LATEST_BACKUP/${DB_NAME}.restore.err" # sem jde stderr mongorestore if [ ! -f "$BACKUP_FILE" ]; then echo "ERROR: Backup archive not found: $BACKUP_FILE" continue fi echo "Found backup: $BACKUP_FILE" echo "Backup date: $(stat -c %y "$BACKUP_FILE" | cut -d' ' -f1-2)" echo "Backup size: $(du -h "$BACKUP_FILE" | cut -f1)" # -------------------------------------------------------------------------- # RESTORE DO MONGODB # Archiv streamujeme ze souboru na hostiteli do stdin kontejneru. # docker exec -i: umožňuje stdin stream (bez -i by stdin byl /dev/null) # < "$BACKUP_FILE": přesměrujeme obsah archivu na stdin mongorestore # 2> "$ERR_FILE": stderr mongorestore jde do .restore.err pro diagnostiku # -------------------------------------------------------------------------- echo "Restoring $DB_NAME to MongoDB..." docker exec -i "$CONTAINER_NAME" mongorestore \ --host="$MONGO_HOST" \ --port="$MONGO_PORT" \ --archive \ --gzip \ --drop \ --numParallelCollections=4 \ < "$BACKUP_FILE" \ 2> "$ERR_FILE" RESTORE_EXIT=$? # -------------------------------------------------------------------------- # VALIDACE VÝSLEDKU # -------------------------------------------------------------------------- if [ $RESTORE_EXIT -eq 0 ]; then echo "SUCCESS: $DB_NAME restored successfully" rm -f "$ERR_FILE" # .err soubor je prázdný — uklidíme else echo "ERROR: Restore failed for database: $DB_NAME" echo "Exit code: $RESTORE_EXIT" echo "Error output:" [ -s "$ERR_FILE" ] && cat "$ERR_FILE" || echo " (no stderr output)" fi done echo "------------------------------------------" echo "All restore tasks completed at $(date)" echo "Started at: $START_TS" set +x