【MongoDB】— MongoDB备份恢复及导入导出——备份恢复篇

MongoDB备份恢复及导入导出和异构平台迁移。在生产环境中,备份恢复和容灾备份至关重要,需要定时对数据库进行备份,防止异常操作后,能够快速恢复数据。

1 MongoDB工具

MongoDB自带两种工具【mongoexport/mongoimport和mongodump/mongorestore】,可满足日常导入导出和备份恢复的应用,也支持json和 csv 两种数据格式,可以实现异构平台之间数据的迁移。

1.1、工具介绍

mongoexport/mongoimport:导出/导入
mongodump/mongorestore:备份/恢复

1.2、应用场景

1 导出导入

mongoexport/mongoimport:导出导入为json和csv 格式的数据文件。可用于如下场景:
1、异构平台迁移 mysql <---> mongodb的数据互相导入。
2、同平台,跨大版本升级,如:mongodb 2 ----> mongodb 3

2 备份恢复

mongodump/mongorestore用于日常备份恢复。

2、MongoDB的导入导出

2.1 mongoexport导出详解

#mongoexport具体用法如下所示:
$ mongoexport --help  
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--authenticationDatabase admin
案例1:单表备份至json格式
mongoexport -uroot -p123 --port 27017 --authenticationDatabase admin -d student  -c users -o /data/mongodb/users.json
案例2:单表备份至csv格式
如需要导出CSV格式数据,则需要使用----type=csv参数,默认实json格式数据。
 mongoexport -uroot -p123 --port 27017 --authenticationDatabase admin -d student  -c courses --type=csv -f id,name,keshi,date  -o /mongodb/courses .csv

导出实战演练:

1、登录数据库
[mongod@mysql-master shard-mongodb]$ mongo --port 27017 admin

2、准备数据
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

> use student
switched to db student
> 
> for(i=1;i<=1000;i++){ db.users.insert({id:i,name:"RonnyStack",age:20,addr:"Chain",date:new Date()}); }
WriteResult({ "nInserted" : 1 })
> for(i=1;i<=100;i++){ db.courses.insert({"id":i,"name":"Python","keshi":240,"date":new Date()}); }
WriteResult({ "nInserted" : 1 })

> use student
switched to db student
> show tables
courses
users
> 

3、数据导出
导出json格式
[mongod@mysql-master shard-mongodb]$ mongoexport -uroot -p123 --port 27017 --authenticationDatabase admin -d student  -c users -o /data/mongodb/users.json
2021-09-26T03:51:30.843-0400    connected to: mongodb://localhost:27017/
2021-09-26T03:51:30.866-0400    exported 1000 records

导出csv格式,根据指定的列导出数据
[mongod@mysql-master shard-mongodb]$ mongoexport  -uroot -p123 --port 27017 --authenticationDatabase admin  -d student  -c courses --type=csv -f id,name,keshi,date  -o /data/mongodb/courses.csv
2021-09-26T03:57:25.561-0400    connected to: mongodb://localhost:27017/
2021-09-26T03:57:25.565-0400    exported 100 records


4、查看导出的数据。
[mongod@mysql-master mongodb]$ ll users.json courses.csv 
-rw-rw-r-- 1 mongod mongod   3911 Sep 26 03:57 courses.csv
-rw-rw-r-- 1 mongod mongod 144783 Sep 26 03:51 users.json

[mongod@mysql-master mongodb]$ head -2 users.json 
{"_id":{"$oid":"615023149259bb267e169a6f"},"id":1.0,"name":"RonnyStack","age":20.0,"addr":"Chain","date":{"$date":"2021-09-26T07:36:52.929Z"}}
{"_id":{"$oid":"615023149259bb267e169a70"},"id":2.0,"name":"RonnyStack","age":20.0,"addr":"Chain","date":{"$date":"2021-09-26T07:36:52.977Z"}}

[mongod@mysql-master mongodb]$ head -4 courses.csv 
id,name,keshi,date
1,Python,240,2021-09-26T07:37:00.558Z
2,Python,240,2021-09-26T07:37:00.582Z
3,Python,240,2021-09-26T07:37:00.582Z

2.2 mongoimport导入详解

# mongoimport 用法及案例

$ mongoimport --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导入那些列

MongoBD数据库数据恢复:
案例1:恢复JSON格式表数据到users
mongoimport -uroot -p123 --port 27017 --authenticationDatabase admin -d student -c useres  /data/mongodb/users.json

案例2:恢复CSV格式的文件数据到cousers
如上所示的是导入JSON格式的文件中的内容,如果要导入CSV格式文件中的内容,则需要通过--type参数指定导入格式。

1、csv格式的文件首行有列名字。如:列字段id,name,keshi,date。
mongoimport   -uroot -p123 --port 27017 --authenticationDatabase admin   -d student -c courses --type=csv --headerline --file  /data/mongodb/courses .csv

