前言
此文章只是做了一个简单的mongo定时备份和还原的步骤,仅供参考。
数据量太大的情况下建议采用全量备份 + 增量备份的方式。
一、安装Mongo教程
Docker下 MongoDB安装和启动_Marclew_的博客-CSDN博客
启动时-v参数将MongoDB的/data/db挂载到了宿主机/data/mongo/data目录中。
此文章是在此映射基础上做的备份和还原案例,各位小伙伴使用时参照文章修改对应目录即可。
二、创建所需目录
容器内:
docker exec mongodb mkdir /data/db/dump
docker exec mongodb mkdir /data/db/dump/tmp
docker exec mongodb mkdir /data/db/dump/list
宿主机:
mkdir /data/mongo/sh
mkdir /data/mongo/sh/backup
三、脚本文件存放位置
/data/mongo/sh/dump.sh
/data/mongo/sh/restore.sh
四、备份脚本(dump.sh)
#!/bin/sh
# dump 命令执行路径,根据mongodb安装路径而定
# mongo的容器名称
MONGODB_CONTAINER_NAME=mongodb
DUMP="docker exec ${MONGODB_CONTAINER_NAME} "
# 容器内存放备份根目录
CONTAINER_ROOT=/data/db
# 容器挂载Mongo的宿主机根目录
VOLUME_DIR=/data/mongo/data
# 宿主机额外保存的压缩包备份(实际还原目录)
BACKUP_DIR=/data/mongo/sh/backup
# 临时备份路径(注:docker 容器内的路径)
OUT_DIR=$CONTAINER_ROOT/dump/tmp
# 压缩后的备份存放路径(注:docker 容器内的路径)
TAR_DIR=$CONTAINER_ROOT/dump/list
# 当前系统时间
DATE=`date +%Y%m%d%H%M`
# ip
IP=127.0.0.1
# 端口
PORT=27017
# 数据库账号
DB_USER=root
# 数据库密码
DB_PASS=123456
# 数据库名称,多个用空格隔开
DB_NAME_ARR=("test")
# 代表删除7天前的备份,即只保留近 7 天的备份
DAYS=7
# 最终保存的数据库备份文件
for DBNAME in ${DB_NAME_ARR[@]}
do
# 删除临时目录内容
rm -rf $OUT_DIR/*
# 文件名称:数据库名_时间
FILE_NAME="${DBNAME}_${DATE}"
# 导出数据的临时目录
TARGET_DIR="$OUT_DIR/$FILE_NAME"
# 临时目录打包压缩后的文件
TARGZ_FILE="${FILE_NAME}.tar.gz"
# 存放压缩后文件的目录
TARGET_FILE="$TAR_DIR/$TARGZ_FILE"
# 执行导出命令
# $DUMP -h 127.0.0.1:27017 -u $DB_USER -p $DB_PASS -d $DBNAME -o $TARGET_DIR
$DUMP mongodump -h $IP:$PORT -u $DB_USER -p $DB_PASS --authenticationDatabase admin -d $DBNAME -o $TARGET_DIR
# 判断导出结果
flag=`echo $?`
if [ $flag == "0" ];then
echo "database $DBNAME success backup to $TARGET_DIR"
else
echo "database $DBNAME backup fail!"
fi
# 压缩格式为 .tar.gz 格式
# -P tar 默认采用相对路径压缩打包,需要(-P)允许使用绝对路径
# -v 输出 verbose 日志
$DUMP tar -zcPf $TARGET_FILE $TARGET_DIR/$DBNAME
# 将容器内的压缩文件,复制到宿主机与备份脚本同级的dump目录下
docker cp ${MONGODB_CONTAINER_NAME}:$TARGET_FILE $BACKUP_DIR
echo "docker cp ${MONGODB_CONTAINER_NAME}:$TARGET_FILE $BACKUP_DIR"
done
# 删除挂载目录 $DAYS 天前的 临时 备份文件
find $VOLUME_DIR/dump/tmp -mtime +$DAYS -delete;
# 删除挂载目录 $DAYS 天前的 压缩 备份文件
find $VOLUME_DIR/dump/list -mtime +$DAYS -delete;
# 删除实际备份目录 $DAYS 天前的 压缩 备份文件
find $BACKUP_DIR -mtime +$DAYS -delete;
五、查看备份
容器内:
进入容器:docker exec -it mongodb /bin/bash
进入目录:cd /data/db/dump/tmp
宿主机:
cd data/mongo/data/dump/tmp
六、还原脚本(restore.sh)
#!/bin/bash
# Mongo的容器名称
MONGODB_CONTAINER_NAME=mongodb
DUMP="docker exec ${MONGODB_CONTAINER_NAME} "
# IP
IP=127.0.0.1
# 端口
PORT=27017
# 数据库账号
DB_USER=root
# 数据库密码
DB_PASS=123456
# 数据库名称
DB_NAME=test
# 备份所在路径
OUT_DIR=/data/db/dump/tmp
echo "mongo 恢复备份数据 开始..."
read -t 7 -p "请输入您要恢复的备份名称:" ZIPNAME
echo $ZIPNAME
$DUMP mongorestore -h $IP:$PORT -u$DB_USER -p$DB_PASS --authenticationDatabase admin -d $DB_NAME $OUT_DIR/$ZIPNAME/$DB_NAME/ --drop
注意:restore.sh脚本中设置一个控制台输入,查看/data/mongo/data/dump/tmp文件夹(挂载目录)下备份好的文件夹名称,复制最新的备份文件夹名称,运行restore.sh后粘贴即可。
read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒)
案例:
提示7秒内,读取控制台输入的备份文件夹名称
这里还原的其实是容器内/data/db/dump/tmp目录下的备份文件,并不是宿主机内的。
还原命令中添加了--drop参数,此参数会先清空库数据,请谨慎操作。
七、设置Linux定时运行脚本
1.设置文件可执行
cd /data/mongo/sh
chmod u+x dump.sh
2.编辑定时任务
crontab -e
3.新增定时任务
示例为每天凌晨两点执行一次
00 02 * * * /data/mongo/sh/dump.sh >/data/mongo/sh/dump.log 2>&1
4.查看执行日志
cat /data/mongo/sh/dump.log