Mongoldb 备份恢复

备份工具介绍

1. ** mongoexport/mongoimport
2. **** mongodump/mongorestore

备份工具区别 及 应用场景

mongoexport/mongoimport			导入/导出 格式是 json 或 csv格式
mongodump/mongorestore			导入/导出 格式是 bson 格式

应用场景:
mongoexport/mongoimport:json csv
1、异构平台迁移   mysql <----> mongodb
2、同平台,跨大版本:mongodb 2  -----> mongodb 3


mongodump/mongorestore
日常备份恢复使用

导出工具 mongoexport

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

Mongoexport。具体用法如下所示:
mongoexport --help 
参数说明:

-h:指明数据库宿主机的 Ip 
-u:指明数据库的用户名 
-p:指明数据库的密码 
-d:指明数据库的名字 
-c:指明 collection 的名字 
-f:指明要导出那些列 
-o: 指明到要导出的文件名 
-q:指明导出数据的过滤条件
--authenticationDatabase admin

1. 单表备份至 json 格式
use test
for (i=0; i <10000; i++){ db.log.insert({"uid":i, "name": "mongodb", "age": 6, "date": new Date() });

mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log -o /mongodb/log.json


注:备份文件的名字可以自定义,默认导出了 JSoN 格式的数据。
2. 单表备份至 cv 格式
如果我们需要导出 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


导入工具mongoimport

Mongodb 中的 mongoimport。工具可以把一个特定格式文件中的内容导入到指定的 collection 中。该工具可以导入 JsoN 格式数据,也可以导入 CsV 格式数据。具体使用如下所示:

mongoimport --help 
参数说明:
--drop: 删除原来的表,然后倒入,防止id键冲突
-h:指明数据库宿主机的 Ip 
-u:指明数据库的用户名 
-p:指明数据库的密码 
-d:指明数据库的名字 
-c:指明 collection 的名字 
-f:指明要导入那些列
-j, --numInsertionWorkers=<number> number of insert operations to run concurrently
    																				 (defaults to 1)

// 并行

数据恢复:
1.恢复json格式表数据到log1
# 如果直接倒入,会使 id 键冲突,原表 id 和 log备份中的数据 id键冲突
# --drop 这里比较危险,可以导入到一个 不存在的表中;避免误删数据
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log1 --file /mongodb/log.json

mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin --drop -d test -c log1 --file /mongodb/log.json

# 导入一个不存在的表中,可以添加 -j n 来并发导入;
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log2 --file /mongodb/log.json

mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log2 -j 2 --file /mongodb/log.json

2.恢复csv格式的文件到log2
# 如果要导入csv格式的文集爱你,需要 --type 参数制定导入格式,具体如下:

(1.csv 格式的文件头部没有列名称;
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log2 -j 4 --type=csv -f id,name,age,date --file /mongodb/log.json

(2.csv格式的文件头部有列名
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log2 -j 4 --type=csv --file /mongodb/log.json

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


3.异构平台迁移案例(离线)
mysql --》 mongodb
world数据库下city表进行导出,导入到mongodb
mysql 导出的 csv 格式的文件,第一列没有列名;

(1.mysql开启安全路径
vim /etc/my.cnf --> 添加如下配置
secure-file-prive=/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;

(4.在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 ({});

4.彩蛋 ---- 如何将MySQL大量迁移到MongoDB
痛点:
(1.批量从MySQL导出多张表
mysqldump --filelds-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. 导入数据
# ls 
city.csv country.csv countrylanguage.csv import.sh

sh import.sh

mongodump 和 mongorestore

a. 介绍

mongodump 能够在 Mongodb 运行时进行备份,它的工作原理是对运行的 Mongodb 做查询,然后将所有查到的文栏写入磁盘
但是存在的问题时使用 mongodump 产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,则备份出来的文件可能不完全和 Mongodb 实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。
bjson 格式

b. 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

c. mongodump 和 mongorestore 基本使用

全库备份
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 库下的 1og 集合
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 word /mongodb/backup/test --gzip

--全备中恢复单表
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

D. Mongodump 和 mongorestore 高级企业应用(–oplog)

注意:这是 replica set 模式专用 
--oplog
use oplog for taking a point-in-time snapshot

# op1og 介绍
在 replica set 中 oplog 是一个定容集合(capped collection),它的默认大小是磁盘空间的 5%(可以通过--oplogsizeMB 参数修改),

位于 local 库的 db.oplog.rs,有兴趣可以看看里面到底有些什么内容。
其中记录的是整个 mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。当空间用完时新记录自动覆盖最老的记录。
其覆盖范围被称作 oplog 时间窗口。需要注意的是,因为 oplog 是一个定容集合,所以时间窗口能灌盖的范围会因为你单位时间内的更新次数不同而变化。想要查看当前的 oplog 时间窗口预计值,可以使用以下命令:


mongod -f /mongodb/28017/conf/mongod.conf 
mongod -f /mongodb/28018/conf/mongod.conf 
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf

use local
db.oplog.rs.find().pretty()

Test: PRIMARY> rs.printReplicationInfo()
configured oplog size:1561,5615234375MB <--集合大小
1og ength start to end:423849secs (117.74hrs) <-预计窗口覆盖时间



# oplog 企业级应用
 (1) 实现热备,在备份时使用 --oplog 选项
 注:为了演示效果我们在备份过程,模拟数据插入
 (2) 准备测试数据

use test

分片集群的备份思路

需要备份的数据
shard  configserver


痛点
chunk迁移,关闭或者调整balancer时间窗口
备份出来的数据时间不一致


# mongodb 推荐的 分片集群备份策略
使用 Ops manager(商用版);监控免费,备份花钱


# 手工备份思路
1. balancer 关闭
2. 同一时刻config、shard其中一个节点脱离集群	# 最好写程序,同一时刻下线 config、shard 节点;脚本可能不能实现;
3. 开始备份节点数据
4. 把节点数据恢复到集群


Pss	(生产中使用 Pss 结构,方便备份;因为需要下线一个节点;)
Psa

数据备份与恢复

准备数据

# 如果不存在 demo 库,会自动创建该库
use demo
fotmatnumber = (start, end)=>{
    num = Math.round(Math.random() *  (end-start)) + start 
    if(num<10){
    	return "0"+num;
    }else{
    	return num;
    }
}

rand_title = (i)=>{
    num = Math.round( Math.random() * 10);
    num1 = Math.round( Math.random() * 10);
    return [
    	"赠送礼品-"+num,
    	"购物狂欢-"+num,
    	"随便买买-"+num,
    	"愉快购物-"+num,
    	"赠送礼物-"+num,
    	"商品购买-"+num,
    	"买多送多-"+num,
    	"买年货-"+num,
    	"买买买买-"+num,
    	"充值会员-"+num
    ][num1];
}

for(var i=0; i<200000; i++){
    db.orders.insert({
    	"onumber": ("0000000000000000"+ i).substr(String(i).length),
    	"date": "20"+fotmatnumber(0,21)+"-"+fotmatnumber(1,12)+"-"+fotmatnumber(1,31),
    	"title": rand_title(i),
    	"user_id": parseInt(i/200)+1,
    	"items": [{
    		"goods_id": parseInt(i/200)+1,
    		"goods_attr": i,
    		"price": 100.0
    	},{
    		"goods_id": parseInt(i/200)+2,
    		"goods_attr": i+1,
    		"price": 80.0
    	}]
    })
    if(i%10000==0){
    	print("已经添加了"+parseInt(i/10000)+"万条数据!");
    }
}

MongdoDB 一共提供了 4 个命令工具给我们对数据进行备份与恢复以及导入与导出数据。

  • 数据备份
mongodump -h dbhost -d dbname -o dbdirectory

mongodump -h 127.0.0.1:27017 -d demo -o demo.tar.gz

参数说明:

选项 作用 备注
-h mongodb 服务端地址和端口的简写 –host=mongodb地址 –port=端口
-d 备份的数据库名称 –db=数据库名
-o 保存目录 目录需要提前创建
  • 数据恢复
mongorestore -h dbhost -d dbname --dir dbdirectory

mongorestore -h 127.0.0.1:27017 -d demo --dir ./demo/demo

参数说明:
    	-h   服务器地址和端口;–host=IP地址	–port=端口
    	-d   备份的数据库名称 -db=数据库名称 
    	--dir 备份数据所在目录 
    	--drop 恢复数据前,先删除 MongoDB 中的旧数据

  • 数据导出
mongoexport -d dbname -c collectionname -o file --type json/csv -f field

mongoexport -d demo -c orders -o /home/moluo/Desktop/backup/orders.json --type json

参数说明:
    -d 要导出的数据库名称;--db=数据库名称 
    -c 要导出的集合名称 --collection=集合名称 
    -o 导出数据保存的文件名
    --type 导出数据的文件格式; 默认是 json,也可以是 csv,当数据格式为 csv 时,另需加上 -f“字段 1,字段 2,…"
  • 数据导入
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field

mongoimport -d demo -c orders --file /home/moluo/Desktop/backup/orders.json --type json


参数说明:
    -d 要导入的数据库名称 --db=数据库名称
    -c 要导入的集合名称 --collection=集合名称 
    --file 导入数据保存的文件名 
    --type 导入数据的文件格式			默认是 json, <br>
    														也可以是 csv,当数据格式为 csv 时:
    														1. 需加上 -f "字段 1,字段 2..."
    														2. 可以选择加上 --headerline,设置首行为导入字段