2、csv格式的文件首行没有列名字,第一行就是数据。
mongoimport   -uroot -p123 --port 27017 --authenticationDatabase admin   -d student -c  courses  --type=csv -f  id,name,keshi,date --file  /data//mongodb/courses .csv

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

导入实战演练:

1、登录数据库
[mongod@mysql-master mongodb]$ mongo --port 27017 admin
2、模拟我操作删除数据库数据
> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
student  0.000GB
> use student
switched to db student
> show tables
courses
users

> db.courses.drop()
true
> db.users.drop()
true
> 
> show tables
> 

3、导入已经备份的数据
[mongod@mysql-master mongodb]$ ll courses.csv  users.json 
-rw-rw-r-- 1 mongod mongod   3911 Sep 26 03:57 courses.csv
-rw-rw-r-- 1 mongod mongod 144783 Sep 26 03:51 users.json

导入Json格式的数据
[mongod@mysql-master mongodb]$mongoimport -uroot -p123 --port 27017 --authenticationDatabase admin -d student -c useres  /data/mongodb/users.json
2021-09-26T04:23:44.254-0400    connected to: mongodb://localhost:27017/
2021-09-26T04:23:44.296-0400    1000 document(s) imported successfully. 0 document(s) failed to import.
[mongod@mysql-master mongodb]$ 

导入CSV格式的数据
[mongod@mysql-master mongodb]$  mongoimport   -uroot -p123 --port 27017 --authenticationDatabase admin   -d student -c  courses  --type=csv -f  id,name,keshi,date --file  /data//mongodb/courses .csv
2021-09-26T04:26:11.681-0400    connected to: mongodb://localhost:27017/
2021-09-26T04:26:11.702-0400    101 document(s) imported successfully. 0 document(s) failed to import.
[mongod@mysql-master mongodb]$ 

4、进入数据库验证数据是否恢复
> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
student  0.000GB
> use student
switched to db student
> show tables
courses
users
> db.courses.count()
101
> db.users.count()
1000
> 

验证完,数据已经恢复。

3、MongoDB的备份恢复

mongodump/mongorestore工具用于数据库日常备份恢复,属于物理备份
mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档数据写入磁盘。

mongodump/mongorestore工具存在的问题

1、使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,
则备份出来的文件可能不完全和Mongodb实时数据相等。
2、在备份时可能会对其它客户端性能产生不利的影响。
建议:备份时一般选择业务量少,或晚上进行备份。可采用一定的备份策略,全量备份和增量备份。

mongodump和mongorestore用法详解

$ 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
注:mongodump和mongorestore用法基本相同

3.1 数据备份mongodump用法和案例详解

创建备份目录
[mongod@mysql-master mongodb]$ mkdir -vp  /data/mongodb
/bak-mongodb

1、全库备份
[mongod@mysql-master mongodb]mongodump  -uroot -p123 --port 27017 --authenticationDatabase admin -o /data/mongodb/bak-mongodb
注意:全库备份时,除了config 和local 不会备份,其他的库都会备份。在备份目录下回创建库对应的文件夹和文档对应的文件。
备份结果:
[mongod@mysql-master student]$ pwd
/data/mongodb/bak-mongodb/student
[mongod@mysql-master bak-mongodb]$ ll
total 0
drwxrwxr-x 2 mongod mongod  69 Sep 26 05:44 admin
drwxrwxr-x 2 mongod mongod 147 Sep 26 05:44 student
[mongod@mysql-master bak-mongodb]$ cd student/
[mongod@mysql-master student]$ ll
total 216
-rw-rw-r-- 1 mongod mongod  9380 Sep 26 05:44 courses.bson
-rw-rw-r-- 1 mongod mongod   163 Sep 26 05:44 courses.metadata.json
-rw-rw-r-- 1 mongod mongod 98000 Sep 26 05:44 useres.bson
-rw-rw-r-- 1 mongod mongod   162 Sep 26 05:44 useres.metadata.json
-rw-rw-r-- 1 mongod mongod 98000 Sep 26 05:44 users.bson
-rw-rw-r-- 1 mongod mongod   161 Sep 26 05:44 users.metadata.json
[mongod@mysql-master student]$ 


2、备份单库,如备份student库。
[mongod@mysql-master student]$  mongodump   -uroot -p123 --port 27017 --authenticationDatabase admin -d student -o /data/mongodb/bak-mongodb
注意:会创建与库同名的文件目录,并备份改库下的所有的文档。

3、备份库下的表,备份student库下的文档users。
[mongod@mysql-master student]$  mongodump   -uroot -p123 --port 27017 --authenticationDatabase admin -d student-c users-o /data/mongodb/bak-mongodb
注意:创建与库同名的目录,备份users文档,其他的文档不做备份。

