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

网络上mongorestore都写成mongorerstore抄袭成性

1 备份(mongodump)

该命令能够导出全部数据到指定文件夹中。
-h:指明数据库宿主机的IP

-u:指明数据库的用户名

-p:指明数据库的密码

-d:指明数据库的名字

-c:指明collection的名字

-o:指明到要导出的文件名

-q:指明导出数据的过滤条件

2 恢复(mongorestore)

参数说明:

-h:指明数据库宿主机的IP

-u:指明数据库的用户名

-p:指明数据库的密码

-d:指明数据库的名字

-c:指明collection的名字

-o:指明到要备份的文件名

-q:指明备份数据的过滤条件

3 基本例子

3.0之前例子

备份指定数据库(之前文件夹要自己创建):
备份本地的annosys数据库到/data/backup/dump文件,会自动出现annosys文件夹
mongodump -h localhost:27017 -d annosys -o /data/backup/dump

从指定目录恢复数据库annosys,注意目录是否包含数据库名
mongorestore -h localhost:27017 -d annosys --directoryperdb /data/backup/dump
mongorestore -h localhost:27017 -d annosys --drop data/backup/test/

3.0之后例子

mongodb3.0后mongorestore的--directoryperdb被砍了

mongodump -h localhost:27017 -d annosys -o /data/backup/dump
mongorestore -h localhost:27017 /data/backup/dump

4 备份全库的重要选项是--oplog:

mongodump有一个值得一提的选项是--oplog,注意这是replica set或者master/slave模式专用,standalone模式运行mongodb并不推荐。

来看看mongodump的选项:
--oplog选项只对全库导出有效,所以不能指定-d选项
--oplog的作用:oplog的幂等性:已存在的数据,重做oplog不会重复;不存在的数据重做oplog就可以进入数据库。所以当做完截止到某个时间点的oplog时,数据库就恢复到了截止那个时间点的状态。

来看看mongorestore的选项。
--oplogReplay:可以重放oplog.bson中的操作内容
--oplogLimit:回放的时间节点,即此时间之前的数据恢复,假设你后面有误操作,误操作的不回复

mongodump -h localhost:27017 -o /data/backup/dump --oplog
mongorestore -h localhost:27017 --drop data/backup/db/
mongorestore -h localhost:27017 --oplogReplay dump

查询误操作的最后时间
bsondump oplog.bson | grep "\"op\":\"d\"" | head
mongorestore -h localhost:27017 --oplogReplay --oplogLimit "1443024507:1" dump/

5 mongodb的mongodump/mongorestore和是mongoexport/mongoimport区别

mongodump/mongorestore之外还有一对组合是mongoexport/mongoimport,他们本质是存储BSON格式和JSON格式,所以BSON格式和JSON格式区别在哪里?

(1)mongodump/mongorestore导入/导出的是BSON格式, mongoexport/mongoimport导入/导出的是JSON格式。
(2)BSON则是二进制文件,体积小但对人类几乎没有可读性,JSON可读性强但体积较大。
(3)跨版本的mongodump/mongorestore要做请先检查文档看两个版本是否兼容(大部分时候)。在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。当无法使用BSON进行跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。。
(4)JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息。使用时应该注意。

总结:
如果使用mongodump/mongorestore,可以保留索引和数据和账户信息,省心省力。
如果使用mongodump/mongorestore, 要检查mongo文档版本是否兼容。记得把mongodb的版本记好,尤其是使用docker/mongo镜像,很容易出现版本问题,版本要写在配置文件中。


如果使用mongoexport/mongoimport,不能保留索引和数据和账户信息等。
如果使用mongoexport/mongoimport, 不用检查mongo文档版本是否兼容,有跨版本通用性。

但严格地说,mongoexport/mongoimport的主要作用还是导入/导出数据时使用,并不是一个真正意义上的备份工具,因此还是检查mongo版本,采用mongodump/mongorestore。

6 用shell脚本实现MongoDB数据库自动备份,没有pymongo脚本实现备份

一、创建MongoDB备份目录
mkdir -p /data/www/backup/temp
mkdir -p /data/www/backup/final
/data/backup/mongo_backup.sh


二、创建MongoDB数据库备份脚本mongo_backup.sh
#!/bin/bash

# 将版本信息写入文件
mongo --version > mongo_version.txt

