Docker mongoDB容器备份与恢复
文章目录
单词:
音标 | 翻译 | |
---|---|---|
dump | [dʌmp]:[dang’ mu’ pu] | 转储;倾倒;抛弃;甩 |
deny | denied | [dɪˈnaɪ] :[di’ nai] | 否认;否定;拒绝承认 |
directory | [dəˈrektəri] :[di’ ruai 'ke ‘ te 'rui] | 目录 |
1.数据备份:
1. 1 基本语法:
>mongodump -h dbhost -d dbname -o dbdirectory
实例:
1. 2 实例:
docker exec -it mymongo mongodump -h localhost -u root -p 123456 -o /tmp/test
参数 | 作用 | 备注 |
---|---|---|
mongodump | 备份命令 | |
**-h ** | MongoDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017 | |
-d | 需要备份的数据库实例,例如:test | |
-o | 备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据 |
1. 3 注意!!
**备份的内容是在容器中
**不要尝试在主机目录中寻找备份的内容
**需要docker exec -it [container] bash 进入容器内查找
2. 恢复数据:
2.1 基本语法:
>mongorestore -h <hostname><:port> -d dbname <path>
参数 | 作用 | 备注 |
---|---|---|
mongorestore | 恢复命令 | |
-h | MongoDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017 | |
-d | 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2 | |
| mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test | 不能同时指定
|
–dir | 指定备份的目录 | 不能同时指定
|
2.2 实例:
docker exec -it mymongo mongorestore -h localhost -u root -p 123456 --dir /tmp/test
不能同时指定
docker exec -it mymongo mongorestore -h localhost -u root -p 123456 /tmp/test
3. 示例:
3. 1 主机与容器内结构目录
3.1.1 主机目录
├── /
| ├── mongoDB
| ├── sh
| ├── dump.sh
| ├── dump [文件夹]
| ├── admin_202211041423.tar.gz
| ├── config_202211041435.tar.gz
| ├── water_202211041423.tar.gz
| ├── shop_202211041423.tar.gz
3.1.2 mongoDB容器内目录:
├── /
| ├── dump
| ├── list
| ├── admin_202211041423.tar.gz
| ├── config_202211041435.tar.gz
| ├── water_202211041423.tar.gz
| ├── tmp
| ├── admin_202211041423
| ├── config_202211041435
| ├── water_202211041423
3. 2 步骤:
3. 2.1 创建目录
提前搭建 3.1 中主机、容器内目录树; 否则脚本执行输出:No such file or directory
dump.sh脚本说明:
dump.sh代码片段 | 作用 | 备注 |
---|---|---|
date +%Y%m%d%H%M | 202211011749 [年月日几点几分] | |
for DBNAME in ${DB_NAME_ARR[@]} | ${DB_NAME_ARR[@]}数组中的所有数据库 | ${arr1[@]} 或 ${arr1[*]} 表示的是数组的所有元素 |
# dump.sh 执行文件
MONGODB_CONTAINER_NAME=你的mongoDB容器名字
DUMP="docker exec -it ${MONGODB_CONTAINER_NAME} "
# 临时备份路径(注:docker 容器内的路径)
OUT_DIR=/dump/tmp
# 压缩后的备份存放路径(注:docker 容器内的路径)
TAR_DIR=/dump/list
# 当前系统时间 等价:DATE=$(date +%Y%m%d%H%M)
DATE=`date +%Y%m%d%H%M`
# 数据库账号
DB_USER=user
# 数据库密码
DB_PASS=password
# 数据库名称,多个用空格隔开
DB_NAME_ARR=("admin config")
# 代表24小时内的保留
DAYS=1
# 最终保存的数据库备份文件
for DBNAME in ${DB_NAME_ARR[@]}
do
# 删除临时目录内容
rm -rf $OUT_DIR/*
# 文件名称:数据库名_时间
FILE_NAME="${DBNAME}_${DATE}"
# 导出数据的临时目录
TARGET_DIR="$OUT_DIR/$FILE_NAME"
mkdir -p $TARGET_DIR
# 临时目录打包压缩后的文件
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 $OUT_DIR/$DATE
$DUMP mongodump -h 43.143.147.51:27017 -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.sh同级的dump目录下
docker cp ${MONGODB_CONTAINER_NAME}:$TARGET_FILE $PWD/dump
done
# 删除 $DAYS 天前的备份文件 ; [ 删除从容器拷贝到主机dump.sh脚本执行同目录下的dump文件夹中的过期文件 ]
find $PWD/dump -mtime $DAYS -delete