当前位置: 首页 > news >正文

mongodb 备份压缩_MongoDB备份与恢复

MongoDB备份与恢复

第1章 常用命令简介:

mongoexport / mongoimport

mongodump  / mongorestore

1.1 备份工具区别在哪里:

Ømongoexport / mongoimport导入导出是JSON格式,而mongodump/mongorestore导入导出的是BSON格式

ØJSON可读性强但是体积较大,BSON则是二进制文件,体积小但是人类几乎没有可读性

Ø在一些mongodb版本之间,BSON格式可能会随版本的不同而有所区别,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性,当无法使用BSON进行跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项,跨版本的mongodump/mongorestore不推荐,

ØJSON虽然具有较好的跨版本通用性,但是只包里的数据部分,不保留索引,账户等其他基础信息

1.2 导出工具mongoexport :

MongoDB中的mongoimport工具可以把一个collection导出成json或csv格式的文件,可以通过惨呼指定导出的数据项,也可以根据指定的条件导出数据

命令参数:参数参数说明

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

-u指明数据库的用户名

-p指明数据库的密码

-d指明数据库的名字

-c指明collection的名字

-f指明要导出那些列

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

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

--type指定文件类型

--authenticationDatabase验证数据的名称

1.3 导入工具mongoimport

MongoDB中的mongoimport工具可以把一个特定格式文件中农的内容导入到指定的collection中,该工具可以导入json格式数据,也可以导入csv格式数据

命令参数:参数参数说明

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

-u指明数据库的用户名

-p指明数据库的密码

-d指明数据库的名字

-c指明collection的名字

-f指明要导出那些列

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

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

--drop插入之前先删除原有的

--headerline指明第一行是列名,不需要导入。

-j同时运行的插入操作数(默认为1),并行

--authenticationDatabase验证数据的名称

1.4 mongodump导出工具:

mongodump参数与mongoexport参数基本一致参数参数说明

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

-u指明数据库的用户名

-p指明数据库的密码

-d指明数据库的名字

-c指明collection的名字

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

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

--authenticationDatabase验证数据的名称

--gzip备份时压缩

--oploguse oplog for taking a point-in-time snapshot

1.5 mongorestore导入工具

mongorestore与mongoimport参数基本一致参数参数说明

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

-u指明数据库的用户名

-p指明数据库的密码

-d指明数据库的名字

-c指明collection的名字

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

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

--authenticationDatabase验证数据的名称

--gzip备份时压缩

--oploguse oplog for taking a point-in-time snapshot

--drop恢复的时候把之前的集合drop掉

第2章 mongoexport/mongoimport实践:

示例1-1 备份app库表vast集合:

mongoexport -h 10.0.0.18:28021 --authenticationDatabase admin -d app -c vast1 -o /mongodb/backup/vast.json

示例1-2 导出csv格式的备份:

mongoexport -h 10.0.0.18:28021 --authenticationDatabase admin -d app -c vast1 --type=csv -f id,name -o /mongodb/backup/vast.csv

示例1-3 将之前备份的数据导入

mongoimport -h 10.0.0.18:28024 --authenticationDatabase admin  -d app -c vast --drop /mongodb/backup/vast.json

示例1-4 将之前备份的csv格式数据导入

mongoimport -h 10.0.0.18:28024 --authenticationDatabase admin -d app -c vast1 --drop --type=csv --headerline  --file=/mongodb/backup/vast.csv

第3章 实践mysql数据迁移至MongoDB数据库:

3.1 将mysql数据库中mysql.user表导出:

Ømysql5.6中使用outfile需要开启相应参数:

vim /etc/my.cnf

secure-file-priv=/tmp

select user,password,host from mysql.user into outfile '/tmp/user.csv'

fields terminated by ',';

Ø命令说明:

into outfile '/tmp/user.csv'    ------导出文件位置

fields terminated by ','      ------字段间以,号分隔

还支持的命令,但是这里没有使用

optionally enclosed by '"'     ------字段用"号括起

escaped by '"'            ------字段中使用的转义符为"

lines terminated by '\r\n';    ------行以\r\n结束

Ø查看导出内容:

