mongodb-备份和恢复
1、mongoexport/mongoimport 备份工具
导入/导出的是JSON格式或者CSV格式
mongoexport具体用法如下所示:
-
-h:指定数据库主机的 IP 地址
-
-u:指定数据库的用户名
-
-p:指定数据库的密码
-
-d:指定数据库的名字
-
-c:指定 collection 的名字
-
-f:指定导出那些列
-
-o:指定到要导出的文件名
-
-q:指定导出数据的过滤条件
-
--authenticationDatabase admin ,用户认证数据库
准备数据,进行备份
> use test
> for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()}); }
$ mongoexport -uroot -proot123 --port 38017 --authenticationDatabase admin -d test -c log -o /mongodb/log.json
2023-06-30T22:41:08.665+0800 connected to: mongodb://localhost:38017/
2023-06-30T22:41:08.792+0800 exported 9999 records
$ more /mongodb/log.json
{"_id":{"$oid":"649ee1ea168724a7ed39adaf"},"uid":1.0,"name":"mongodb","age":6.0,"date":{"$date":"2023-06-30T14:08:42.307Z"}}
{"_id":{"$oid":"649ee1eb168724a7ed39adb0"},"uid":2.0,"name":"mongodb","age":6.0,"date":{"$date":"2023-06-30T14:08:43.493Z"}}
{"_id":{"$oid":"649ee1eb168724a7ed39adb1"},"uid":3.0,"name":"mongodb","age":6.0,"date":{"$date":"2023-06-30T14:08:43.506Z"}}
默认导出 json 格式,需要导出CSV格式的数据,则需要使用--type=csv参数
Mongodb中的mongoimport工具可以把一个特定格式文件中的内容导入到指定的collection中。该工具可以导入JSON格式数据,也可以导入CSV格式数据。具体使用如下所示:
-
-h:指定数据库主机的IP
-
-u:指定数据库的用户名
-
-p:指定数据库的密码
-
-d:指定数据库的名字
-
-c:指定 collection 的名字
-
-f:指定要导入那些列
-
-j, --numInsertionWorkers=
number of insert operations to run
concurrently (defaults to 1) 并行导入
$ mongoimport -uroot -proot123 --port 38017 --authenticationDatabase admin -d test -c log1 /mongodb/log.json
2023-06-30T22:55:39.921+0800 connected to: mongodb://localhost:38017/
2023-06-30T22:55:41.339+0800 9999 document(s) imported successfully. 0 document(s) failed to import.
导入 csv 格式文件
## csv 格式的文件头行,有列名字。
## --headerline:指明第一行是列名,不需要导入。
mongoimport -uroot -proot123 --port 38017 --authenticationDatabase admin -d test -c log5 --type=csv --headerline --file /mongodb/log.csv
## csv格式的文件头行,没有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log6 -j 4 --type=csv -f id,name,age,date --file /mongodb/log.csv
异构数据库数据迁移,MySQL 和 mongodb 数据迁移,通过 csv 格式数据文件进行导入导出。
如何将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、mongodb 导入数据
2、mongodump/mongorestore工具
导入/导出的是BSON格式
mongodump 备份选项参数
-
-h:指定数据库主机的IP
-
-u:指定数据库的用户名
-
-p:指定数据库的密码
-
-d:指定数据库的名字
-
-c:指定 collection 的名字
-
-o:指定到要导出的文件名
-
-q:指定导出数据的过滤条件
-
-j, --numParallelCollections= number of collections to dump in parallel (4 by default)
-
--oplog 备份的同时备份oplog
-
--gzip 压缩备份文件
全库备份
$ mkdir /mongodb/backup
$ 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/
mongorestore 数据恢复,选项参数和 mongodump 相似
全备中恢复单库
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world /mongodb/backup/test
全备中恢复单表
$ 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
--oplog 复制集模式专用选项
在 replica set 中 oplog 是一个定容集合(capped collection),它的默认大小是磁盘空间的 5%(可以通过--oplogSizeMB参数修改),位于local库的db.oplog.rs
其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。
当空间用完时新记录自动覆盖最老的记录。
其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,
所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。
> use local
> db.oplog.rs.find().pretty()
"i": insert
"u": update
"d": delete
"c": db cmd
> rs.printReplicationInfo()
configured oplog size: 1561.5615234375MB <--集合大小
log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间
oplog first event time: Wed Sep 09 2015 17:39:50 GMT+0800 (CST)
oplog last event time: Mon Sep 14 2015 15:23:59 GMT+0800 (CST)
now: Mon Sep 14 2015 16:37:30 GMT+0800 (CST)
利用 oplog 恢复数据
## 模拟原始数据
$ mongo --port 28017
> use wold
> for(var i = 1 ;i < 20; i++) {
db.city.insert({a: i});
}
## 全库备份
$ mongodump --port 28017 --oplog -o /mongodb/backup
--oplog功能:在备份同时,将备份过程中产生的日志进行备份
## 再次模拟数据
db.city.insert({id:30})
db.city.insert({id:40})
## 删除 city 表
> db.city.drop()
## 因为全库备份的 oplog 中缺失备份结束时刻到表删除时刻的日志数据
## 备份现有的oplog.rs表
$ mongodump --port 28019 -d local -c oplog.rs -o /mongodb/backup
## 截取oplog并恢复到drop之前的位置
$ mongo --port 28017
> use local
> db.oplog.rs.find({op:"c"}).pretty();
{
"ts" : Timestamp(1600489082, 1),
"t" : NumberLong(1),
"h" : NumberLong(0),
"v" : 2,
"op" : "c",
"ns" : "wo.$cmd",
"ui" : UUID("875f2a41-57e3-4b6b-b738-469fad032b18"),
"o2" : {
"numRecords" : 19
},
"wall" : ISODate("2020-09-19T04:18:02.717Z"),
"o" : {
"drop" : "ci"
}
}
## 获取到oplog误删除时间点位置:
Timestamp(1642906440, 1)
## 恢复备份+应用oplog
$ cd /mongodb/backup/local/
$ cp oplog.rs.bson ../oplog.bson
$ rm -rf /mongodb/backup/local/
$ mongorestore --port 28019 --oplogReplay --oplogLimit "1642906440:1" --drop /mongodb/backup/
分片集群的备份思路
需要备份的数据
shard 、 configserver
痛点:chunk 迁移 ,关闭或者调整balancer时间窗口;备份出来的数据时间不一致。
第一种方式:使用Ops Manager(收费)
第二种手动备份方式
-
balancer 关闭
-
同一时刻config、shard其中一个节点脱离集群
-
开始备份节点数据
-
把节点恢复到集群
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)