目录

MongoDB备份与还原

目录

MongoDB备份与还原

备份恢复工具介绍

1)mongoexport/mongoimport

2)mongodump/mongorestore

备份工具区别

mongoexport/mongoimport  导入/导出的是JSON格式或者CSV格式

mongodump/mongorestore  导入/导出的是BSON格式。 二进制方式,速度快

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

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

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

应用场景

mongoexport/mongoimport:json csv

1)异构平台迁移  mysql  <—> mongodb

2)同平台,跨大版本:mongodb 3  —-> mongodb 4

mongodump/mongorestore

日常备份恢复时使用

导出工具mongoexport

Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。

可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。

1)版本差异较大

2)异构平台数据迁移

mongoexport具体用法如下:

mongoexport –help

参数说明:

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

-u:指明数据库的用户名

-p:指明数据库的密码

-d:指明数据库的名字

-c:指明collection的名字

-f:指明要导出那些列

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

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

–authenticationDatabase admin

导入工具mongoimport

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

mongoimport具体用法如下:

mongoimport –help

参数说明:

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

-u:指明数据库的用户名

-p:指明数据库的密码

-d:指明数据库的名字

-c:指明collection的名字

-f:指明要导入那些列

-j:并行多开线程,默认4个

实验环境

https://i-blog.csdnimg.cn/direct/469ad5160f854be1a2d691459a68132e.png

192.168.8.5安装好MongoDB

192.168.8.6安装好MySQL

实验步骤

1、安装备份工具(MongoDB)

将mongodb-database-tools-rhel70-x86_64-100.3.1.tgz包拖入/root目录

tar xf mongodb-database-tools-rhel70-x86_64-100.3.1.tgz

cd mongodb-database-tools-rhel70-x86_64-100.3.1/bin/

cp * /mongodb/bin/

chown -R mongod.mongod /mongodb/

2、创建超级管理员root用户(MongoDB)

su - mongod

mongo

use admin

https://i-blog.csdnimg.cn/direct/b00c2535221e47438db299e8a0c3442d.png

db.createUser(

{

user: “root”,

pwd: “root123”,

roles: [ { role: “root”,db: “admin” } ]

}

)

https://i-blog.csdnimg.cn/direct/421278ea073e4011a7965d5f6ba3dd95.png

3、创建haha库和log集合并写入一万行数据(MongoDB)

use haha

db.createCollection(“log”)

for(i=0;i<10000;i++){db.log.insert({“uid”:i,“name”:“mysql”,“age”:6,“date”:new Date()})}

db.log.count()

https://i-blog.csdnimg.cn/direct/42ae1528a4fa4137915fe1e22f85bb89.png

4、将log集合备份成json格式文件(MongoDB)

mongoexport -uroot -proot123 –port 27017 –authenticationDatabase admin -d haha -c log -o /mongodb/log.json

https://i-blog.csdnimg.cn/direct/8708d37a97da441cb57fb8aa2c3b46ac.png

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

5、恢复json格式备份文件“log.json”到log1集合中(MongoDB)

mongoimport -uroot -proot123 –port 27017 –authenticationDatabase admin -d haha -c log1 /mongodb/log.json

https://i-blog.csdnimg.cn/direct/21758c2cb4b84a7dbcd20cf266890a09.png

登录查看数据

mongo –port 27017 admin

use haha

https://i-blog.csdnimg.cn/direct/3b10bfb2f40c4bbd8332bc46adb094cb.png

show tables

https://i-blog.csdnimg.cn/direct/74b83e705d914bf09fe0d1be4e302acc.png

db.log1.count()

https://i-blog.csdnimg.cn/direct/aad28390842d4afe9ed97b837d0c0e15.png

db.log1.find()

https://i-blog.csdnimg.cn/direct/cfcb92fe128846eeb14ca22b393656fc.png

6、将log集合备份成csv格式文件 (csv格式适合跨平台迁移,迁移到MySQL) (MongoDB)

如果需要导出CSV格式的数据,则需要使用–type=csv参数指定导入格式

mongoexport -uroot -proot123 –port 27017 –authenticationDatabase admin -d haha -c log –type=csv -f uid,name,age,date -o /mongodb/log.csv

https://i-blog.csdnimg.cn/direct/56ae6e2e1a78492b9dfe13763024b5d9.png

7、恢复csv格式备份文件(MongoDB)

