跳转至

6. 备份恢复-mongoexport

1. 备份恢复工具

#1.mongoexport/mongoimport
    导入、导出的是json或csv格式
#2.mongodump/mongorestore
    导入、导出的是bson格式

#3.json和bson区别
    json可读性强但体积较大
    bson是二进制文件,体积小但对人几乎没有可读性

2. 跨版本迁移

#1.注意问题
    1.在一些mongodb版本之间,bson格式可能会随版本不同而有所不同,所以不同版本之间用mongodump、mongorestore可能不会成功,具体看版本之间的兼容性。

    2.当无法使用bson进行跨版本的数据迁移的时候,使用json格式是一个可选项。

    3.跨版本的mongodump/mongorestore个人并不推荐,实在要做请先检查文档查看连个版本是否兼容(大部分时候是的)。

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

#2.迁移分类
    2.1 异构平台迁移:MySQL---mongodb
    2.2 同平台,跨大版本:mongodb2---mongodb3
    #以上都可以使用:mongoexport/mongoimport:json csv

3. 导出工具mongoexport

3.1 介绍

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

3.2 参数说明

$ mongoexport --help
-h:IP
-u:用户名
-p:密码
-d:数据库名
-c:集合名
-f:指明要导出哪些列
-o:指明要导出的文件             #注意:备份文件的名字可以自定义,默认导出json格式数据               
--type=csv                     #如果要导出csv格式的数据,则需要加入此参数
-q:指明导出数据的过滤条件
--authenticationDatabase admin  #指明验证库

3.3 启动单节点

su - mongod

mongod -f /mongodb/conf/mongo.conf

netstat -tunlp|grep 27017
[mongod@151 ~]$ mongod -f /mongodb/conf/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 30019
child process started successfully, parent exiting
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$ netstat -tunlp|grep 27017
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      30019/mongod
[mongod@151 ~]$ mongo -uroot -proot123 --port 27017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:27017/admin
>
> show dbs
admin  0.000GB
app    0.000GB
local  0.000GB
test   0.000GB
> exit
bye

3.4 单表备份为json格式

mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c log -o /mongodb/log.json
[mongod@151 ~]$ mongo -uroot -proot123 --port 27017 admin
MongoDB shell version: 3.2.22
connecting to: 127.0.0.1:27017/admin
> use app
switched to db app
> show tables;
a
b
log
>
> db.log.count()
10000
>
> exit
bye
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$ mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c log -o /mongodb/log.json
2021-05-13T13:37:40.756+0800    connected to: localhost:27017
2021-05-13T13:37:41.008+0800    exported 10000 records
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb/
28017  28019  38017  38019  38021  38023  38025  bin   data  log.json
28018  28020  38018  38020  38022  38024  38026  conf  log
[mongod@151 ~]$

3.5 查看备份后的json文件