[root@db03 tmp]# cat user.csv

root,,localhost

root,,db03

root,,127.0.0.1

root,,::1

,,localhost

,,db03

repl,*23AE809DDACAF96AF0FD78ED04B6A265E05AA257,10.0.0.%

mha,*F4C9AC49A736981AE2739FC2F4A1FD92B4F07929,10.0.0.%

appuser,*23AE809DDACAF96AF0FD78ED04B6A265E05AA257,10.0.0.%

Ø将数据上传至MongoDB服务器

scp -rp /tmp/user.csv root@10.0.0.18:/tmp

3.2 导入MongoDB数据库

mongoimport -h 10.0.0.18:28021 --authenticationDatabase admin -d app -c user -f name,pass,host --type=csv --file=/tmp/user.csv

Ø查看数据:

sh1:PRIMARY> show tables

user

vast1

sh1:PRIMARY> db.user.find()

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521d8"), "name" : "root", "pass" : "", "host" : "localhost" }

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521d9"), "name" : "root", "pass" : "", "host" : "db03" }

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521da"), "name" : "root", "pass" : "", "host" : "127.0.0.1" }

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521db"), "name" : "root", "pass" : "", "host" : "::1" }

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521dc"), "name" : "", "pass" : "", "host" : "localhost" }

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521dd"), "name" : "", "pass" : "", "host" : "db03" }

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521de"), "name" : "repl", "pass" : "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257", "host" : "10.0.0.%" }

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521df"), "name" : "mha", "pass" : "*F4C9AC49A736981AE2739FC2F4A1FD92B4F07929", "host" : "10.0.0.%" }

{ "_id" : ObjectId("5ad8290ce6bcf5822e0521e0"), "name" : "appuser", "pass" : "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257", "host" : "10.0.0.%" }

数据迁移完成

第4章 mongodump实践

示例1-5 全库备份:

mongodump -h 10.0.0.18:28021 --authenticationDatabase admin -o /mongodb/backup

示例1-6 备份test库:

mongodump -h 10.0.0.18:28021 --authenticationDatabase admin  -d test -o /mongodb/backup

2018-04-19T13:50:31.901+0800    writing test.vast1 to

2018-04-19T13:50:31.903+0800    writing test.vast to

2018-04-19T13:50:31.908+0800    done dumping test.vast (0 documents)

2018-04-19T13:50:31.967+0800    done dumping test.vast1 (2000 documents)

[mongod@web04 backup]$ ll

drwxrwxr-x 2 mongod mongod    90 Apr 19 13:50 test

[mongod@web04 backup]$ ll test/

-rw-rw-r-- 1 mongod mongod 152000 Apr 19 13:50 vast1.bson

-rw-rw-r-- 1 mongod mongod     82 Apr 19 13:50 vast1.metadata.json

-rw-rw-r-- 1 mongod mongod      0 Apr 19 13:50 vast.bson

-rw-rw-r-- 1 mongod mongod    137 Apr 19 13:50 vast.metadata.json

示例1-7 备份app库下user集合:

mongodump -h 10.0.0.18:28021 --authenticationDatabase admin  -d app -c user -o /mongodb/backup

2018-04-19T13:52:51.286+0800    writing app.user to

2018-04-19T13:52:51.289+0800    done dumping app.user (9 documents)

[mongod@web04 backup]$ ll

drwxrwxr-x 2 mongod mongod    47 Apr 19 13:52 app

[mongod@web04 backup]$ ll app/

-rw-rw-r-- 1 mongod mongod 710 Apr 19 13:52 user.bson

-rw-rw-r-- 1 mongod mongod  80 Apr 19 13:52 user.metadata.json

示例1-8 压缩备份app库:

mongodump -h 10.0.0.18:28021 --authenticationDatabase admin  -d app -o /mongodb/backup --gzip

示例1-9 压缩备份app库下user集合:

mongodump -h 10.0.0.18:28021 --authenticationDatabase admin  -d app -c user -o /mongodb/backup --gzip

第5章 mongorestore实践

示例1-10 恢复之前备份的app库:  --drop表示恢复之前把原有的清除

