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

#!/bin/bash
[ "$MONGO_HOST" ] || {
echo "You must define \$MONGO_HOST variable." >&2
exit 1
}
mongo_databases() {
echo "show dbs" | mongo --quiet --host "$MONGO_HOST" | cut -f 1 -d " "
}
dbs=$(mongo_databases)
BACKUP_ROOT=/var/backups/mongo
mkdir -p "$BACKUP_ROOT"
for db in $dbs; do
if [[ "$db" == "local" || "$db" == "config" ]]; then
continue
fi
for exclude_db in $exclude_dbs; do
if [ "$exclude_db" == "$db" ]; then
echo "No backup for database $db as it is listed in 'exclude-dbs'."
continue 2
fi
done
dst="$BACKUP_ROOT/$db"
[ -d "$dst.old" ] && rm -rf "$dst.old"
[ -d "$dst" ] && mv "$dst" "$dst.old"
mkdir -p "$dst.inprogress"
(( start = SECONDS ))
echo "Dumping database $db..." >&2
mongodump --host "$MONGO_HOST" --db "$db" --out "$dst.inprogress" &&
mv "$dst.inprogress/$db/"* "$dst.inprogress/" &&
rmdir "$dst.inprogress/$db"
errlvl="${PIPESTATUS[0]}"
(( elapsed = SECONDS - start ))
if [ "$errlvl" != "0" ]; then
echo " !! Error when dumping database $db." >&2
rm -rf "$dst.inprogress" &&
[ -d "$dst.old" ] && rm -rf "$dst.old"
else
mv "$dst.inprogress" "$dst"
[ -d "$dst.old" ] && rm -rf "$dst.old"
printf " ..dumped %-35s (%12s in %10s)\n" "$db" "$(du -sh "$dst" | cut -f 1)" "${elapsed}s" >&2
fi
done