Rubin's Blog

  • 首页
  • 关于作者
  • 隐私政策
享受恬静与美好~~~
分享生活的点点滴滴~~~
  1. 首页
  2. MongoDB
  3. 正文

MongoDB之数据备份与恢复

2021年 11月 9日 700点热度 0人点赞 0条评论

备份的目的

  • 防止硬件故障引起的数据丢失
  • 防止人为错误误删数据
  • 时间回溯
  • 监管要求

备份机制和实现方式

全量备份实现方式

  • 文件系统快照
  • 复制数据文件
  • 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

以上就是本博文的全部内容。欢迎小伙伴积极留言交流~~~

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: MongoDB
最后更新:2022年 6月 9日

RubinChu

一个快乐的小逗比~~~

打赏 点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • 备份的目的
  • 备份机制和实现方式
    • 全量备份实现方式
    • 解决方案
  • mongodump
  • mongorestore
  • 备份和恢复的重要选项 --oplog --oplogReplay --oplogLimit
  • 全量加增量备份和恢复案例
  • 定时备份
最新 热点 随机
最新 热点 随机
问题记录之Chrome设置屏蔽Https禁止调用Http行为 问题记录之Mac设置软链接 问题记录之JDK8连接MySQL数据库失败 面试系列之自我介绍 面试总结 算法思维
算法之二分查找 SpringCloud Alibaba之Sentinel Neo4j之数据管理和优化 MyBatis之缓存 Redis之Codis集群搭建 MongoDB之数据备份与恢复

COPYRIGHT © 2021 rubinchu.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

京ICP备19039146号-1