You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.4 KiB

  1. #!/bin/bash
  2. [ "$MONGO_HOST" ] || {
  3. echo "You must define \$MONGO_HOST variable." >&2
  4. exit 1
  5. }
  6. mongo_databases() {
  7. echo "show dbs" | mongo --quiet --host "$MONGO_HOST" | cut -f 1 -d " "
  8. }
  9. dbs=$(mongo_databases)
  10. BACKUP_ROOT=/var/backups/mongo
  11. mkdir -p "$BACKUP_ROOT"
  12. for db in $dbs; do
  13. if [[ "$db" == "local" || "$db" == "config" ]]; then
  14. continue
  15. fi
  16. for exclude_db in $exclude_dbs; do
  17. if [ "$exclude_db" == "$db" ]; then
  18. echo "No backup for database $db as it is listed in 'exclude-dbs'."
  19. continue 2
  20. fi
  21. done
  22. dst="$BACKUP_ROOT/$db"
  23. [ -d "$dst.old" ] && rm -rf "$dst.old"
  24. [ -d "$dst" ] && mv "$dst" "$dst.old"
  25. mkdir -p "$dst.inprogress"
  26. (( start = SECONDS ))
  27. echo "Dumping database $db..." >&2
  28. mongodump --host "$MONGO_HOST" --db "$db" --out "$dst.inprogress" &&
  29. mv "$dst.inprogress/$db/"* "$dst.inprogress/" &&
  30. rmdir "$dst.inprogress/$db"
  31. errlvl="${PIPESTATUS[0]}"
  32. (( elapsed = SECONDS - start ))
  33. if [ "$errlvl" != "0" ]; then
  34. echo " !! Error when dumping database $db." >&2
  35. rm -rf "$dst.inprogress" &&
  36. [ -d "$dst.old" ] && rm -rf "$dst.old"
  37. else
  38. mv "$dst.inprogress" "$dst"
  39. [ -d "$dst.old" ] && rm -rf "$dst.old"
  40. printf " ..dumped %-35s (%12s in %10s)\n" "$db" "$(du -sh "$dst" | cut -f 1)" "${elapsed}s" >&2
  41. fi
  42. done