mongorestore -h 10.0.0.18:28021 --authenticationDatabase admin -d app --drop  /mongodb/backup/app/

示例1-11 恢复app库下的user集合

mongorestore -h 10.0.0.18:28021 --authenticationDatabase admin -d app –c user --drop  /mongodb/backup/app/

第6章 oplog

6.1 什么是oplog?

MongoDB的replication是通过一个日志来存储写操作的,这个日志叫做oplog

在默认情况下,oplog分配的是5%的空闲磁盘空间,通常而言,这是一种合理的设置,可以通过mongodb—oplogsize来改变oplog的日志大小

oplog是capped collection,因为oplog的特点(不能太多把磁盘填满了,固定大小)需要,MongoDB才发明了capped collection(the oplog is actually the reason capped collections were invented). 定值大小的集合,oplogSizeMB: 2048,oplog是具有幂等性,执行过后的不会反复执行。

6.2 oplog的位置:

Øoplog在local库: local.oplog

Ømaster/slave架构下: local.oplog.$main;

Øreplica sets架构下: local.oplog.rs

6.2.1 mongodump参数中—oplog的作用:

该参数的主要作用是在导出的同时生成一个oplog.bson文件,存放你开始进行dump到dump结束之间所有的oplog

简单的说,在replica set中oplog是一个定容集合,他的默认大小是磁盘空间的5%,(可以通过oplogsize参数修改)位于local库中的db.oplog.rs

其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。当空间用完时新记录自动覆盖最老的记录

其覆盖的范围被称作oplog的时间窗口,需要注意的是,因为oplog是一个定容集合,所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化

Ø想要查看当前的oplog时间窗口预计值:

sh1:PRIMARY> rs.printReplicationInfo()

configured oplog size:   2048MB

log length start to end: 59363secs (16.49hrs)

oplog first event time:  Wed Apr 18 2018 22:46:09 GMT+0800 (CST)

oplog last event time:   Thu Apr 19 2018 15:15:32 GMT+0800 (CST)

now:                     Thu Apr 19 2018 17:50:17 GMT+0800 (CST)

oplog有一个非常重要的特性----幂等性,即对一个数据集合,使用oplog中记录的操作重放时,无论被重放多少次,其结果会是一样的

举例来说,如果oplog中记录的是一个插入操作,并不会因为你重放了两次,数据库中就得到两条相同的记录

6.3 oplog.bson作用:

Ø与oplog相关的参数:参数参数说明

--oplogReplay重放oplog.bson中的操作内容

--oplogLimit与--oplogReplay一起使用时,可以限制重放到的时间点

首先要明白数据之间互相有依赖性,比如两个集合中的数据互相具有依赖性,在一个任意的时间点,用mongodump进行备份时,如果两个集合的时间点不同,那么备份出来的数据也会不同,备份也就失去了意义

而使用了oplog功能,他会在dump数据的基础上,在重做一遍oplog中记录的所有操作,这时的数据就可以代表dump结束时的数据库状态,这个优点类似于mysql中binlog日志的使用

第7章 oplog企业应用

Ø先插入多一些的数据

for(var i = 0; i < 100; i++) {     db.jiang.insert({a: i}); }

