总体方案
接到需求,有一个业务表数据量达到2亿。查询变慢。及时加上索引效果依旧达不到要求。
进行架构优化,对业务表按月份进行分表。
分表之后,计划保存3年之内的数据。那么每个月进行一次数据备份,备份方案如下
- 使用mongodump进行数据的导出。
- 编写脚本指定要进行导出的collection
- 使用cron定时执行
- 如果有业务需求,使用mongorestore导入数据进行还原
具体实现
mongodump 是 MongoDB 自带的备份工具,可以备份指定的数据库或集合中的数据到本地文件系统,方便进行数据恢复和迁移等操作。
我们现在需要备份指定的collection
1 | mongodump --host <hostname> --port <port> --db <database_name> --collection <collection_name> --out <backup_directory> |
另外,如果需要具有特定查询条件的文档,可以输入以下命令:
1 | mongodump --host <hostname> --port <port> --db <database_name> --collection <collection_name> --query '{field: value}' --out <backup_directory> |
其中,{field: value} 表示备份时可使用的查询条件,如可以输入 {date: { $gte: new ISODate("2023-04-20T00:00:00Z")}} 查找某一时间点之后的数据备份。
测试数据准备
创建了一个新库paas,一个新collection:log202303。

用户paasAdmin,角色必须给readWrite和dbAdmin都有
1 | const data = []; |
使用代码直接插入了100条数据。

可以看到其对应的wt文件

看起来collection和wt文件是一一对应的。
找了生产的数据库看。实际上,存在大于2G的数据文件的

备份数据
1 | mongodump --host x.x.x.x --port 20000 -u paasAdmin -p 123456 --authenticationDatabase paas --db paas --collection log202303 --out /home/mongo/backup |

恢复数据
删除log202303这个collection。
模拟又新增了其他月份的数据log202304,并插入了一些数据。
1 | midplat:PRIMARY> use paas |
下面使用mongorestore进行log202303的恢复
1 | mongorestore --host x.x.x.x --port 20000 -u paasAdmin -p 123456 --authenticationDatabase paas --db paas --collection log202303 --dir=/home/mongo/backup/paas/log202303.bson |

查看数据已经恢复
1 | MongoDB server version: 4.0.26 |
可以说是very good了
TODO
下面的工作就是写定时任务,用脚本把bson文件保存到对象存储上去