Skip to content

MongoDB mongodump 和 mongorestore

mongodump 工具

基本语法

bash
mongodump [options] [db_name [collection_name]]

常用选项

选项描述
--hostMongoDB 服务器地址
--portMongoDB 服务器端口
--username用户名
--password密码
--authenticationDatabase认证数据库
--db指定备份的数据库
--collection指定备份的集合
--out指定备份输出目录
--oplog备份操作日志,用于时间点恢复
--gzip启用压缩
--archive生成归档文件

全量备份

基本备份

bash
# 备份所有数据库
mongodump --out /path/to/backup

# 备份指定数据库
mongodump --db mydb --out /path/to/backup

# 备份指定集合
mongodump --db mydb --collection mycollection --out /path/to/backup

压缩备份

bash
# 使用 gzip 压缩
mongodump --gzip --out /path/to/backup

# 生成归档文件
mongodump --gzip --archive=/path/to/backup/mydb.gz --db mydb

带 oplog 备份

bash
# 备份所有数据库和 oplog
mongodump --oplog --out /path/to/backup

增量备份

基于 oplog 的增量备份

bash
# 1. 首先进行全量备份
mongodump --oplog --out /path/to/full-backup

# 2. 记录 oplog 时间戳
OPLOG_TIMESTAMP=$(mongo --quiet --eval "db.adminCommand({ replSetGetStatus: 1 }).optimes.lastCommittedOpTime.ts.toString()")

# 3. 稍后进行增量备份
mongodump --oplog --oplogStart "$OPLOG_TIMESTAMP" --out /path/to/incremental-backup

mongorestore 工具

基本语法

bash
mongorestore [options] [directory]

常用选项

选项描述
--hostMongoDB 服务器地址
--portMongoDB 服务器端口
--username用户名
--password密码
--authenticationDatabase认证数据库
--db指定恢复的数据库
--collection指定恢复的集合
--drop恢复前删除现有集合
--oplogReplay重放 oplog,用于时间点恢复
--oplogLimit限制 oplog 重放的时间点
--gzip解压压缩的备份文件
--archive从归档文件恢复
--numInsertionWorkersPerCollection并行插入线程数

全量恢复

基本恢复

bash
# 恢复所有数据库
mongorestore /path/to/backup

# 恢复指定数据库
mongorestore --db mydb /path/to/backup/mydb

# 恢复指定集合
mongorestore --db mydb --collection mycollection /path/to/backup/mydb/mycollection.bson

从压缩备份恢复

bash
# 从 gzip 压缩备份恢复
mongorestore --gzip /path/to/backup

# 从归档文件恢复
mongorestore --gzip --archive=/path/to/backup/mydb.gz --db mydb

恢复前删除现有数据

bash
# 恢复前删除现有集合
mongorestore --drop /path/to/backup

时间点恢复

bash
# 恢复到指定时间点
mongorestore --oplogReplay --oplogLimit "1609459200:1" /path/to/backup

跨版本备份和恢复

兼容性注意事项

  • MongoDB 支持向下兼容的备份和恢复
  • 可以从旧版本备份恢复到新版本
  • 不支持从新版本备份恢复到旧版本
  • 建议在恢复前检查版本兼容性

跨版本恢复示例

bash
# 从 MongoDB 4.4 备份恢复到 MongoDB 5.0
mongorestore --db mydb /path/to/mongodb-4.4-backup/mydb

最佳实践

备份策略

  • 定期备份:制定合理的备份计划,包括全量备份和增量备份
  • 备份验证:定期验证备份的完整性和可恢复性
  • 多副本存储:将备份存储在多个位置,包括本地和云端
  • 加密备份:对备份数据进行加密,确保数据安全
  • 压缩备份:使用压缩减少备份空间占用

恢复策略

  • 测试恢复:定期测试恢复流程,确保备份可用
  • 恢复环境准备:准备用于恢复的测试环境
  • 记录恢复过程:记录恢复过程和结果,便于后续分析
  • 验证恢复结果:验证恢复后的数据完整性和一致性

性能优化

  • 使用压缩:减少备份时间和存储空间
  • 调整并行度:使用 --numInsertionWorkersPerCollection 调整恢复并行度
  • 在低峰时段执行:避免影响业务正常运行
  • 使用 SSD 存储:提高备份和恢复速度

常见问题(FAQ)

Q1: mongodump 和 mongorestore 支持哪些存储引擎?

