写在前面的话

和 MySQL 一样,mongodb 也是需要将数据进行备份的,毕竟天有不测风云,谁也不知道哪天机器就炸了。

备份恢复

mongodb 提供了两种备份恢复手段:mongoexport / mongoimport 和 mongodump / mongorestore

先看看应用场景:

mongoexport / mongoimport 导出的数据为 json / csv 文本。这意味着我们可以将 MySQL 中的数据按照一定的规律导出然后导入到 mongodb 中。

同时,它适用于跨大版本的版本升级这样的情景。

mongodump / mongorestore 则和 mysqldump 有点像,一般用于日常的备份恢复。

这里以一个单节点的 mongodb 为例:

mkdir /data/backup/mongodb-demo
mongo --port 27000

创建用户并增加验证:

use admin
db.createUser({user: "root",pwd: "",roles: [{role:"root",db:"admin"}]})

配置文件添加验证配置:

# 安全验证有关配置
security:
# 是否打开用户名密码验证
authorization: enabled

重启 mongodb 登录:

mongo -uroot -p123456 --port 27000

初始化数据库:

use hello
for(i=0;i<10000;i++){db.t1.insert({"uid":i,"name":"mongo","date":new Date()})} use world
for(i=0;i<10000;i++){db.t1.insert({"uid":i,"name":"zhangsan","date":new Date()})}

mongoexport

1. 备份指定库下面指定表到 json 文件:

mongoexport -uroot -p123456 --port 27000 --authenticationDatabase admin -d hello -c t1 -o /data/backup/mongodb-demo/hello-t1.json

参数说明:

-u:用户名

-p:密码

--port:端口

--authenticationDatabase:认证数据库

-d:指定数据库

-c:指定表

-f:指定要导出的列

-o:指定到要导出到哪个文件

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

此时可以查看:

cat /data/backup/mongodb-demo/hello-t1.json

结果如图:

2. 单表备份到 csv 文件中:

mongoexport -uroot -p123456 --port 27000 --authenticationDatabase admin -d hello -c t1 --type csv -f uid,name,date -o /data/backup/mongodb-demo/hello-t1.csv

新增了--type 指明导出类型,-f 指明要导出的字段,导出后使用 excel 打开:

mongoimport

1. 恢复 json 文件到 hello 下面 t3:

mongoimport -uroot -p123456 --port 27000 --authenticationDatabase admin -d hello -c t3 /data/backup/mongodb-demo/hello-t1.json 

结果如图:

2. 恢复 csv 文件到 hello 下面的 t4:

mongoimport -uroot -p123456 --port 27000 --authenticationDatabase admin -d hello -c t4 --type csv --headerline --file /data/backup/mongodb-demo/hello-t1.csv

注意,由于导出的 csv 包含了标题栏,所以需要 --headerline 说明。同时通过 --file 指定文件。

当 csv 文件中不包含第一行标题的时候,则需要使用 -f 手动指定标题。

由于 csv 和 json 文件是我们明确可以知道它的格式是怎样的,所以可以将其它数据库的数据按照这个格式导出,然后导入我们的 mongodb。

如 MySQL 导出:

select * from city into outfile '/tmp/city.csv' fields terminated by ',';

我们这样就能将查询的数据导出到 csv 文件,而且由于 mongodb 的 csv 文件时以逗号分隔,所以需要指定一下。

mongodump

1. 全库备份:

mongodump -uroot -p123456 --port 27000 --authenticationDatabase admin -o /data/backup/mongodb-demo/all-backup

结果如图:

可以看到,其实就是将所有的库导出成 json 和 bson 的形式。

2. 备份 hello 库:

mongodump -uroot -p123456 --port 27000 --authenticationDatabase admin -d hello -o /data/backup/mongodb-demo/hello

3. 备份指定表:

mongodump -uroot -p123456 --port 27000 --authenticationDatabase admin -d hello -c t1 -o /data/backup/mongodb-demo/hello-t1

4. 压缩备份:

mongodump -uroot -p123456 --port 27000 --authenticationDatabase admin -o /data/backup/mongodb-demo/all-zip --gzip

结果如图:

mongorestore

1. 恢复 hello 库:

