备份的目的
- 防止硬件故障引起的数据丢失
- 防止人为错误误删数据
- 时间回溯
- 监管要求
备份机制和实现方式
全量备份实现方式
- 文件系统快照
- 复制数据文件
mongodump
解决方案
mongodump
在MongoDB中我们使用mongodump
命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。 mongodump
命令可以通过参数指定导出的数据库或者集合。
mongodump
命令脚本语法如下:
mongodump -h dbhost -d dbname -o dbdirectory
- -h:MongoDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:37017
- --db 或者 -d :需要备份的数据库实例,例如:rubin_db
- -o:备份的数据存放位置,例如:/root/bdatas 在备份完成后,系统自动在root目录下建立一个bdatas目录,这个目录里面存放该数据库实例的备份数据
mongodump
命令可选参数列表如下所示:
语法 | 描述 | 实例 |
mongodump --host HOST_NAME --port PORT_NUMBER | 该命令将备份所有MongoDB数据 | mongodump --host 192.168.211.136 --port 37017 |
mongodump --db DB_NAME --out BACKUP_DIRECTORY | 备份指定的数据库 | mongodump --port 37017 --d dbname --out /data/backup/ |
mongodump --collection COLLECTION --db DB_NAME | 该命令将备份指定数据库的集合 | mongodump --collection mycol -d rubin_db |
举例:
./bin/mongodump -h 127.0.0.1:37017 -d lg -o /root/bdatas
./bin/mongodump --host=192.168.211.136 --port=37017 -d local -c oplog.rs -o=/root/oplog_bak
mongorestore
MongoDB使用 mongorestore
命令来恢复备份的数据。
mongorestore
命令脚本语法如下:
mongorestore -h <hostname><:port> -d dbname <path>
- --host <:port>, -h <:port>:MongoDB所在服务器地址,默认为: localhost:37017
- --db 或者 -d :需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
- --drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
- <path>:
mongorestore
最后的一个参数,设置备份数据所在位置,例如:/root/bdatas/rubin_db。你不能和--dir
选项同时指定,--dir
也可以设置备份目录。注意: 恢复指定的数据库,需要在恢复的路径中出现数据库的名字 - --dir:指定备份的目录
举例:
./bin/mongorestore -h 127.0.0.1:37017 -d lg /root/bdatas/rubin_db
备份和恢复的重要选项 --oplog --oplogReplay --oplogLimit
mongodump
有一个值得一提的选项是 --oplog
,注意这是replica set或者master/slave模式专用,standalone模式运行MongoDB并不推荐。
来看看mongodump
的选项:
--oplog
选项只对全库导出有效,所以不能指定-d
选项
--oplog
的作用:oplog的幂等性:已存在的数据,重做oplog不会重复;不存在的数据重做oplog就可以进入数据库。
举例:
./bin/mongodump -h 127.0.0.1:37017 --oplog -o /root/bdatas
来看看mongorestore
的选项:
--oplogReplay
:可以重放oplog.bson中的操作内容
--oplogLimit
:回放的时间节点,即此时间之前的数据恢复,假设你后面有误操作,误操作的不恢复
通过 oplog 查询误操作的最后时间:
/root/mongodb/bin/bsondump oplog.rs.bson | grep ""op":"d"" | head
或者使用
db.oplog.rs.find({"op" : "d"}).sort({"ts":-1})
举例:
mongorestore -h localhost:37017 --oplogReplay --oplogLimit "1443024507:1" /root/dump/local
全量加增量备份和恢复案例
注意的问题:
删除复制集中原来的数据文件目录 重新建立数据目录
重新启动复制集中的实例 进行复制集的配置
var cfg ={"_id":"lagouCluster",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"192.168.211.136:37017","priority":10},
{"_id":2,"host":"192.168.211.136:37018"},
{"_id":3,"host":"192.168.211.136:37019"}
]
}
rs.initiate(cfg)
1.进入mongodb 插入两条数据
use rubin_db
db.rubin_collection.insert({name:"test1",salary:18000.5})
db.rubin_Collection.insert({name:"test2",salary:15000.5})
2.进行全量备份
./bin/mongodump --host=192.168.211.136 --port=37017 --out=/root/fullbackup
3.继续插入数据,并更新
db.rubin_collection.insert({name:"test3",salary:28000.5})
db.rubin_collection.insert({name:"test4",salary:35000.5})
db.rubin_collection.insert({name:"test5",salary:45000.5})
db.rubin_collection.update({name:"test3"},{$set:{salary:38000.5}})
db.rubin_collection.update({name:"test4"},{$set:{salary:45000.5}})
4.做增量备份
./bin/mongodump --host=192.168.211.136 --port=37017 -d local -c oplog.rs -
o=/root/oplog_bak
5.删除所有的数据
db.rubin_collection.remove({})
db.rubin_collection.find()
6.先恢复全量数据
./bin/mongorestore --host=192.168.211.136 --port=37017 --dir=/root/fullbackup
查看数据恢复
db.rubin_collection.find()
7.恢复数据到指定的时间点
重命名oplog.rs.bson为oplog.bson,删除oplog.rs.metadata.bson
mv /root/oplog_bak/local/oplog.rs.bson /root/oplog_bak/local/oplog.bson
rm /root/oplog_bak/local/oplog.rs.metadata.json -rf
找出第一次更新的时间
use local
db.oplog.rs.find({"op" : "u"}).sort({"ts":1})
恢复到指定的时间点的数据
./bin/mongorestore --host=192.168.211.136 --port=37017 --oplogReplay --
oplogLimit "实际查询出来的时间" /root/oplog_bak/local
查看数据恢复
use rubin_db
db.rubin_collection.find()
8.恢复所有的增量数据
./bin/mongorestore --host=192.168.211.136 --port=37017 --oplogReplay
/root/oplog_bak/local
查看数据恢复
db.rubin_collection.find()
定时备份
1.准备备份目录
mkdir -p /root/backup/mongod_bak/mongod_bak_now
/root/backup/mongod_bak/mongod_bak_list
2.编写备份脚本
vi /root/backup/mongobk.sh
#!/bin/sh
# dump 命令执行路径,根据mongodb安装路径而定
DUMP=/root/mongodb/bin/mongodump
# 临时备份路径
OUT_DIR=/root/backup/mongod_bak/mongod_bak_now
# 压缩后的备份存放路径
TAR_DIR=/root/backup/mongod_bak/mongod_bak_list
# 当前系统时间
DATE=`date +%Y_%m_%d%H%M%S`
# 数据库账号
# DB_USER=user
# 数据库密码
# DB_PASS=password
# 代表删除7天前的备份,即只保留近 7 天的备份
DAYS=7
# 最终保存的数据库备份文件
TAR_BAK="mongod_bak_$DATE.tar.gz"
cd $OUT_DIR
rm -rf $OUT_DIR/*
mkdir -p $OUT_DIR/$DATE
$DUMP -h 127.0.0.1 --port 37017 -o $OUT_DIR/$DATE
# 压缩格式为 .tar.gz 格式
tar -zPcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE
# 删除 7 天前的备份文件
find $TAR_DIR/ -mtime +$DAYS -delete
exit
3.修改脚本权限
chmod +x /root/backup/mongobk.sh
4.编辑crontab
crontab -e
#表示每天凌晨2点30执行备份
30 2 * * * /root/backup/mongobk.sh
测试的时候,可以改成一分钟备份一次
* * * * * /root/backup/mongobk.sh
5.查看crontab 的状态
service crond status
6.如果没有启动,可以使用下面的命令启动定时服务和加入开机自启动
# 启动定时任务
service crond start
# 加入开机自动启动
chkconfig --level 35 crond on
7.查看定时任务和删除定时任务
crontab -l
crontab -r
crontab -e
以上就是本博文的全部内容。欢迎小伙伴积极留言交流~~~
文章评论