总体方案
接到需求,有一个业务表数据量达到2亿。查询变慢。及时加上索引效果依旧达不到要求。
进行架构优化,对业务表按月份进行分表。
分表之后,计划保存3年之内的数据。那么每个月进行一次数据备份,备份方案如下
-
使用mongodump进行数据的导出。
-
编写脚本指定要进行导出的collection
-
使用cron定时执行
-
如果有业务需求,使用mongorestore导入数据进行还原
具体实现
mongodump 是 MongoDB 自带的备份工具,可以备份指定的数据库或集合中的数据到本地文件系统,方便进行数据恢复和迁移等操作。
我们现在需要备份指定的collection
mongodump --host <hostname> --port <port> --db <database_name> --collection <collection_name> --out <backup_directory>
另外,如果需要具有特定查询条件的文档,可以输入以下命令:
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都有
const data = [];
for (let i = 1; i <= 100; i++) {
data.push({ name: `User ${i}`, age: Math.floor(Math.random() * 50) + 20 });
}
db.log202303.insertMany(data, (err, res) => {
if (err) throw err;
console.log(res.insertedCount + ' documents inserted');
});
使用代码直接插入了100条数据。
可以看到其对应的wt文件
看起来collection和wt文件是一一对应的。
找了生产的数据库看。实际上,存在大于2G的数据文件的
备份数据
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,并插入了一些数据。
midplat:PRIMARY> use paas
switched to db paas
midplat:PRIMARY> show collections
log202304
下面使用mongorestore进行log202303的恢复
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
查看数据已经恢复
MongoDB server version: 4.0.26
midplat:PRIMARY> use paas
switched to db paas
midplat:PRIMARY> show collections
log202303
log202304
midplat:PRIMARY>
可以说是very good了
TODO
下面的工作就是写定时任务,用脚本把bson文件保存到对象存储上去