WriteResult({ "nInserted" : 1

Ø在插入的过程中进行备份:

mongodump -h 10.0.0.18:28021 --oplog -o /mongodb/backup

注意:--oplog选项只对全库导出有效,所以不能指定-d选项,因为整个实例的变更操作都会几种在local库中的oplog.rs集合中

Ø根据上面所述,从dump开始的时间西戎将记录所有的oplog到oplog.bson中,

[mongod@web04 backup]$ ll

drwxrwxr-x 2 mongod mongod   47 Apr 19 15:14 app

-rw-rw-r-- 1 mongod mongod 3663 Apr 19 15:14 oplog.bson

drwxrwxr-x 2 mongod mongod   49 Apr 19 15:14 test

Ø查看oplog.bson中第一条和最后一条的内容:

[mongod@web04 backup]$ bsondump oplog.bson >/tmp/oplog.tmp

2018-04-19T15:22:28.617+0800    33 objects found

[mongod@web04 backup]$ head -1 /tmp/oplog.tmp

{"ts":{"$timestamp":{"t":1524122087,"i":166}},"t":{"$numberLong":"3"},"h":{"$numberLong":"2348342245314847788"},"v":2,"op":"i","ns":"test.jiang","o":{"_id":{"$oid":"5ad841e70c38e789b16b4f88"},"a":817.0}}

[mongod@web04 backup]$ tail -1 /tmp/oplog.tmp

{"ts":{"$timestamp":{"t":1524122088,"i":25}},"t":{"$numberLong":"3"},"h":{"$numberLong":"-1220572418158156634"},"v":2,"op":"i","ns":"test.jiang","o":{"_id":{"$oid":"5ad841e80c38e789b16b4fa8"},"a":849.0}}

最终dump出的数据既不是最开始的状态,也不是最后的状态,而是中间某个随机状态,这正是因为集合不断变化的造成的

Ø使用mongorestore来恢复

mongodump -uroot -proot -h 10.0.0.18:28021 --oplog -o /mongodb/backup

7.1 获取oplog的方法:

Ø在local库中导出

mongodump -h 10.0.0.18:28021 -d local -c oplog.rs -o /mongodb/backup

2018-04-19T15:34:45.145+0800    writing local.oplog.rs to

2018-04-19T15:34:45.530+0800    done dumping local.oplog.rs (22717 documents)

[mongod@web04 backup]$ cd local/

[mongod@web04 local]$ ll

-rw-rw-r-- 1 mongod mongod 2630171 Apr 19 15:34 oplog.rs.bson

-rw-rw-r-- 1 mongod mongod      83 Apr 19 15:34 oplog.rs.metadata.json

Ømongodump时加上—oplog参数,将会自动生成oplog,这种方式直接—pologReplay就可以恢复

Ø说明:

既然dump出的数据配合oplog就可以把数据库恢复到某个状态,那是不是拥有一份从某个时间点开始备份的dump数据,再加上从dump开始之后的oplog,如果oplog足够长,是不是就可以把数据库恢复到其后的任意状态了?是的!

事实上replica set正是依赖oplog的重放机制在工作。当secondary第一次加入replica set时做的initial sync就相当于是在做mongodump,此后只需要不断地同步和重放oplog.rs中的数据,就达到了secondary与primary同步的目的。

既然oplog一直都在oplog.rs中存在,我们为什么还需要在mongodump时指定--oplog呢?需要的时候从oplog.rs中拿不就完了吗?答案是肯定的,你确实可以只dump数据,不需要oplog。

在需要的时候可以再从oplog.rs中取。但前提是oplog时间窗口必须能够覆盖dump的开始时间。

7.2 模拟生产环境

Ø插入数据的同时备份

> for(i=0;i<30000;i++){ db.oplog.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }

另一个窗口进行备份:

mongodump -uroot -proot --port 27017  --oplog  -o /mongodb/backup/

Ø备份完成后进行错误的操作

db.oplog.remove({});

Ø备份oplog.rs文件

mongodump --port 27017 -d local -c oplog.rs -o  /mongodb/backup/oplog

Ø恢复之前的备份的数据

Ø截取oplog,找到发生误删除的时间点

Ø复制oplog到备份目录

Ø进行恢复,添加之前找到的误删除的点(limit)

第8章 分片集群的备份思路:

8.1 mongodb的备份准则:

只针对replica或master/slave,满足这些准则mongodb就可以进行point-in-time恢复操作

1.任意两次备份的时间间隔(第一次备份开始到第二次备份结束)不能超过oplog时间窗口覆盖范围

2.在上次数据备份的基础上,在oplog时间窗口没有滑出上次备份结束的时间点前进行完整的oplog备份,请充分考虑oplog备份需要的时间,权衡服务器空间情况决定oplog备份间隔

8.2 实际应用中的注意事项:

1.考虑oplog时间窗口是个变化值,请关注oplog时间窗口的具体时间

2.当靠近oplog时间窗口滑动出有效时间之前必须要有足够的时间dump出需要的oplog.rs,请预留出足够的时间,不要顶满时间窗口在备份

3.当灾难发生时,第一件事情就是要停止数据库的写入操作,以往oplog滑出时间窗口,特别是像上述这样的remove({})操作,瞬间就会插入大量d记录从而导致oplog迅速滑出时间窗口

8.3 分片集群的备份注意事项:

1、备份什么?

(1)configserver

(2)每一个shard节点

2、备份需要注意什么?

(1)元数据和真实数据要有对等性(blancer迁移的问题,会造成config和shard备份不一致)

(2)不同部分备份结束时间点不一样,恢复出来的数据就是有问题的。

第9章 MongoDB监控

MongoDB集群监控方式:

第10章 mongodb集群性能优化方案:

10.1 1.5.1 优化方向

Ø硬件(内存、SSD)

Ø收缩数据

Ø增加新的机器、新的副本集

Ø集群分片键选择

Øchunk大小设置

Ø预分片(预先分配存储空间)

10.2 1.5.2 存储引擎方面

WiredTiger是3.0以后的默认存储引擎,细粒度的并发控制和数据压缩提供了更高的性能和存储效率。3.0以前默认的MMAPv1也提高了性能。

在MongoDB复制集中可以组合多钟存储引擎,各个实例实现不同的应用需求。

10.3 1.5.3 其他优化建议

Ø收缩数据

Ø预分片

Ø增加新的机器、新的副本集

Ø集群分片键选择

Øchunk大小设置

第11章 Aliyun备份策略:

11.1 MongoDB云数据库备份恢复

11.2 备份策略:

Ø从hidden节点备份

Ø每天一次全量备份

Ø持续拉取oplog增量备份

Ø定期巡检备份有效性

Ø恢复时克隆到新实例

11.3 全量备份方法:

11.4 逻辑备份流程-mongodump

11.4.1 特点:

Ø全量遍历所有数据、

Ø备份、恢复慢

Ø对业务影响较大

Ø无需备份索引、恢复时重建

Ø通用性强

11.5 物理备份流程:

11.5.1 备份热点:

Ø拷贝数据目录所有文件,效率高

Ø备份、恢复快

Ø对业务影响较小

Ø跟数据库版本、配置强关联

11.6 逻辑备份VS物理备份:

相关文章:

  • MeeGo平台研究之开篇
  • 模型原理_注意力机制原理及其模型发展和应用
  • offer oracle svp_SVP - Uncyclopedia
  • 存储学习之路
  • bootjar打包没有jsp_springboot项目打包成jar无法访问jsp页面的解决方法
  • 送别组长
  • python中定义变量typedef_使用typedef定义类型
  • 找啊!找啊!找不到工作(中)——漂在中关村(3)
  • 无缝移植J2ME程序到OPhone平台解决方案
  • 二元偏导数存在的条件_视频教学:二元函数二重极限存在性判定的一般思路与常用方法...
  • 寻找一种可以只安装客户端插件就能很好运行的还还能提高开发效率的技术最好java???...
  • linux 修改jvm时区_系统时间和JVM的Date时间不一致
  • element ui 分页增删改查_ElementUI 实现表格可编辑 Editable,增删改查编辑表格Grid...
  • 改变你做事的步伐
  • automake生成静态库文件_【转】 autoconf / automake 例子(静态库、动态库 )
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【comparator, comparable】小总结
  • Apache Pulsar 2.1 重磅发布
  • JavaScript 一些 DOM 的知识点
  • Java多态
  • Mocha测试初探
  • Quartz初级教程
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • ucore操作系统实验笔记 - 重新理解中断
  • vue学习系列(二)vue-cli
  • 后端_ThinkPHP5
  • 回顾2016
  • 基于axios的vue插件,让http请求更简单
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小程序测试方案初探
  • 《码出高效》学习笔记与书中错误记录
  • Android开发者必备:推荐一款助力开发的开源APP
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​configparser --- 配置文件解析器​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (zt)最盛行的警世狂言(爆笑)
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四)linux文件内容查看
  • (译)2019年前端性能优化清单 — 下篇
  • .“空心村”成因分析及解决对策122344
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET CLR Hosting 简介
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net framework4与其client profile版本的区别
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法