A1: mongodump 和 mongorestore 支持所有 MongoDB 存储引擎,包括:

  • WiredTiger(默认)
  • In-Memory
  • RocksDB(通过第三方插件)

Q2: 如何备份分片集群?

A2: 备份分片集群的方法:

  • 使用 mongodump 备份每个分片
  • 使用 mongodump 备份配置服务器
  • 使用 mongodump 备份 mongos 路由服务器配置
  • 考虑使用 Percona Backup for MongoDB 或 MongoDB Atlas 备份

Q3: 如何处理大型数据库备份?

A3: 处理大型数据库备份的方法:

  • 使用压缩减少存储空间
  • 使用归档文件简化管理
  • 考虑使用增量备份
  • 在低峰时段执行备份
  • 使用分片集群分散负载

Q4: 如何监控备份进度?

A4: 监控备份进度的方法:

  • 使用 --verbose 选项查看详细日志
  • 监控系统资源使用情况
  • 使用文件系统监控工具查看备份文件大小变化

Q5: 如何恢复到不同的数据库名称?

A5: 恢复到不同数据库名称的方法:

bash
# 将 mydb 恢复为 newdb
mongorestore --db newdb /path/to/backup/mydb

Q6: 如何恢复单个文档?

A6: 恢复单个文档的方法:

bash
# 1. 首先恢复到临时集合
mongorestore --db mydb --collection temp_collection /path/to/backup/mydb/mycollection.bson

# 2. 然后将单个文档插入到目标集合
mongo mydb --eval "db.mycollection.insert(db.temp_collection.findOne({ _id: ObjectId('...') }))"

# 3. 最后删除临时集合
mongo mydb --eval "db.temp_collection.drop()"

Q7: mongodump 和 mongorestore 与其他备份工具的比较?

A7: mongodump 和 mongorestore 与其他备份工具的比较:

工具优势劣势
mongodump/mongorestore官方工具,兼容性好,支持多种备份方式备份和恢复速度较慢,不适合超大型数据库
Percona Backup for MongoDB支持增量备份,备份速度快,适合大型数据库第三方工具,需要额外安装
文件系统快照备份速度快,对数据库影响小依赖文件系统支持,恢复复杂
MongoDB Atlas 备份自动备份,支持时间点恢复,管理简单仅适用于 Atlas 集群

Q8: 如何自动化备份和恢复?

A8: 自动化备份和恢复的方法:

  • 使用 shell 脚本编写备份和恢复逻辑
  • 使用 cron 或系统定时任务定期执行备份
  • 使用监控工具监控备份状态
  • 实现备份验证自动化

示例脚本

自动化全量备份脚本

bash
#!/bin/bash

# 配置
BACKUP_DIR="/path/to/backup"
MONGODB_HOST="localhost"
MONGODB_PORT="27017"
DATE=$(date +"%Y%m%d%H%M%S")
RETENTION_DAYS=7

# 创建备份目录
mkdir -p "$BACKUP_DIR/$DATE"

# 执行备份
echo "开始备份 MongoDB..."
mongodump --host "$MONGODB_HOST" --port "$MONGODB_PORT" --out "$BACKUP_DIR/$DATE" --gzip

if [ $? -eq 0 ]; then
    echo "备份成功!备份文件保存在 $BACKUP_DIR/$DATE"
else
    echo "备份失败!"
    exit 1
fi

# 清理过期备份
echo "清理 $RETENTION_DAYS 天前的备份..."
find "$BACKUP_DIR" -type d -mtime +"$RETENTION_DAYS" -exec rm -rf {} \;

echo "备份任务完成!"

自动化恢复脚本

bash
#!/bin/bash

# 配置
BACKUP_DIR="/path/to/backup"
MONGODB_HOST="localhost"
MONGODB_PORT="27017"
DATE=$(date +"%Y%m%d")

# 查找最新备份
LATEST_BACKUP=$(ls -td "$BACKUP_DIR"/*/ | head -1)

if [ -z "$LATEST_BACKUP" ]; then
    echo "未找到备份文件!"
    exit 1
fi

# 执行恢复
echo "开始恢复 MongoDB..."
echo "使用备份:$LATEST_BACKUP"
mongorestore --host "$MONGODB_HOST" --port "$MONGODB_PORT" --drop --gzip "$LATEST_BACKUP"

if [ $? -eq 0 ]; then
    echo "恢复成功!"
else
    echo "恢复失败!"
    exit 1
fi

echo "恢复任务完成!"