如果要导入CSV格式文件中的内容,则需要使用–type=csv参数指定导入格式

方法1:

恢复csv格式备份文件“log.csv”到log2集合中

注意:csv格式的文件头行,有列名字

mongoimport -uroot -proot123 –port 27017 –authenticationDatabase admin -d haha -c log2 –type=csv –headerline –file /mongodb/log.csv

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

https://i-blog.csdnimg.cn/direct/063a11fc1393416cbd4d07375a0680a3.png

登录查看数据

mongo –port 27017 admin

use haha

https://i-blog.csdnimg.cn/direct/69cf992efd1142b9985136a036dffd7c.png

show tables

https://i-blog.csdnimg.cn/direct/88308dfb93dc44ec8bb36bd7de90e6be.png

db.log2.count()

https://i-blog.csdnimg.cn/direct/b1bbc7708db5491e84b2852059d03191.png

db.log2.find()

https://i-blog.csdnimg.cn/direct/603ff6e692874a7580b692b215664e07.png

方法2:

恢复csv格式备份文件“log1.csv”到log3集合中

注意:csv格式的文件头行,有列名字

备份导出的csv格式的数据备份文件

cd /mongodb/

cp log.csv log1.csv

vim log1.csv

删除第一行红线部分内容:

https://i-blog.csdnimg.cn/direct/d4253b187e154afeb77a3cabfd72ec72.png

mongoimport -uroot -proot123 –port 27017 –authenticationDatabase admin -d haha -c log3 –type=csv -f id,name,age,date –file /mongodb/log1.csv

这时就不用指定–headerline参数指明第一行是列名,不需要导入,需要指定导入的列名

https://i-blog.csdnimg.cn/direct/513cf8199d5b4c7b868967311d841bd8.png

登录查看数据

mongo –port 27017 admin

use haha

https://i-blog.csdnimg.cn/direct/214e4e821c5541698ac08fbe5170f0ca.png

show tables

https://i-blog.csdnimg.cn/direct/e76604f07f18431488feb89a572d21e9.png

db.log3.count()

https://i-blog.csdnimg.cn/direct/c75c46aacfaa4b20992fa9b2994887d2.png

db.log3.find()

https://i-blog.csdnimg.cn/direct/4a6d3f55adcd4fba94c1878dcd55b944.png

异构平台迁移数据

MySQL —-> MongoDB

1、修改MySQL配置文件,开启安全路径(MySQL)

vim /etc/my.cnf

添加:

secure-file-priv=/tmp

限制文件的读取和写入只能在设定的文件夹中

https://i-blog.csdnimg.cn/direct/d5373c57c87a4e48b1ffcad8cc0aeb8b.png

重启MySQL

systemctl restart mysqld

2、导入world.sql数据库(MySQL)

将world.sql文件拖入/root目录

登录MySQL导入world数据库

source /root/world.sql

3、导出csv格式的world库中的city表,导出文件为city.csv(MySQL)

MySQL导出csv格式语法:

select * from world.city

into outfile ‘/tmp/city.csv’

fields terminated by ‘,’         ——定义字段间以“,”分隔

optionally enclosed by ‘"’          ——定义字符串使用双引号括起来

escaped by ‘"’           ——定义字段中使用的转义符为“””

lines terminated by ‘\r\n’;          ——定义行分隔符为换行符

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

fields terminated by ‘,’ :字段间以“,”分隔

https://i-blog.csdnimg.cn/direct/dea2adc61fe54249926499745cc84687.png

4、将数据备份文件city.csv拷贝到MongoDB(MySQL)

scp /tmp/city.csv

5、查看city表结构,MongoDB导入数据使用(MySQL)

desc world.city;

https://i-blog.csdnimg.cn/direct/be2fbc47ddd346b986aab96c3aa3d355.png

6、在MongoDB导入数据备份文件city.csv(MongoDB)

mongoimport -uroot -proot123 –port 27017 –authenticationDatabase admin -d world -c city –type=csv -f ID,Name,CountryCode,District,Population –file /tmp/city.csv

必须指定列名

https://i-blog.csdnimg.cn/direct/049074cf662a4f83b9f3e577c626819b.png

7、登录查看数据(MongoDB)

mongo –port 27017

show dbs

https://i-blog.csdnimg.cn/direct/ad22120eae9f472985b91a057900368b.png

use world