cat /mongodb/log.json
[mongod@151 ~]$ head /mongodb/log.json
{"_id":{"$oid":"609b554400177802e2f209b6"},"uid":0.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.840Z"}}
{"_id":{"$oid":"609b554400177802e2f209b7"},"uid":1.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.845Z"}}
{"_id":{"$oid":"609b554400177802e2f209b8"},"uid":2.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.845Z"}}
{"_id":{"$oid":"609b554400177802e2f209b9"},"uid":3.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.846Z"}}
{"_id":{"$oid":"609b554400177802e2f209ba"},"uid":4.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.846Z"}}
{"_id":{"$oid":"609b554400177802e2f209bb"},"uid":5.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.847Z"}}
{"_id":{"$oid":"609b554400177802e2f209bc"},"uid":6.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.847Z"}}
{"_id":{"$oid":"609b554400177802e2f209bd"},"uid":7.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.847Z"}}
{"_id":{"$oid":"609b554400177802e2f209be"},"uid":8.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.848Z"}}
{"_id":{"$oid":"609b554400177802e2f209bf"},"uid":9.0,"name":"mongodb","age":6.0,"date":{"$date":"2021-05-12T04:10:44.849Z"}}
[mongod@151 ~]$

3.6 登录单节点,查看表结构

mongo -uroot -proot123 admin
show dbs
use app
db.log.findOne()
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> show dbs
admin  0.000GB
app    0.000GB
local  0.000GB
test   0.000GB
>
> use app
switched to db app
>
> db.log.findOne()
{
        "_id" : ObjectId("609b554400177802e2f209b6"),
        "uid" : 0,
        "name" : "mongodb",
        "age" : 6,
        "date" : ISODate("2021-05-12T04:10:44.840Z")
}
>
> exit
bye

3.7 单表备份为csv格式

#根据上一步得到-f参数后跟的列名
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c log --type=csv -f uid,name,age,date -o /mongodb/log.csv
[mongod@151 ~]$ mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c log --type=csv -f uid,name,age,date -o /mongodb/log.csv
2021-05-13T13:43:04.466+0800    connected to: localhost:27017
2021-05-13T13:43:04.633+0800    exported 10000 records
[mongod@151 ~]$
[mongod@151 ~]$ ls /mongodb
28017  28019  38017  38019  38021  38023  38025  bin   data  log.csv
28018  28020  38018  38020  38022  38024  38026  conf  log   log.json
[mongod@151 ~]$

3.8 查看csv文件

cat /mongodb/log.csv
[mongod@151 ~]$ head -5 /mongodb/log.csv
uid,name,age,date
0,mongodb,6,2021-05-12T04:10:44.840Z
1,mongodb,6,2021-05-12T04:10:44.845Z
2,mongodb,6,2021-05-12T04:10:44.845Z
3,mongodb,6,2021-05-12T04:10:44.846Z

4. 导入工具mongoimport

4.1 介绍

mongoimport工具可以把一个特定格式文件中的内容大都如到指定的collection中。该工具可以导入json格式和csv格式的数据

4.2 参数说明

$ mongoimport --help
-h:IP
-u:用户名
-p:密码
-d:数据库名
-c:集合名
-f:指明要导入哪些列             
--type=csv                     #如果要导出csv格式的数据,则需要加入此参数
--authenticationDatabase admin  #指明验证库
-j,--numInsertionWorkers=<number>  number of insert operations to run
concurrently

4.3 恢复json格式表数据到log1

mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json
[mongod@151 ~]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabse admin -d oldboy -c log1 /mongodb/log.json
2021-05-13T13:44:36.314+0800    error parsing command line options: unknown option "authenticationDatabse"
2021-05-13T13:44:36.314+0800    try 'mongoimport --help' for more information
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json
2021-05-13T13:44:58.122+0800    connected to: localhost:27017
2021-05-13T13:44:58.580+0800    imported 10000 documents

4.4 登录查看log1

mongo -uroot -proot123 admin
show dbs
use oldboy
show tables
db.log1.count()
db.log1.findOne()
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> show dbs
admin   0.000GB
app     0.000GB
local   0.000GB
oldboy  0.000GB
test    0.000GB
>
> use oldboy
switched to db oldboy
>
> show tables
log1
>
> db.log1.count()
10000
>
> db.log1.findOne()
{
        "_id" : ObjectId("609b554400177802e2f209b6"),
        "uid" : 0,
        "name" : "mongodb",
        "age" : 6,
        "date" : ISODate("2021-05-12T04:10:44.840Z")
}
>
> exit
bye

4.5 恢复csv格式的文件到log2,log3

#1.如果csv文件的第一行有列名字,则使用此命令恢复
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log2 --type=csv --headerline --file /mongodb/log.csv

#2.如果csv文件的第一行没有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log3 --type=csv -f uid,name,age,date --file /mongodb/log3.csv

    #准备log3.csv
    cp /mongodb/log.csv /mongodb/log3.csv
    vim /mongodb/log3.csv
        删除标题行
#1.
[mongod@151 ~]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log2 --type=csv --headerline --file /mongodb/log.csv
2021-05-13T13:49:41.956+0800    connected to: localhost:27017
2021-05-13T13:49:42.304+0800    imported 10000 documents
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> use oldboy
switched to db oldboy
>
> show tables
log1
log2
>
> db.log2.findOne()
{
        "_id" : ObjectId("609cbdf59a08c79261164f5d"),
        "uid" : 0,
        "name" : "mongodb",
        "age" : 6,
        "date" : "2021-05-12T04:10:44.840Z"
}
>
> exit
bye

#2.
[mongod@151 ~]$ cp /mongodb/log.csv /mongodb/log3.csv
[mongod@151 ~]$
[mongod@151 ~]$ head -2 /mongodb/log3.csv
uid,name,age,date
0,mongodb,6,2021-05-12T04:10:44.840Z
[mongod@151 ~]$
[mongod@151 ~]$ vim /mongodb/log3.csv
[mongod@151 ~]$
[mongod@151 ~]$ head -2 /mongodb/log3.csv
0,mongodb,6,2021-05-12T04:10:44.840Z
1,mongodb,6,2021-05-12T04:10:44.845Z
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log3 --type=csv -f uid,name,age,date --file /mongodb/log3.csv
2021-05-13T13:51:28.695+0800    connected to: localhost:27017
2021-05-13T13:51:29.730+0800    imported 10000 documents
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> use oldboy
switched to db oldboy
>
> show tables
log1
log2
log3
>
> db.log3.findOne()
{
        "_id" : ObjectId("609cbe609a08c7926116766d"),
        "uid" : 0,
        "name" : "mongodb",
        "age" : 6,
        "date" : "2021-05-12T04:10:44.840Z"
}
>
> exit
bye

#3.测试有标题列的csv文件使用-f参数恢复
    #命令:mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log4 --type=csv -f uid,name,age,date --file /mongodb/log.csv

[mongod@151 ~]$ head -2 /mongodb/log.csv
uid,name,age,date
0,mongodb,6,2021-05-12T04:10:44.840Z
[mongod@151 ~]$
[mongod@151 ~]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log4 --type=csv -f uid,name,age,date --file /mongodb/log.csv
2021-05-13T13:56:28.842+0800    connected to: localhost:27017
2021-05-13T13:56:29.746+0800    imported 10001 documents
[mongod@151 ~]$
[mongod@151 ~]$
[mongod@151 ~]$ mongo -uroot -proot123 admin
MongoDB shell version: 3.2.22
connecting to: admin
>
> use oldboy
switched to db oldboy
>
> show tables
log1
log2
log3
log4
>
> db.log4.count()
10001
>
> db.log4.findOne()
{
        "_id" : ObjectId("609cbf8c9a08c79261169d7d"),
        "uid" : "uid",
        "name" : "name",
        "age" : "age",
        "date" : "date"
}
> exit
bye

#发现不行,会把标题行加到数据中!!!!

4.6 登录查看log2,log3

mongo -uroot -proot123 admin
use oldboy
show tables
db.log2.count()
db.log2.findOne()
db.log3.count()
db.log3.findOne()

最后更新: 2022-02-20 11:21:58