阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > mongodump与mongorestore

mongodump与mongorestore

作者:陈川 阅读数:36062人阅读 分类: MongoDB

mongodump和mongorestore是MongoDB官方提供的两个实用工具,用于数据库的备份和恢复操作。它们支持全量或部分数据导出/导入,适用于数据迁移、灾难恢复等场景。

mongodump的基本用法

mongodump用于从MongoDB实例导出数据到BSON文件。基本命令格式如下:

mongodump --uri="mongodb://username:password@host:port/database" --out=/path/to/output

常用参数说明:

  • --uri:连接字符串
  • --out/-o:输出目录
  • --db:指定数据库
  • --collection:指定集合
  • --query:使用JSON查询过滤数据
  • --gzip:压缩输出

示例1:备份整个实例

mongodump --host=127.0.0.1 --port=27017 --out=/backups/mongodump-2023-11-20

示例2:备份特定集合

mongodump --db=test --collection=users --out=/backups/partial

mongorestore的基本用法

mongorestore用于将mongodump生成的BSON文件导入到MongoDB中:

mongorestore --uri="mongodb://username:password@host:port" /path/to/dump

关键参数:

  • --drop:在恢复前删除现有集合
  • --nsInclude:指定命名空间模式
  • --noIndexRestore:不恢复索引
  • --gzip:解压恢复

示例3:完整恢复

mongorestore --host=cluster.example.com --port=27017 --username=admin --password=secret /backups/mongodump-2023-11-20

高级使用技巧

增量备份方案

结合查询条件实现增量备份:

# 备份最近24小时的数据
mongodump --db=logs --collection=events \
  --query='{ "timestamp": { "$gt": { "$date": "2023-11-19T00:00:00Z" } } }' \
  --out=/backups/incremental

使用通配符恢复特定集合

mongorestore --nsInclude='test.users' /backups/full-dump

跨版本兼容性处理

当源和目标MongoDB版本不一致时:

mongodump --host=old-server:27017 --db=production \
  --readPreference=secondaryPreferred \
  --out=/backups/cross-version

实际应用场景

数据迁移案例

将生产环境数据迁移到测试环境:

# 生产环境导出
mongodump --uri="mongodb://prod-user:password@prod-cluster:27017/prod-db" \
  --gzip --out=/backups/prod-export

# 测试环境导入
mongorestore --uri="mongodb://test-user:password@test-cluster:27017/test-db" \
  --drop --gzip /backups/prod-export

定时备份脚本示例

Node.js实现的自动备份脚本:

const { exec } = require('child_process');
const cron = require('node-cron');
const path = require('path');
const fs = require('fs');

const BACKUP_DIR = '/mnt/backups/mongo';
const CONN_STR = 'mongodb://admin:password@localhost:27017';

function runBackup() {
  const date = new Date().toISOString().split('T')[0];
  const backupPath = path.join(BACKUP_DIR, date);
  
  if (!fs.existsSync(backupPath)) {
    fs.mkdirSync(backupPath, { recursive: true });
  }

  exec(`mongodump --uri="${CONN_STR}" --gzip --out="${backupPath}"`, 
    (error, stdout, stderr) => {
      if (error) {
        console.error(`Backup failed: ${error.message}`);
        return;
      }
      console.log(`Backup completed to ${backupPath}`);
    });
}

// 每天凌晨2点执行
cron.schedule('0 2 * * *', runBackup);

性能优化建议

  1. 并行恢复:对大型数据库拆分集合并行恢复
# 并行恢复多个集合
mongorestore --numParallelCollections=4 /backups/large-dump
  1. 网络优化:在本地网络使用--compressors=snappy

  2. 内存调整:大数据量恢复时增加批处理大小

mongorestore --batchSize=1000 /backups/huge-dump

常见问题解决

认证失败处理

当遇到认证错误时,检查连接字符串格式:

# 正确格式
mongodump --uri="mongodb://user:pass@host:port/db?authSource=admin"

# 错误示例(缺少authSource)
mongodump --uri="mongodb://user:pass@host:port/db"

版本兼容性问题

使用--forceTableScan解决索引问题:

mongodump --db=legacy --forceTableScan --out=/backups/legacy-data

大集合处理技巧

对于超过100GB的集合:

# 拆分备份
mongodump --db=bigdata --collection=huge_collection \
  --query='{ "_id": { "$lt": ObjectId("...") } }' \
  --out=/backups/part1

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