MongoDB-备份和恢复

时间:2021-11-15 02:20:20

一、工具介绍

(1)mongoexport/mongoimport   #导入/导出的是JSON格式或者CSV格式

(2)mongodump/mongorestore    #导入/导出的是BSON格式

二、备份工具区别

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

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

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

三、应用场景

mongoexport/mongoimport:  json csv

  • 异构平台迁移 mysql <---> mongodb
  • 同平台,跨大版本:mongodb 2 ----> mongodb 3

mongodump/mongorestore:日常备份恢复使用

四、mongoexport/mongoimport工具

4.1、导出工具mongoexport

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

可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。适合如下场景:

  • (1)版本差异较大
  • (2)异构平台数据迁移

4.1.1、具体参数说明

$ mongoexport --help  

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

4.1.2、应用例子

创建测试数据:

[[email protected] ~]$ mongo -u root -p root123 10.0.0.21/admin
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> use oldboy
switched to db oldboy
> for(i=0;i<10000;i  ){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}
WriteResult({ "nInserted" : 1 })
> db.log.find()
{ "_id" : ObjectId("5d9809219455703947fc9855"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.040Z") }
{ "_id" : ObjectId("5d9809219455703947fc9856"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.052Z") }
{ "_id" : ObjectId("5d9809219455703947fc9857"), "uid" : 2, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.053Z") }
{ "_id" : ObjectId("5d9809219455703947fc9858"), "uid" : 3, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.053Z") }
{ "_id" : ObjectId("5d9809219455703947fc9859"), "uid" : 4, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.054Z") }
{ "_id" : ObjectId("5d9809219455703947fc985a"), "uid" : 5, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.054Z") }
{ "_id" : ObjectId("5d9809219455703947fc985b"), "uid" : 6, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.055Z") }
{ "_id" : ObjectId("5d9809219455703947fc985c"), "uid" : 7, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.055Z") }
{ "_id" : ObjectId("5d9809219455703947fc985d"), "uid" : 8, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.056Z") }
{ "_id" : ObjectId("5d9809219455703947fc985e"), "uid" : 9, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.056Z") }
{ "_id" : ObjectId("5d9809219455703947fc985f"), "uid" : 10, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.057Z") }
{ "_id" : ObjectId("5d9809219455703947fc9860"), "uid" : 11, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.058Z") }
{ "_id" : ObjectId("5d9809219455703947fc9861"), "uid" : 12, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
{ "_id" : ObjectId("5d9809219455703947fc9862"), "uid" : 13, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
{ "_id" : ObjectId("5d9809219455703947fc9863"), "uid" : 14, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.059Z") }
{ "_id" : ObjectId("5d9809219455703947fc9864"), "uid" : 15, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
{ "_id" : ObjectId("5d9809219455703947fc9865"), "uid" : 16, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
{ "_id" : ObjectId("5d9809219455703947fc9866"), "uid" : 17, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.060Z") }
{ "_id" : ObjectId("5d9809219455703947fc9867"), "uid" : 18, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.061Z") }
{ "_id" : ObjectId("5d9809219455703947fc9868"), "uid" : 19, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.061Z") }
Type "it" for more
> 

1)单表备份至json格式

mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
#注意:备份文件的名字可以自定义,默认导出了JSON格式的数据

操作过程:

[[email protected] ~]$ mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
2019-10-05T11:12:02.048 0800	connected to: localhost:27017
2019-10-05T11:12:02.406 0800	exported 10000 records
[[email protected] ~]$ ll /mongodb/log.json 
-rw-rw-r-- 1 mongod mongod 1278890 Oct  5 11:12 /mongodb/log.json
[[email protected] ~]$ head -2 /mongodb/log.json
{"_id":{"$oid":"5d9809219455703947fc9855"},"uid":0.0,"name":"mongodb","age":6.0,"date":{"$date":"2019-10-05T03:08:17.040Z"}}
{"_id":{"$oid":"5d9809219455703947fc9856"},"uid":1.0,"name":"mongodb","age":6.0,"date":{"$date":"2019-10-05T03:08:17.052Z"}}

2)单表备份至csv格式

#如果我们需要导出CSV格式的数据,则需要使用--type=csv参数:
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log --type=csv -f uid,name,age,date  -o /mongodb/log.csv

操作过程:

[[email protected] ~]$ mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log --type csv -f uid,name,age,date -o /mongodb/log.csv
2019-10-05T11:17:21.864 0800	connected to: localhost:27017
2019-10-05T11:17:21.994 0800	exported 10000 records
[[email protected] ~]$ ll /mongodb/log.csv
-rw-rw-r-- 1 mongod mongod 398908 Oct  5 11:17 /mongodb/log.csv  ##excel表格形式(可以在window打开)
[[email protected] ~]$ head -5 /mongodb/log.csv 
uid,name,age,date
0,mongodb,6,2019-10-05T03:08:17.040Z
1,mongodb,6,2019-10-05T03:08:17.052Z
2,mongodb,6,2019-10-05T03:08:17.053Z
3,mongodb,6,2019-10-05T03:08:17.053Z

4. 2、导入工具mongoimport

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

4.2.1、具体参数说明

$ mongoimport --help

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

4.2.2、应用例子

1)恢复json格式表数据到log1

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

#查看:
mongo -uroot -proot123 10.0.0.21/admin
use oldboy
show tables
db.log1.find()

操作过程:

[[email protected] ~]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json 
2019-10-05T11:24:04.405 0800	connected to: localhost:27017
2019-10-05T11:24:04.616 0800	imported 10000 documents
[[email protected] ~]$ mongo -uroot -proot123 10.0.0.21/admin
MongoDB shell version v3.6.11-14-g48d999c
connecting to: mongodb://10.0.0.21:27017/admin?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("22f6f963-7f08-4a08-a674-eca7afb3ecdb") }
MongoDB server version: 3.6.11-14-g48d999c
> use oldboy
switched to db oldboy
> show tables
log
log1
> db.log1.find()
{ "_id" : ObjectId("5d9809219455703947fc9855"), "uid" : 0, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.040Z") }
{ "_id" : ObjectId("5d9809219455703947fc9856"), "uid" : 1, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-10-05T03:08:17.052Z") }
....
Type "it" for more
> 

2) 恢复csv格式的文件到log2

导入CSV格式文件中的内容,则需要通过--type参数指定导入格式

①当csv格式的文件头行,有列名字

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

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

②当csv格式的文件头行,没有列名字 ==>手工添加列名

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

3)案例:mysql表导入mongodb

示例:mysql 的world数据库下city表进行导出,导入到mongodb

#1、mysql开启安全路径
vim /etc/my.cnf
secure-file-priv=/tmp

#2、重启数据库生效
/etc/init.d/mysqld restart

#3、导出mysql的city表数据
source /root/world.sql
select * from world.city into outfile ‘/tmp/city1.csv‘ fields terminated by ‘,‘;  #指定分隔符

#4、处理备份文件
desc world.city得到表的列名称
vim /tmp/city.csv   #添加第一行列名信息
ID,Name,CountryCode,District,Population

#5、在mongodb中导入备份
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world  -c city --type=csv -f ID,Name,CountryCode,District,Population --file  /tmp/city1.csv

#6、登录mongodb查看
mongo -uroot -proot123 --port 27017
use world
db.city.find({CountryCode:"CHN"});

4) mysql表批量导入mongodb脚本

[[email protected] scripts]# cat  mysql_mongo.sh
#/bin/sh
DATABASE=world
[ ! -d /tmp/bak ] &&  mkdir /tmp/bak || rm -fr /tmp/bak/*
BACKDIR=/tmp/bak
chmod 777 $BACKDIR

for TABLE in  `mysql -e "show tables from ${DATABASE};"|sed ‘1d‘`
do
	TABLE_HEAD="select COLUMN_NAME from information_schema.columns where TABLE_SCHEMA=‘${DATABASE}‘ and TABLE_NAME=‘${TABLE}‘ into outfile ‘$BACKDIR/${DATABASE}_${TABLE}.txt‘ fields terminated by ‘,‘  lines terminated by ‘,‘;"
	mysql -e "$TABLE_HEAD"
	sed -i -r ‘s#(.*).#1#g‘ $BACKDIR/${DATABASE}_${TABLE}.txt
done

#create data file
DATA_SQL="select * from (select concat("select * from ",table_schema,".",table_name ," into outfile ‘$BACKDIR/",table_schema,"_",table_name,".csv‘ fields terminated by ‘,‘;") from information_schema.tables where table_schema =‘${DATABASE}‘) aa into outfile ‘$BACKDIR/bak_${DATABASE}.sql‘;"
mysql -e "$DATA_SQL"
mysql -e "source $BACKDIR/bak_${DATABASE}.sql;"
rm -f $BACKDIR/bak_${DATABASE}.sql

for TABLE in  `mysql -e "show tables from ${DATABASE};"|sed ‘1d‘`
do
	HEAD=`cat $BACKDIR/${DATABASE}_${TABLE}.txt`
	sed -i "1i ${HEAD}" $BACKDIR/${DATABASE}_${TABLE}.csv
	mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d ${DATABASE}  -c ${TABLE} --type=csv --headerline  --file  $BACKDIR/${DATABASE}_${TABLE}.csv
	rm -f $BACKDIR/${DATABASE}_${TABLE}.txt
done

五、mongodump/mongorestore工具

5.1、介绍

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

5.2、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

5.3、 mongodump和mongorestore基本使用

5.3.1、全库备份

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

[[email protected] mongodb]$ tree backup/
backup/
|-- admin
|   |-- system.users.bson
|   |-- system.users.metadata.json
|   |-- system.version.bson
|   `-- system.version.metadata.json
`-- world
    |-- city.bson				#bson格式数据
    |-- city.metadata.json		#json元数据
    |-- country.bson
    |-- country.metadata.json
    |-- countrylanguage.bson
    `-- countrylanguage.metadata.json

5.3.2、备份world库

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

5.3.3、备份world库下的city集合

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city -o /mongodb/backup/

5.3.4、压缩备份

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/ --gzip			#压缩备份整个world数据库

[[email protected] backup]$ tree
.
`-- world
    |-- city.bson.gz
    |-- city.metadata.json.gz
    |-- country.bson.gz
    |-- country.metadata.json.gz
    |-- countrylanguage.bson.gz
`-- countrylanguage.metadata.json.gz

mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city -o /mongodb/backup/ --gzip			#压缩备份数据库下的表

5.3.5、 恢复world库

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

5.3.6、恢复world库下的city集合

mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city  --gzip  /mongodb/backup.bak/oldboy/log1.bson.gz

5.3.7、--drop表示恢复的时候把之前的集合drop掉(危险)

mongorestore  -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy