外观
MongoDB mongodump 和 mongorestore
mongodump 工具
基本语法
bash
mongodump [options] [db_name [collection_name]]常用选项
| 选项 | 描述 |
|---|---|
--host | MongoDB 服务器地址 |
--port | MongoDB 服务器端口 |
--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-backupmongorestore 工具
基本语法
bash
mongorestore [options] [directory]常用选项
| 选项 | 描述 |
|---|---|
--host | MongoDB 服务器地址 |
--port | MongoDB 服务器端口 |
--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/mydbQ6: 如何恢复单个文档?
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 "恢复任务完成!"