4、压缩备份:压缩备份全库,压缩备份某一个库,压缩备份某个库下的表
[mongod@mysql-master mongodb] mongodump  -uroot -p123 --port 27017 --authenticationDatabase admin -o /data/mongodb/bak-mongodb   --gzip
[mongod@mysql-master student]$ mongodump   -uroot -p123 --port 27017 --authenticationDatabase admin -d student -o /data/mongodb/bak-mongodb    --gzip
[mongod@mysql-master student]$ mongodump   -uroot -p123 --port 27017 --authenticationDatabase admin -d student-c users-o /data/mongodb/bak-mongodb  --gzip

查看备份结果
[mongod@mysql-master bak-mongodb]$ pwd
/data/mongodb/bak-mongodb
[mongod@mysql-master bak-mongodb]$ ll
total 0
drwxrwxr-x 2 mongod mongod  75 Sep 26 05:56 admin
drwxrwxr-x 2 mongod mongod 165 Sep 26 05:56 student
[mongod@mysql-master bak-mongodb]$ cd student/
[mongod@mysql-master student]$ ll
total 32
-rw-rw-r-- 1 mongod mongod  765 Sep 26 05:56 courses.bson.gz
-rw-rw-r-- 1 mongod mongod  148 Sep 26 05:56 courses.metadata.json.gz
-rw-rw-r-- 1 mongod mongod 6058 Sep 26 05:56 useres.bson.gz
-rw-rw-r-- 1 mongod mongod  147 Sep 26 05:56 useres.metadata.json.gz
-rw-rw-r-- 1 mongod mongod 6074 Sep 26 05:56 users.bson.gz
-rw-rw-r-- 1 mongod mongod  147 Sep 26 05:56 users.metadata.json.gz
[mongod@mysql-master student]$ 

注意:压缩备份时,会在备份目录下创建与数据库同名的目录,然后对库中的表使用压缩,.gz结尾。

3.12 数据恢复mongorestore用法和案例详解

1、恢复某一个库
[mongod@mysql-master mongodb]$ mongorestore   -uroot -p123 --port 27017 --authenticationDatabase admin -d student1  /data/mongodb/bak-mongodb/student  
 注意:恢复时,备份目录的路径指定到某库即可,如/data/mongodb/bak-mongodb/student ,表示恢复student数据库。如果没有指定到student库名,表示恢复当前目录下所有备份的数据库。

2、恢复某一个库下的表
[mongod@mysql-master mongodb]$ mongorestore   -uroot -p123 --port 27017 --authenticationDatabase admin -d student2 -c users  /data/mongodb/bak-mongodb/student/users.bson 
注意:恢复某个库下的某一个表时,恢复目录指定到表的bson文件。

3、压缩恢复
[mongod@mysql-master mongodb]$ mongorestore   -uroot -p123 --port 27017 --authenticationDatabase admin -d student1  /data/mongodb/bak-mongodb/student  --gzip
[mongod@mysql-master mongodb]$ mongorestore   -uroot -p123 --port 27017 --authenticationDatabase admin -d student2 -c users  /data/mongodb/bak-mongodb/student/users.bson.gz
  --gzip
注意:压缩恢复时,在普通恢复的基础上加--gizp参数即可。

4、如果恢复时,已经存在相同的数据库,通过drop指令强制恢复数据,会删除之前的库,恢复到新库状态。谨慎操作!!!
[mongod@mysql-master mongodb]$ mongorestore  -uroot -p123 --port 27017 --authenticationDatabase admin -d student --drop  /data/mongodb/bak-mongodb/student
注意:--drop参数谨慎操作,生产环境不可用。

4、异构平台【MongoDB和Mysql】数据之间数据迁移

案例:异构平台【MongoDB和Mysql】数据之间数据迁移。mysql数据库迁移到mongodb数据,迁移方案是将mysql的数据表导出为csv格式数据,然后通过mongodb的导入工具导入到数据库中,实现数据迁移。

1、mysql开启安全路径
vim /etc/my.cnf   --->添加以下配置
secure-file-priv=/tmp
注意:重启数据库生效/etc/init.d/mysqld restart

2、导出mysql的表中的数据,如city表。
source /root/world.sql
导入方法:
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 -uroot -p123 --port 27017 --authenticationDatabase admin -d world  -c city --type=csv -f ID,Name,CountryCode,District,Population --file  /tmp/city.csv

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


思考:如果world数据库共有100张表,如何获取列明,全部迁移到mongodb,如何做?

获取表的所有列名称
select table_name ,group_concat(column_name) from columns where table_schema='world' group by table_name;

导出数据表为csv格式
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和mongodb数据库之间数据迁移
mysql导出和导入csv格式的数据:
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'; 

至此:MongoDB数据库备份恢复和数据迁移介绍完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容