TL;DR We are Using a containerized MongoDB and do manual backups on our staging environment from time to time (See How to Backup and Restore a small MongoDB 2.6 Instance for more details). Since the data we gathered on staging becomes more and more valuable we decided to improve our situation.
Having said that we created a cron
job...
$ crontab -e
Add the nightly task:
15 02 * * * /usr/local/bin/backup-mongodb.sh
As described in detail in the How to Backup and Restore a small MongoDB 2.6 Instance the backup script is rather easy:
#!/bin/sh
export CONTAINER_NAME="mongodb-planets"
export DATABASE_NAME="planets"
export BACKUP_LOCATION="/home/planets/Projects/datenkollektiv/backups"
export TIMESTAMP=$(date +'%Y%m%d%H%M%S')
docker exec -t ${CONTAINER_NAME} mongodump --out /data/${DATABASE_NAME}-backup-${TIMESTAMP} --db ${DATABASE_NAME}
docker cp ${CONTAINER_NAME}:/data/${DATABASE_NAME}-backup-${TIMESTAMP} ${BACKUP_LOCATION}
If we messed up something on our staging
environment we drop the current database and restore a nightly build like this:
./drop-mongodb.sh
./restore-mongodb.sh -d ../backups/planets-backup-20170611124301
With the following script drop-mongodb.sh
:
#!/bin/sh
export CONTAINER_NAME="mongodb-planets"
export DATABASE_NAME="planets"
docker exec -i ${CONTAINER_NAME} mongo ${DATABASE_NAME} --eval "db.dropDatabase()"
and restore-mongodb.sh
:
#/bin/bash
export CONTAINER_NAME="mongodb-planets"
USAGE_MESSAGE="Usage: $0 [-h] [-d backupDirectory]
-h help
-d {backupDirectory} to use"
while getopts hd: args
do case "$args" in
d) BACKUP_DIRECTORY="$OPTARG";;
h) echo "${USAGE_MESSAGE}"
exit 1;;
:) echo "${USAGE_MESSAGE}"
exit 1;;
*) echo "${USAGE_MESSAGE}"
exit 1;;
esac
done
shift $(($OPTIND - 1))
docker cp ${BACKUP_DIRECTORY} ${CONTAINER_NAME}:/data
docker exec -i ${CONTAINER_NAME} mongorestore /data/$( basename ${BACKUP_DIRECTORY})
Sometime I need to transfer the staging
data to my local development environment.
Lucky me we had this use-case before: How to transfer a resource folder of a Java application to a remote server with a unix one liner
For the impatient:
$ ssh -C planets@datenkollektiv.de 'cd backups && tar -jc planets-backup-20170611124301' | tar -x -
does the trick.