MongoDB-备份和恢复
Posted hujinzhong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB-备份和恢复相关的知识,希望对你有一定的参考价值。
一、工具介绍
(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、应用例子
创建测试数据:
[mongod@mongo ~]$ 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格式的数据
操作过程:
[mongod@mongo ~]$ 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 [mongod@mongo ~]$ ll /mongodb/log.json -rw-rw-r-- 1 mongod mongod 1278890 Oct 5 11:12 /mongodb/log.json [mongod@mongo ~]$ 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
操作过程:
[mongod@mongo ~]$ 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 [mongod@mongo ~]$ ll /mongodb/log.csv -rw-rw-r-- 1 mongod mongod 398908 Oct 5 11:17 /mongodb/log.csv ##excel表格形式(可以在window打开) [mongod@mongo ~]$ 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()
操作过程:
[mongod@mongo ~]$ 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 [mongod@mongo ~]$ 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脚本
[root@db03 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 [mongod@db03 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数据库 [mongod@db03 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
以上是关于MongoDB-备份和恢复的主要内容,如果未能解决你的问题,请参考以下文章