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数据库备份恢复和数据迁移介绍完成。