mongorestore -uroot -p123456 --port 27000 --authenticationDatabase admin -d hello /data/backup/mongodb-demo/hello/hello

注意目录层级,且恢复只能是该库不存在的情况下!

2. 同理,恢复单独的表只需要 -c 指定,恢复压缩则需要使用 --gzip 说明。

3. 注意:当我们恢复的时候,库或者表存在是无法写入的,所有我们需要先删除它。此时只需要加入 --drop 就会自动先删除再恢复。但是很危险!!!

oplog

在  MySQL 中有 binlog 能够保证我们在故障之后最大可能性的恢复数据,当然,在 mongodb 也同样有这种类似的东西,这就是 oplog。

但是注意,oplog 只能在 rs 复制集或者主从模式中使用。

oplog 默认占用磁盘为磁盘总大小的 5%,所以在配置文件中我们使用了 oplogSizeMB 来规定日志文件大小。

当达到指定大小时,新的日志会覆盖旧的日志。

我们准备了一个 rs 集群:192.168.200.104:27001 - 27003

查看当前的 oplog:

use local
show collections
db.oplog.rs.find().pretty()

内容如下:

在 oplog 中,默认包含多种操作类型:

i:insert

u:update

d:delete

c:db command(对数据库的操作)

同时,我们在配置配置文件的时间,增加了 oplogSizeMB,但是当时我们是直接给的大小,不一定合适自己的系统。

该大小的设计规则肯定是越接近 MySQL 那样每次备份那一刻开始重新记录这样是最好的。

所以,对于 mongodb,我们只能通过:

rs.printReplicationInfo()

结果如图:

通过这样的预估来判断我们这个 log 能够坚持写多久。这里因为我刚刚生成了 1万数据,所以预估只能写 0.18 小时。

在我们备份的时候,可以通过相关的参数来记录备份过程中的数据变更,并将他另外保存为 oplog.bson 中。

mongodump --port 27001 --oplog -o /data/backup/mongodb

查看:

此时恢复则需要加入另外的参数:--oplogReplay

mongorestore --port=27001 --oplogReplay /data/backup/mongodb

当然,我这里数据以及存在,mongodb 会自己校验数据是否存在而选择是否执行。

模拟删库故障

注意事项:

1. 在生产中,恢复应该在新机器上面执行,避免因为恢复失败造成数据永久性顺坏。

2. 恢复应该停掉其它应用,避免新数据写入。

具体操作:

1. 先执行一次备份模拟晚上的全备:

mongodump --port 27001 --oplog -o /data/backup/mongodb

2. 新增操作:

use hello
db.t2.insert({name:"zhangsan"})
db.t3.insert({name:"lisi"})
db.t3.insert({name:"wangwu"}) # 删表
db.t1.drop()

3. 备份 local 库的 oplog.rs 表:

mongodump --port 27001 -d local -c oplog.rs -o /data/backup/local

4. 登录库查看删除的时间戳:

db.oplog.rs.find({op:"c"}).pretty()

结果如图:

最后一个就是 drop 操作,我们记录它的 ts 为:1574323944, 1

5. 将 local 备份下的 oplog.rs.bson 拷贝到之前全备下面,替换掉 oplog.bson

cp oplog.rs.bson /data/backup/mongodb/oplog.bson

6. 执行恢复:

mongorestore --port 27001 --oplogReplay --oplogLimit "1574323944:1" --drop /data/backup/mongodb/

注意,这里时间戳需要和后面的操作使用冒号隔开。而不是默认的逗号。

7. 查看恢复结果:

最后,关于分片集群的备份其实是一个很复杂的过程,需要另外进行好好规划。

当然,官方的 Ops manager 非常牛逼,但是不免费。

