Files
Backup/MongTower/mongodbrestore_from_backup.sh
T
Administrator 36d7c43441 notebookvb
2026-05-23 05:28:39 +02:00

121 lines
3.5 KiB
Bash

#!/bin/bash
set -x
# ==========================================================
# CONFIGURATION
# ==========================================================
CONTAINER_NAME="MongoDB"
MONGO_HOST="localhost"
MONGO_PORT="27017"
# Cesta k záloze kterou chceš obnovit
# Např: /mnt/user/MongoDBBackup/tower/admin/2026-05-23_1530
BACKUP_BASE_PATH="$1"
# ==========================================================
# VALIDATION
# ==========================================================
if [ -z "$BACKUP_BASE_PATH" ]; then
echo "Usage: $0 <backup_base_path>"
echo "Example: $0 /mnt/user/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
# ==========================================================
# Najdi nejnovější backupy pro každou DB
# 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
fi
DB_NAME=$(basename "$DB_DIR")
echo "------------------------------------------"
echo "Processing database: $DB_NAME"
# Najdi nejnovější backup pro tuto DB
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"
EXTRACT_DIR="/tmp/mongodb_restore_$$/$DB_NAME"
ERR_FILE="$LATEST_BACKUP/${DB_NAME}.restore.err"
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)"
# ======================================================
# EXTRACT BACKUP
# ======================================================
mkdir -p "$EXTRACT_DIR"
echo "Extracting backup..."
tar -xzf "$BACKUP_FILE" -C "$EXTRACT_DIR" 2> "$ERR_FILE"
EXTRACT_EXIT=$?
if [ $EXTRACT_EXIT -ne 0 ]; then
echo "ERROR: Failed to extract backup"
cat "$ERR_FILE"
rm -rf "$EXTRACT_DIR"
continue
fi
# ======================================================
# RESTORE TO MONGODB
# Restores: indexy, metadata, validators, all collections
# ======================================================
echo "Restoring $DB_NAME to MongoDB..."
docker exec "$CONTAINER_NAME" mongorestore \
--host="$MONGO_HOST" \
--port="$MONGO_PORT" \
--db="$DB_NAME" \
--drop \
--numParallelCollections=4 \
"$EXTRACT_DIR" \
2> "$ERR_FILE"
RESTORE_EXIT=$?
# ======================================================
# VALIDATION
# ======================================================
if [ $RESTORE_EXIT -eq 0 ] && [ ! -s "$ERR_FILE" ]; then
echo "SUCCESS: $DB_NAME restored successfully"
rm -f "$ERR_FILE"
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
# Cleanup extract directory
rm -rf "$EXTRACT_DIR"
done
echo "------------------------------------------"
echo "All restore tasks completed at $(date)"
echo "Started at: $START_TS"
set +x