mongodb备份和恢复:mongodump/mongorestore ( 二)

1 手动备份

mongo3.0手动备份命令:
mongodump -h localhost:27017 --authenticationDatabase "admin" -o /data/backup/dump/2019_01_09

mongorestore -h localhost:27017 /data/backup/dump/2019_01_09

2 Mac自动备份脚本

mac本地正常运行备份mongodb数据库的脚本是,其中可以which命令查看命令路径path:


#!/bin/bash

/usr/local/bin/mongo --version > mongo_version.txt
DUMP=/usr/local/bin/mongodump    #mongodump命令路径,非常重要,不然/bin/bash找不到路径
OUT_DIR=/data/backup/temp   #临时备份目录
TAR_DIR=/data/backup/final    #备份存放路径
TAR_BAK="mongodb_backup_$DATE.tar.gz"    #最终保存的数据库备份文件

DATE=`date +%Y_%m_%d`   #获取当前系统时间
DB_HOST=localhost:27017
DB_USER=    #数据库账号
DB_PASS=    #数据库密码
DAYS=15    #DAYS=15代表删除15天前的备份,即只保留近15天的备份

# 进入临时目录删空文件夹内容,根据当前时间重建文件
cd $OUT_DIR
rm -rf $OUT_DIR/*
mkdir -p $OUT_DIR/$DATE

# 备份全部数据库,并压缩
echo "backup start"
$DUMP -h $DB_HOST --authenticationDatabase "admin" -o $OUT_DIR/$DATE
$DUMP -h $DB_HOST --authenticationDatabase "admin" -o $TAR_DIR/$DATE

# 压缩为.tar.gz格式
tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE
# 解压格式
# tar -xzvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE

#删除DAYS天前的备份文件
find $TAR_DIR/ -mtime +$DAYS -delete

echo "backup end"

cd /data/backup
cmd=`date +%Y-%m-%d:%H:%M:%S`
cmd01=${cmd}
echo "$cmd01" >> time.txt
exit

  

crontab -e:每隔离一分钟备份一次

 */1 * * * * * /data/backup/monbp.sh >> /data/backup/m.log 2>&1

crontab -e:每隔离4小时的第一分钟备份一次,也即每4小时备份一次

1 */4 * * * * /data/backup/monbp.sh >> /data/backup/m.log 2>&1

3 ubuntu 自动备份脚本

#!/bin/sh

/usr/bin/mongo --version > /data/www/backup/mongo_version.txt
DUMP=/usr/bin/mongodump    #mongodump path
OUT_DIR=/data/www/backup/temp   #temp backup file
TAR_DIR=/data/www/backup/final    #backup file

DATE=`date +%Y_%m_%d_%H_%M_%S`
TAR_BAK="mongodb_backup_$DATE.tar.gz"

DB_HOST=localhost:27017
DB_USER=
DB_PASS=
DAYS=15

cd $OUT_DIR
rm -rf $OUT_DIR/*
mkdir -p $OUT_DIR/$DATE


echo "backup start" >> /data/www/backup/bp.log
# $DUMP -h $DB_HOST --authenticationDatabase "admin" -o $OUT_DIR/$DATE
$DUMP -h $DB_HOST -o $OUT_DIR/$DATE
echo "ing...." >> /data/www/backup/bp.log
tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE
find $TAR_DIR/ -mtime +$DAYS -delete
echo "backup end" >> /data/www/backup/bp.log

cd /data/www/backup
cmd=`date +%Y-%m-%d:%H:%M:%S`
cmd01=${cmd}
echo "$cmd01" >> /data/www/backup/bp.log

exit

# 挂载docker-compose:/data/www/backup: /data/www/backup
# sudo docker exec -it 0be535e8f2ba /bin/bash
# crontab -e
# 1 */4 * * * /data/www/backup/monbp.sh >> /data/www/backup/bp.log 2>&1

4 携带mongodb的docker容器里部署自动备份脚本流程

假设docker系统为ubuntu:

(1)脚本搞到mongo-docker里面,最好挂载,比如docker-compose
volumes:
- /data/www/backup:/data/www/backup
然后进入容器:sudo docker exec -it 0be535e8f2ba /bin/bash
(2)安装cron, 检查状态是否启动
安装:apt-get install cron
启动:service cron start
检查状态:service cron status
检查状态:sudo launchctl list | grep cron
(3)确保安装vi or vim,有时候crontab -e 会提示没有编辑器或者没有选择编辑器
apt-get install -y vim
(4)编辑定时文件crontab -e,写入保存,每隔4小时的第一分钟备份一次,写入日志到bp.log
1 */4 * * * /data/www/backup/monbp.sh >> /data/www/backup/bp.log 2>&1
(5)查看写入日志文件bp.log测试,一般可以用简单语句测试是否执行正常
比如每分钟输出一个时间
*/1 * * * * /bin/date >> /data/www/backup/datetest.log 2>&1

注意事项:

(1)linux系统中执行某个程序,出现~/bin/sh: xxx: not found
如果不指定,那么就使用默认的/bin/sh。一个是/bin/bash,一个是/bin/sh,而sh又是一个符号链接,指向/ bin/dash,ubuntu默认采用的是dash,一般通过/bin/sh的符号链接来指向,如果要切换它指向bash,Ubuntu 下缺省使用的是shell是dash,而不是bash。从/bin/sh软连接的指向可以看出这点ls -l /bin/sh, 结果是
lrwxrwxrwx 1 root root 4 Feb 17 2016 /bin/sh -> dash。
dash shell 虽然比bash shell更轻便,但是它并不支持所有的语法,运行shell程序时,经常报错。
解决办法:

ln -sf /bin/bash /bin/sh
dpkg-reconfigure dash

还有一情况是自己的#!/bin/bash写的格式不对,用下面的语法,如果显示是正确的就是对的
head -1 mondp.sh | od -c
0000000 # ! / b i n / b a s h \n

 

(2)/bin/sh: /data/www/backup/monbp.sh: No such file or directory
但是/data/www/backup/monbp.sh 明明存在
仔细检查文件名和路径确定有没有错,一个字母也不要错,尤其是眼睛容易混淆的bp,dp

还有一可能:
如果可执行文件xxx确实存在,很可能是缺少相关的库文件。
在宿主机上,可以用交叉工具链中的readelf查看,例如:
mips-linux-gnu-readelf -a monbp.sh
在目标机上,可以用ldd查看依赖关系
ldd xxx

(3) mongo: command not found/mongodump: command not found
脚本的环境路径变量不对,一定要用绝对路径
mac版本-mongo: /usr/local/bin/mongo
Linux版本-mongo: /usr/bin/mongo

 

posted @ 2019-01-11 10:49  Adamanter  阅读(2127)  评论(0编辑  收藏  举报