show tables

https://i-blog.csdnimg.cn/direct/1fc4d5d7e91547ac9dfd538ffc9bccc8.png

db.city.count()

https://i-blog.csdnimg.cn/direct/33c3b003a7eb488f802caecb502667e2.png

db.city.find()

https://i-blog.csdnimg.cn/direct/4f9adba8fc5d4a3ba811cfd7c83a01df.png

当MySQL需要迁移到MongoDB的表太多时,使用下面语句生成库中所有表的备份文件 (MySQL)

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’;

https://i-blog.csdnimg.cn/direct/f4540ea69af34f64a909d91a8f5ffb70.png

将MongoDB中以csv格式备份的表导入MySQL中

1、将MongoDB的数据备份文件log.csv拷贝到MySQL(MongoDB)

scp /mongodb/log.csv

2、查看log.csv文件(MySQL)

vim /tmp/log.csv

删除第一行内容

https://i-blog.csdnimg.cn/direct/11ad28674eb74b73b0f215f32a6f4614.png

第一行内容为列名,在备份csv格式时会记录列名,在导入MySQL时需要删除

3、 必须先创建相应的库和表 (MySQL)

create database haha;

use haha;

创表时需要和备份文件中的列名相同

create table log(uid int,name varchar(10),age int,date varchar(30));

https://i-blog.csdnimg.cn/direct/232c646b80104571a7c92368f34d3006.png

4、导入log.csv文件(MySQL)

MySQL导入csv格式语法:

load data infile ‘/tmp/log.csv’

into table log

fields terminated by ‘,’         ——定义字段间以“,”分隔

optionally enclosed by ‘"’          ——定义字符串使用双引号括起来

escaped by ‘"’           ——定义字段中使用的转义符为“””

lines terminated by ‘\r\n’;          ——定义行分隔符为换行符

load data infile ‘/tmp/log.csv’ into table log fields terminated by ‘,’;

https://i-blog.csdnimg.cn/direct/664505da2bbd4c71be2cf74c6e1edf8c.png

查看数据

select * from log;

https://i-blog.csdnimg.cn/direct/ea1a6aee5b1b46c28ae69d884df1a1f3.png

mongodump 和mongorestore介绍

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

mongodump 用法如下:

mongodump –help

参数说明:

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

-u:指明数据库的用户名

-p:指明数据库的密码

-d:指明数据库的名字

-c:指明collection的名字

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

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

-j:并行备份的线程数默认是4

–oplog  备份的同时备份oplog

mongodump 和mongorestore基本使用

1、创建备份文件存放目录(MongoDB)

mkdir /mongodb/backup /mongodb/backup{1..5}

2、全库备份(MongoDB)

mongodump -uroot -proot123 –port 27017 –authenticationDatabase admin -o /mongodb/backup

https://i-blog.csdnimg.cn/direct/7154067d676044cf81ed764b7bdf8da9.png

查看备份文件

https://i-blog.csdnimg.cn/direct/8a80ed6ed72c4c6792c1d6cfdfe03fd8.png

3、备份单库world库(MongoDB)

mongodump -uroot -proot123 –port 27017 –authenticationDatabase admin -d world -o /mongodb/backup1

https://i-blog.csdnimg.cn/direct/b39b2547fce84529aa122303f4dbe712.png

查看备份文件

https://i-blog.csdnimg.cn/direct/10fc31e416924d66aa36626008b8c8fa.png

4、备份haha库下的log集合(MongoDB)

mongodump -uroot -proot123 –port 27017 –authenticationDatabase admin -d haha -c log -o /mongodb/backup2

https://i-blog.csdnimg.cn/direct/15c7bb9acd824e88af9c86077ff545fc.png

查看备份文件

https://i-blog.csdnimg.cn/direct/baccc21bc9424b3989f3b36f8901dad2.png

5、压缩备份全库(MongoDB)

mongodump -uroot -proot123 –port 27017 –authenticationDatabase admin -o /mongodb/backup3 –gzip

https://i-blog.csdnimg.cn/direct/21d2b99d8d3842e19868ce50e4f8fcd3.png

对比全库备份和压缩全库备份的占用大小

https://i-blog.csdnimg.cn/direct/3aa2225664f44925a23f0d84d9239257.png

https://i-blog.csdnimg.cn/direct/421c22198694470c9ee4a80c66f64324.png

