Docker下MongoDB定时备份及还原

前言

此文章只是做了一个简单的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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值