1、备份恢复工具介绍:
(1)**   mongoexport/mongoimport
(2)***** mongodump/mongorestore

2、备份工具区别在哪里?
2.1.    mongoexport/mongoimport  导入/导出的是JSON格式或者CSV格式,
        mongodump/mongorestore导入/导出的是BSON格式。

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

2.3.    在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,
        具体要看版本之间的兼容性。当无法使用BSON进行跨版本的数据迁移的时候,
        使用JSON格式即mongoexport/mongoimport是一个可选项。
        跨版本的mongodump/mongorestore个人并不推荐,实在要做请先检查文档看两个版本是否兼容(大部分时候是的)。

2.4.    JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息。使用时应该注意。

1、导出工具mongoexport

Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。
可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。
(1)版本差异较大
(2)异构平台数据迁移

mongoexport具体用法如下所示:

$ mongoexport --help  
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--authenticationDatabase admin

备份app库下的vast集合
创建集合并插入数据:

admin> use app
switched to db app

app> for(i=0;i<200;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
app> db.vast.find()
mongoexport --port 28018 -d app -c vast  -o /mongodb/vast.json

注:备份文件的名字可以自定义,默认导出了JSON格式的数据。

如果我们需要导出CSV格式的数据,则需要使用—-type=csv参数:

$ mongoexport --port 28018 -d app -c vast --type=csv -f id,name,age,date  -o /mongodb/vast.csv

2、导入工具mongoimport

Mongodb中的mongoimport工具可以把一个特定格式文件中的内容导入到指定的collection中。该工具可以导入JSON格式数据,也可以导入CSV格式数据。具体使用如下所示:

$ mongoimport --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导入那些列
-j, --numInsertionWorkers=<number>  number of insert operations to run concurrently                                                  (defaults to 1)
//并行

示例:先删除vast中的数据,并验证

app> db.vast.remove({})

然后再导入上面导出的vasts.dat文件中的内容

mongoimport --port 28018 -d app  -c vast    /mongodb/vast.json

上面演示的是导入JSON格式的文件中的内容,如果要导入CSV格式文件中的内容,则需要通过–type参数指定导入格式,具体如下所示:
先删除数据

app> db.vast.remove({})

再导入之前导出的vast.csv文件
错误的恢复

mongoimport  --port 28018 -d app  -c vast --type=csv -f id,name,age,date  --file   /mongodb/vast.csv
或
mongoimport  --port 28018   -d app  -c vast --type=csv --headerline --file  /mongodb/vast.csv

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

3、异构平台迁移案例

mysql —–>mongodb
world数据库下city表进行导出,导入到mongodb

(1)mysql开启安全路径

vim /etc/my.cnf   --->添加以下配置
secure-file-priv=/tmp

--重启数据库生效
/etc/init.d/mysqld restart

(2)导出mysql的city表数据

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

(3)处理备份文件

desc world.city
 ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population

vim /tmp/city.csv   ----> 添加第一行列名信息

ID,Name,CountryCode,District,Population

(4)在mongodb中导入备份

mongoimport --port 28018 -d world  -c city --type=csv --headerline  --file  /tmp/city.csv

use world
db.city.find({CountryCode:"CHN"});

思考:

world共100张表,全部迁移到mongodb

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

select concat("select * from ",table_schema,".",table_name ," into outfile '/tmp/",table_schema,"_",table_name,".csv' fields terminated by ',';")
from information_schema.tables where table_schema ='world';

导入:
    提示,使用infomation_schema.columns + information_schema.tables

mysql导出csv:

select * from test_info   
into outfile '/tmp/test.csv'   
fields terminated by ','    ------字段间以,号分隔
optionally enclosed by '"'  ------字段用"号括起
escaped by '"'          ------字段中使用的转义符为"
lines terminated by '\r\n';  ------行以\r\n结束

mysql导入csv:

load data infile '/tmp/test.csv'
into table test_info
fields terminated by ','
optionally enclosed by '"'
escaped by '"'
lines terminated by '\r\n';

4、mongodump和mongorestore介绍

mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。
但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,
则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。

5、mongodump用法如下:

$ mongodump --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
-j, --numParallelCollections=  number of collections to dump in parallel (4 by default)

--oplog  备份的同时备份oplog

6、mongodump和mongorestore基本使用

6.0 全库备份
mkdir /mongodb/backup
mongodump --port 28018 -o /mongodb/backup

6.1--备份test库
$ mongodump  --port 28018 -d test -o /mongodb/backup/

6.2--备份world库下的city集合
$ mongodump  --port 28018 -d world -c city -o /mongodb/backup/

6.3 --压缩备份
$ mongodump  --port 28018 -d app -o /mongodb/backup/ --gzip

$ mongodump  --port 28018 -d app -c vast -o /mongodb/backup/ --gzip

6.4--恢复app1库
$ mongorestore  --port 28018 -d app1  /mongodb/backup/app/

6.5--恢复test库下的vast集合
$ mongorestore  --port 28018 -d app2 -c vast /mongodb/backup/app/vast.bson

6.6 --drop表示恢复的时候把之前的集合drop掉
$ mongorestore  --port 28018 -d app --drop /mongodb/backup/app/
$ mongorestore  --port 28018 -d app -c vast --drop /mongodb/backup/app/vast.bson

重点:

mongodump  -d test  -o /mongodb/backup/
mongorestore  -d test  /mongodb/backup/test/
mongodump   -d test -c vast -o /mongodb/backup/
mongorestore  -d test -c vast /mongodb/backup/test/vast.bson

注:
1、如果要恢复的表已经存在,可以添加–drop ,自动删除原表
2、如果有用户验证,需要使用root或者需要备份的对象有权限的用户才可以

而且要添加对用户的验证库   --authenticationDatabase
-uroot -proot123 --authenticationDatabase admin

7、mongodump和mongorestore高级企业应用(–oplog)

注意:这是replica set或者master/slave模式专用

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

7.1 oplog介绍

在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过–oplogSizeMB参数修改),
位于local库的db.oplog.rs,有兴趣可以看看里面到底有些什么内容。
其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。
当空间用完时新记录自动覆盖最老的记录。
其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,
所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。
想要查看当前的oplog时间窗口预计值,可以使用以下命令:

test:PRIMARY> rs.printReplicationInfo()
configured oplog size:   1561.5615234375MB <--集合大小
log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间
oplog first event time:  Wed Sep 09 2015 17:39:50 GMT+0800 (CST)
oplog last event time:   Mon Sep 14 2015 15:23:59 GMT+0800 (CST)
now:                     Mon Sep 14 2015 16:37:30 GMT+0800 (CST)

7.2、oplog企业级应用

(1)实现热备,在备份时使用–oplog选项
注:为了演示效果我们在备份过程,模拟数据插入
(2)准备测试数据

use oldboy

for(var i = 1 i < 2001; i++) {
    db.foo.insert({a: i});
}


my_repl:PRIMARY> db.oplog.rs.find({"op":"d"}).pretty()

oplog 配合mongodump实现热备

mongodump --port 28018 --oplog -o /mongodb/backup

作用介绍:–oplog 会记录备份过程中的数据变化。会以oplog.bson保存下来

恢复

mongorestore  --port 28018 --oplogReplay /mongodb/backup

8、oplog高级应用 –binlog应用

背景:每天0点全备,oplog恢复窗口为48小时
某天,上午10点world.city 业务表被误删除。

恢复思路:
    0、停应用
    2、找测试库
    3、恢复昨天晚上全备
    4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库
    5、将误删除表导出,恢复到生产库

恢复步骤:
模拟故障环境:

1、全备数据库

mongodump --port 28018 --oplog -o /mongodb/backup

2、上午10点:删除world库下的city表

[mongod@db03 backup]$ mongo --port 28018
my_repl:PRIMARY> use world
my_repl:PRIMARY> db.city.drop()
my_repl:PRIMARY> show tables;

3、停业务

4、备份现有的oplog.rs表

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

5、截取oplog并恢复到drop之前的位置

bsondump oplog.rs.bson | grep "\"op\":\"c\""|grep drop |tail -1     #只能应对小的日志文件,大文件根本过滤不出来

更合理的方法:登陆到原数据库

[mongod@db03 local]$ mongo --port 28018
my_repl:PRIMARY> use local
my_repl:PRIMARY> db.oplog.rs.find({"op":"c"})
{ "ts" : Timestamp(1531467077, 1), "t" : NumberLong(3), "h" : NumberLong("-1326085166597892004"), "v" : 2, "op" : "c", "ns" : "world.$cmd", "o" : { "drop" : "city" } }

6、恢复备份+应用oplog

[mongod@db03 backup]$ cd /mongodb/backup/local/
[mongod@db03 local]$ ls
oplog.rs.bson  oplog.rs.metadata.json
[mongod@db03 local]$ cp oplog.rs.bson ../oplog.bson 

rm -rf /mongodb/backup/local/

mongorestore --port 28018   --oplogReplay --oplogLimit "1531467077:1"  --drop  /mongodb/backup/

分片集群的备份思路(了解)

1、你要备份什么?
config server
shard 节点

单独进行备份
2、备份有什么困难和问题
(1)chunk迁移的问题
    人为控制在备份的时候,避开迁移的时间窗口
(2)shard节点之间的数据不在同一时间点。
    选业务量较少的时候
文档更新时间: 2019-03-28 10:39   作者:李延召