压缩备份后占用空间更小

6、压缩备份单库haha库(MongoDB)

mongodump -uroot -proot123 –port 27017 –authenticationDatabase admin -d haha -o /mongodb/backup4 –gzip

https://i-blog.csdnimg.cn/direct/53cf1893ea194a92b28ee941145ce188.png

7、压缩备份单表,world库中的city集合(MongoDB)

mongodump -uroot -p root123 –port 27017 –authenticationDatabase admin -d world -c city -o /mongodb/backup5 –gzip

https://i-blog.csdnimg.cn/direct/c14e505333ad444d9110d3eb234ba0a3.png

8、恢复world库(MongoDB)

先删除world库

mongo –port 27017 admin

show dbs

https://i-blog.csdnimg.cn/direct/ddd438e577fe4d4dae934afa3cb6624e.png

use world

db.dropDatabase()

https://i-blog.csdnimg.cn/direct/5a8c924813014540893f0e37d8f3e79e.png

show dbs

https://i-blog.csdnimg.cn/direct/08fc0c54d6c847e1929e453d530ab34d.png

恢复

mongorestore -uroot -proot123 –port 27017 –authenticationDatabase admin -d world /mongodb/backup/world/

https://i-blog.csdnimg.cn/direct/e59f04a46b3b4bcebdbef90d512761d2.png

查看数据库

mongo –port 27017 admin

show dbs

https://i-blog.csdnimg.cn/direct/f039c3def99f4af4a3ac0ccf1471eec1.png

9、恢复压缩备份haha库下的log集合(MongoDB)

删除haha库下的log集合

use haha

show tables

db.log.drop()

show tables

https://i-blog.csdnimg.cn/direct/985634432fad4d6d869535346ada89ce.png

恢复

mongorestore -uroot -proot123 –port 27017 –authenticationDatabase admin -d haha -c log –gzip /mongodb/backup3/haha/log.bson.gz

https://i-blog.csdnimg.cn/direct/f5e41faa16f54763a224284e5385303c.png

查看数据

mongo –port 27017 admin

use haha

show tables

https://i-blog.csdnimg.cn/direct/ebe49f49598e4406949f99094a841802.png

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

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

oplog 介绍

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

实验环境

三台MongoDB或者实例,本人使用三个实例分别为(28017、28018、28019)

实验步骤

1、创建多实例MongoDB目录(MongoDB)

mkdir -p /mongodb/280{17..19}/{conf,data,log}

2、创建配置文件(MongoDB)

cat > /mongodb/28017/conf/mongod.conf «EOF

systemLog:

destination: file

path: /mongodb/28017/log/mongodb.log

logAppend: true

storage:

journal:

enabled: true

dbPath: /mongodb/28017/data

directoryPerDB: true

#engine: wiredTiger

wiredTiger:

engineConfig:

cacheSizeGB: 1

directoryForIndexes: true

collectionConfig:

blockCompressor: zlib

indexConfig:

prefixCompression: true

processManagement:

fork: true

net:

bindIp: 192.168.8.5,127.0.0.1

port: 28017

replication:

oplogSizeMB: 2048

replSetName: my_repl

EOF

cp  /mongodb/28017/conf/mongod.conf  /mongodb/28018/conf/

cp  /mongodb/28017/conf/mongod.conf  /mongodb/28019/conf/

sed ’s#28017#28018#g’ /mongodb/28018/conf/mongod.conf -i

sed ’s#28017#28019#g’ /mongodb/28019/conf/mongod.conf -i

3、启动MongoDB多实例(MongoDB)

mongod -f /mongodb/28017/conf/mongod.conf

mongod -f /mongodb/28018/conf/mongod.conf

mongod -f /mongodb/28019/conf/mongod.conf

netstat -anpt | grep mongod

https://i-blog.csdnimg.cn/direct/16c2953b16ec41b690578ad70279e11a.png

4、配置复制集(1主2从)(MongoDB)

mongo -port 28017 admin

config = {_id: ‘my_repl’, members: [

{_id: 0, host: ‘192.168.8.5:28017’},

{_id: 1, host: ‘192.168.8.5:28018’},

{_id: 2, host: ‘192.168.8.5:28019’}]

}

https://i-blog.csdnimg.cn/direct/9b1a8ce34a5c456ca2c6b810c9ad197f.png

初始化副本集

rs.initiate(config)