# mac
DUMP=mongodump    #mongodump命令路径

# linux
# DUMP=/usr/local/mongodb/bin/mongodump    #mongodump命令路径

OUT_DIR=/data/backup/temp   #临时备份目录 
TAR_DIR=/data/backup/final    #备份存放路径 

DATE=`date +%Y_%m_%d`   #获取当前系统时间 
TAR_BAK="mongodb_backup_$DATE.tar.gz"    #最终保存的数据库备份文件 


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 -u $DB_USER -p $DB_PASS --authenticationDatabase "admin" -o # $OUT_DIR/$DATE

$DUMP -h $DB_HOST --authenticationDatabase "admin" -o $OUT_DIR/$DATE


# 压缩为.tar.gz格式   
tar -czvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE
# 解压 tar -xzvf $OUT_DIR/$DATE 竟然解压不了
  

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

echo "backup end"
exit

三、sudo chmod +x mongo_backup.sh
四、运行 sh mongo_backup.sh
五、目录查看
六、数据恢复
备份时间下的文件有:annosys,admin,mydb
mongorestore -h 127.0.0.1:27017 -d annosys /data/backup/temp/2019_01_09



七:进入数据库查看
show dbs
use annoys
db.annosys.find()

八、添加定时任务:

crontab -e
1 0 * * * /bin/bash /data/backup/mongo_backup.sh >> m.log

7 crontab

Cron 各项的描述
以下是 crontab 文件的格式:


分时日月周
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 
(1)minute: 区间为 0 – 59分 
(2)hour: 区间为0 – 23 时
(3)day-of-month: 区间为0 – 31日 
(4)month: 区间为1 – 12月 
(5)Day-of-week: 区间为0 – 7,周日可以是0或7
(6)* 代表全部

crontab -e
(1)每天凌晨1分开始备份,这是一个恰当的进行备份的时间,因为此时系统负载不大。
1 0 * * * /data/backup/monbp.sh

(2)每个工作日(Mon – Fri) 11:59 p.m 都进行备份作业。
59 11 * * 1,2,3,4,5 /data/backup/mongo_backup.sh
59 11 * * 1-5 /data/backup/mongo_backup.sh


(3)每5分钟运行一次命令

*/5 * * * * /data/backup/monbp.sh

(4)每个月的第一天 13:10 p.m 运行

10 13 1 * * /root/bin/full-backup.sh

(5)每个工作日 11 p.m 运行。
0 23 * * 1-5 /root/bin/incremental-backup.sh



crontab -l #查看你的任务
crontab -e#编辑你的任务
crontab -r#删除用户的crontab的内容

 

假如要每4个小时的第1分钟备份一次,那么应该是

1 */4 * * * /bin/bash /data/www/backup/monbp.sh >> /data/www/backup/bp.log 2>&1 

如果写成那么每4个小时的那一个小时的0-59分钟都备份一次也就是60次:

* */4 * * * /bin/bash /data/www/backup/monbp.sh >> /data/www/backup/bp.log 2>&1 

8 删除之前的日志文件find -mtime

find $TAR_DIR/ -mtime +$DAYS -delete

#mtime参数的理解应该如下:
-mtime n 按照文件的更改时间来找文件,n为整数。
n表示文件更改时间距离为n天, -n表示文件更改时间距离在n天以内,+n表示文件更改时间距离在n天以前。
例如:
-mtime 0 表示文件修改时间距离当前为0天的文件,即距离当前时间不到1天(24小时)以内的文件。
-mtime 1 表示文件修改时间距离当前为1天的文件,即距离当前时间1天(24小时-48小时)的文件。
-mtime+1 表示文件修改时间为大于1天的文件,即距离当前时间2天(48小时)之外的文件
-mtime -1 表示文件修改时间为小于1天的文件,即距离当前时间1天(24小时)之内的文件

为什么-mtime+1 表示文件修改时间为大于1天的文件,即距离当前时间48小时之外的文件,而不是24小时之外的呢?
因为n值只能是整数,即比1大的最近的整数是2,所有-mtime+1不是比当前时间大于1天(24小时),而是比当前时间大于2天(48小时)。

  

 

posted @ 2019-01-10 20:31  Adamanter  阅读(1421)  评论(0编辑  收藏  举报