MongoDB数据备份恢复方案

126 阅读2分钟

总体方案

接到需求,有一个业务表数据量达到2亿。查询变慢。及时加上索引效果依旧达不到要求。

进行架构优化,对业务表按月份进行分表。

分表之后,计划保存3年之内的数据。那么每个月进行一次数据备份,备份方案如下

  1. 使用mongodump进行数据的导出。

  2. 编写脚本指定要进行导出的collection

  3. 使用cron定时执行

  4. 如果有业务需求,使用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文件保存到对象存储上去