262_Mongodb_备份恢复

举报
alexsully 发表于 2021/12/28 19:46:56 2021/12/28
【摘要】 mongodb备份恢复 数据导入导出

评估备份方案两个指标

下面两个指标决定全备份和增备的时间间隔

  • 1 RPO recovery point objective 数据库可以承受多少时间的数据丢失  (增备)
  • 2 RTO recovery time objective  数据库可以承受多长时间的停机 (全备)

MongoDB的逻辑/物理备份

  • 逻辑备份:通过命令导出/导入数据文件
  • 物理备份: 直接复制硬盘上的数据文件,

 

逻辑备份 mongodumpmongorestore

a.介绍

  • mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘;无法迁移系统库adminlocal
  • 直接对mongos & mongod进行操作,备份的数据及数据结构以BSON格式存储
  • mongodump 命令依赖游标,每次备份将数据加载到内存,吃性能(内存/IO) 适合小型/单一数据库备份中
  • mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,则备份出来的文件可能不完全和Mongodb实时数据相等

 b mongodump & mongorestore参数

$ mongodump –help

$ mongorestore –help

参数说明:

 

公共参数

-h

--host 指明数据库宿主机的IP

--port  数据库端口

-u

--username 指明数据库的用户名

-p

--password 指明数据库的密码

-d

--db 指明数据库的名字

-c

--collection 指明collection的名字

 

--authenticationDatabase 认证数据库

-j

--numParallelCollections= number of collections to dump in parallel (4 by default)

mongodump

 

-q

--query 指明导出数据的过滤条件

-o

--out 指明到要导出的文件名

 

--oplog 备份的同时备份oplog

 

--numParallelCollections= number of collections to dump in parallel (4 by default)

 

 

mongorestore

 

--dir

恢复备份文件存放的位置

--drop

先对目标数据库中数据删除,在进行恢复

c mongodumpmongorestore基本使用

全库备份
mkdir /mongodb/backup -p
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup

--备份test库
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -o /mongodb/backup/

--备份test库下的log集合
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log -o /mongodb/backup/

--压缩备份
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup/ --gzip

--全备中恢复单库
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world /mongodb/backup/test --gzip

--全备中恢复单表
[mongod@db01 backup]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d a -c t1 /mongodb/backup/test/city.bson.gz --gzip

--drop表示恢复的时候把之前的集合drop掉(危险)
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d test --drop /mongodb/backup/test


2  数据导出mongoexport & 导入mongoimport

与备份不同, 导出是以集合为单位, 只导出数据本身,并不能保证数据导出后的字段类型,且导出的数据可以直接阅读 (json & csv格式可选)

导出与备份类似; 多了欲导出的字段和导出的文件格式

参数汇总

公共参数

 

-p

-h

-d

-c

--port –password

--host ip地址

--db 数据库 

--collection 集合

-u

-p

--username --password 用户名 & 密码

 

 

--authenticationDataabase 认证数据库

-f

--fields 导出字段,用逗号分库,默认导出所有字段

 

 

Mongoexport

 

-q

导出数据的筛选条件,默认全部条件

--type

CSV JSON 默认json

-o

--out 导出路径

 

 

Mongoimport

 

--headerline

如果知道第一行是字段名,则无需导入,导入CSV时候使用,后面不需要加变量,与 –f 互斥

--file

导入文件路径

--drop

导入前删除

use test
for(i=0;i<10000;i++){
db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }

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

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


数据恢复:
1.恢复json格式表数据到log1
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log1 /mongodb/log.json


2.恢复csv格式的文件到log2
上面演示的是导入JSON格式的文件中的内容,如果要导入CSV格式文件中的内容,则需要通过--type参数指定导入格式,具体如下所示:
注意:
(1)csv格式的文件头行,有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log2 --type=csv --headerline --file /mongodb/log.csv

(2)csv格式的文件头行,没有列名字 --headerline:指明第一行是列名,不需要导入

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

异构mysql2MongoDB迁移_字段顺序可能不准

例 异构平台迁移案例(离线) mysql2mongodb world数据库下city表进行导出,导入到mongodb
(1)mysql开启安全路径
    vim /etc/my.cnf --->添加以下配置
    secure-file-priv=/data/backup/
    /etc/init.d/mysqld restart   --重启数据库生效
(2)导出mysql的city表数据
select * from world.city into outfile '/tmp/t100w.csv' fields terminated by ',' ENCLOSED BY '"' ;
(3)获取列信息
mysql> select table_name,group_concat(column_name) from information_schema.columns where table_schema='test' group by table_name order by null ;
+------------+---------------------------+
| TABLE_NAME | group_concat(column_name) |
| t100w       | dt,id,k1,k2,num |
+------------+---------------------------+ 

在mongodb中导入备份
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c city --type=csv -f ID,Name,CountryCode,District,Population --file /tmp/t100w.csv
use world
db.t100w.find({});

将MySQL大量表迁移到MongoDB

(1) 批量从MySQL导出多张表
mysqldump --fields-terminated-by ',' --fields-enclosed-by '"' world -T /tmp/
cd /data/backup
rm -rf /data/backup/*.sql
find ./ -name "*.txt" | awk -F "." '{print $2}' | xargs -i -t mv ./{}.txt ./{}.csv

(2) 拼接语句
select concat("mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d ",table_schema, " -c",table_name ," --type=csv "," -f ",
group_concat(column_name) ," --file /data/backup/",table_name ,".csv") from information_schema.columns where table_schema='world' group by table_name;

(3) 导入数据
[mongod@db01 backup]$ ll
total 256
-rwxrwxrwx 1 mysql mysql 184355 Jul 22 13:45 city.csv
-rwxrwxrwx 1 mysql mysql 38659 Jul 22 13:45 country.csv
-rwxrwxrwx 1 mysql mysql 26106 Jul 22 13:45
countrylanguage.csv
-rwxrwxrwx 1 mysql mysql 656 Jul 22 13:45 import.sh
[mongod@db01 backup]$ sh import.sh
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。