MongoDB for OPS 04:备份恢复的更多相关文章

  1. mongodb的副本集|备份|恢复备份

    复制(副本集) 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备份 数据灾 ...

  2. mongodb 的备份恢复导入与导出

    导入导出 use hndb; db.s.save({name:'李四',age:18,score:80,address:'郑州'}); db.s.save({name:'李三',age:8,score ...

  3. MongoDB学习(三)数据导入导出及备份恢复

    这几天想着公司要用MongoDB,自然就要用到数据导入导出,就自己学习了一下. 在Mongo学习(二)中就讲到了在bin目录下有一些工具,本篇就是使用这些工具进行数据的导入导出及备份恢复. 注意:以下 ...

  4. mongodb数据库备份恢复

    MongoDB数据文件备份与恢复   备份与恢复数据对于管理任何数据存储系统来说都是非常重要的.   1.冷备份与恢复——创建数据文件的副本(前提是要停止MongoDB服务器),也就是直接copy  ...

  5. Mongodb数据备份恢复

    Mongodb数据备份恢复 一.MongoDB数据库导入导出操作 1.导出数据库 twangback为备份的文件夹 命令: mongodump -h 127.0.0.1[服务器IP] -d advie ...

  6. mongodb集群配置及备份恢复

    Mongodb安装: 编辑/etc/yum.repos.d/mongodb.repo,添加以下: [MongoDB] name=MongoDB Repository baseurl=https://r ...

  7. MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁

    权限                                                                                             绑定内网I ...

  8. mongodb数据库备份恢复-windows系统

    备份语法: mongodump命令脚本语法如下: >mongodump -h dbhost -d dbname -o dbdirectory -h: MongDB所在服务器地址,例如:127.0 ...

  9. 010.MongoDB备份恢复

    一 MongoDB备份 1.1 备份概述 mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoi ...

随机推荐

  1. (day67)组件、组件化、组件传参、JS补充(命名转换、for in 、数据转换)、css取消选中和模拟小手

    目录 一.初识组件 (一)概念 (二)特点 二.组件的分类 (一)根组件 (二)局部组件 (三)全局组件 二.数据组件化 三.组件的传参 (一)父传子 (二)子传父 四.JS补充 (一)与html命名 ...

  2. Linux下dos2unix命令将windows文件编码格式dos转换成Unix格式

    问题描述: 在Windows系统下面使用文本编辑器notepad后传到Linux系统下的话 Linux下处理和执行一般都存在一些问题,我们可以通过命令查看文件是否是dos格式的, 如果有如图所示的M标 ...

  3. 【algo&ds】【pat】5.并查集及其应用

    1.并查集的定义 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两 ...

  4. np.array()和np.dot()的区别

    1.生成数组的方式不同 2.乘法计算方式不同 array生成数组,np.dot()表示矩阵乘积,(*)号或np.multiply()表示点乘 mat生成数组,(*)和np.dot()表示矩阵相乘,点乘 ...

  5. Web安全测试学习笔记-SQL注入-利用concat和updatexml函数

    mysql数据库中有两个函数:concat和updatexml,在sql注入时经常组合使用,本文通过学习concat和updatexml函数的使用方法,结合实例来理解这种sql注入方式的原理. con ...

  6. 5种智能指针指向数组的方法| 5 methods for c++ shared_ptr point to an array

    本文首发于个人博客https://kezunlin.me/post/b82753fc/,欢迎阅读最新内容! 5 methods for c++ shared_ptr point to an array ...

  7. os.path.isfile()的正确用法(正确用法)

    之前网上查找os.path.isfile( )的使用:发现有些是错误的,主要原因是,传入的参数是相对路径,不是绝对路径. 但是,经过我的实验发现:os.path.isfile( )需要传入的参数是绝对 ...

  8. jvm虚拟机笔记<四> 虚拟机字节码执行引擎

    一.运行时栈帧结构 栈帧是用于支持虚拟机进行方法调用和执行的数据结构,是虚拟机栈的栈元素. 栈帧存储了局部变量表,操作数栈,动态连接,和返回地址等. 每一个方法的执行 对应的一个栈帧在虚拟机里面从入栈 ...

  9. .netcore控制台->定时任务Quartz

    之前做数据同步时,用过timer.window服务,现在不用那么费事了,可以使用Quartz,并且配置灵活,使用cron表达式配置XML就可以.我用的是3.0.7版本支持.netcore. 首先创建一 ...

  10. 设计好的报表是如何在 web 上显示的

    润乾报表主要用来开发在 java web 端呈现的报表工具,设计器为桌面版,那么开发后的报表如何发布到 web 端是用户较为关心的问题. 润乾报表 web 端发布,采用 Taglib 方式,只需要在 ...