https://i-blog.csdnimg.cn/direct/bd4557e95bb945e999102a90a2e192de.png

自动选择主从

输入命令前面变成复制集的状态,一开始是SECONARY等待变成PRIMARY

https://i-blog.csdnimg.cn/direct/9d839515a56e44c782143a4f33d3869a.png

查看复制集状态

rs.status()

https://i-blog.csdnimg.cn/direct/2eab812ac5a54ec1aaf8bcdc3f9d6863.png https://i-blog.csdnimg.cn/direct/a8f8cc5af9f1499e9cbc542296bcf42e.png https://i-blog.csdnimg.cn/direct/8ef560dbb0394abe8e7c9bfb753855cf.png

5、查看操作日志(MongoDB)

use local

db.oplog.rs.find().pretty()

6、查看当前oplog时间窗口预计值(MongoDB)

rs.printReplicationInfo()

https://i-blog.csdnimg.cn/direct/102b68d99eb142eba9236add30968b47.png

oplog 配合mongodump实现热备

背景:

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

恢复思路:

1.停应用

2.找测试库

3.恢复昨天晚上全备

4.截取全备之后到base.c1误删除时间点的oplog,并恢复到测试库

5.将误删除表导出,恢复到生产库

1、先写入原始数据(MongoDB)

mongo –port 28017

use base

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

https://i-blog.csdnimg.cn/direct/8830e80afc354e619361c5d0f6674158.png

查看数据

show tables

https://i-blog.csdnimg.cn/direct/785ef143a23248fdbe5aa3d8a560cad5.png

db.c1.count()

https://i-blog.csdnimg.cn/direct/775dc641bdc54ec7bb7ce09ae1acf9c3.png

2、进行全备(MongoDB)

创建备份目录

mkdir /mongodb/oplog

mongodump –port 28017 –oplog -o /mongodb/oplog/

–oplog功能:在备份同时将备份过程中产生的日志进行备份

https://i-blog.csdnimg.cn/direct/0920dfc7a5cf4a849a73847f58b89bb3.png

查看备份文件

https://i-blog.csdnimg.cn/direct/93b229c478eb493d972c2a6b345b2195.png

oplog.bson 是自动备份的日志

3、再次写入数据(MongoDB)

mongo –port 28017

use base

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

https://i-blog.csdnimg.cn/direct/0223d5f3f56448c8b5a8db745863ed4e.png

查看数据

db.c1.count()

https://i-blog.csdnimg.cn/direct/204d17d0dd944da1a03e569427906fdf.png

4、模拟上午10点误删除c1表(MongoDB)

db.c1.drop()

https://i-blog.csdnimg.cn/direct/409a1236d1e44a499dc8c3a646dc4543.png

5、备份oplog.rs表(MongoDB)

mongodump –port 28017 -d local -c oplog.rs -o /mongodb/oplog/

https://i-blog.csdnimg.cn/direct/f976aa6e6a7445d881f9c6488e9f3dad.png

6、截取oplog(MongoDB)

mongo –port 28017

use local

查看oplog日志中的其他操作“i”是insert操作,“u”是update操作,“d”是delete操作,“c”是其他操作

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

https://i-blog.csdnimg.cn/direct/f29128109961484ea2bea39d51174f8d.png

获取到oplog误删除时间点位置“1736930382”

7、恢复全备+oplog日志(MongoDB)

cd /mongodb/oplog/local/

cp oplog.rs.bson ../oplog.bson

https://i-blog.csdnimg.cn/direct/7da062359ff84922b918a0012dc25088.png

mongorestore –port 28017 –oplogReplay –oplogLimit " 1736930382:1 " –drop /mongodb/oplog/

https://i-blog.csdnimg.cn/direct/887e6e3814734621b177804d6f074ae2.png

8、查看数据(MongoDB)

mongo –port 28017

use base

show tables

db.c1.count()

https://i-blog.csdnimg.cn/direct/0439288150e840f5bb0a552b4844ab4a.png

误删除数据已恢复

分片集群的备份思路

1、你要备份什么?

config server

shard 节点

复制集单独进行备份

2、备份有什么困难和问题

1)chunk迁移的问题

人为控制在备份的时候,避开迁移的时间窗口

2)shard节点之间的数据不在同一时间点。

选业务量较少的时候

Ops Manager 收费软件:监控免费,备份收费