Skip to content

MongoDB 全量恢复

全量备份的创建

mongodump 备份

基本备份命令

bash
# 备份所有数据库
mongodump --host localhost:27017 \
  --username admin \
  --password password \
  --authenticationDatabase admin \
  --out /backup/full_backup_$(date +%Y%m%d_%H%M%S)

# 备份指定数据库
mongodump --host localhost:27017 \
  --username admin \
  --password password \
  --authenticationDatabase admin \
  --db test \
  --out /backup/test_backup_$(date +%Y%m%d_%H%M%S)

# 备份指定集合
mongodump --host localhost:27017 \
  --username admin \
  --password password \
  --authenticationDatabase admin \
  --db test \
  --collection users \
  --out /backup/users_backup_$(date +%Y%m%d_%H%M%S)

备份选项

  • --host:指定 MongoDB 主机和端口
  • --username--password:认证信息
  • --authenticationDatabase:认证数据库
  • --db:指定要备份的数据库
  • --collection:指定要备份的集合
  • --out:备份输出目录
  • --gzip:启用压缩
  • --oplog:包含 oplog,支持时间点恢复

文件系统快照

LVM 快照备份

bash
# 创建 LVM 快照
lvcreate --snapshot --name mongodb_snap --size 10G /dev/vg0/mongodb

# 挂载快照
mount /dev/vg0/mongodb_snap /mnt/mongodb_snap

# 复制数据文件
cp -r /mnt/mongodb_snap/* /backup/full_backup_$(date +%Y%m%d_%H%M%S)/

# 卸载并删除快照
umount /mnt/mongodb_snap
lvremove -f /dev/vg0/mongodb_snap

注意事项

  • 确保 MongoDB 数据目录位于 LVM 卷上
  • 快照大小应足够容纳备份期间的写入操作
  • 快照创建和恢复过程中可能需要暂停写操作
  • 适合大型数据库的快速备份

全量恢复的准备

恢复前准备

环境准备

  • 停止目标 MongoDB 服务
  • 确保目标数据目录为空
  • 备份目标数据目录(如果有数据)
  • 确保有足够的磁盘空间

备份文件准备

  • 确认备份文件的完整性
  • 检查备份文件的大小和日期
  • 确保备份文件可访问
  • 准备必要的认证信息

恢复计划

  • 制定详细的恢复步骤
  • 估算恢复时间
  • 通知相关团队
  • 准备回滚方案

全量恢复方法

mongorestore 恢复

基本恢复命令

bash
# 恢复所有数据库
mongorestore --host localhost:27017 \
  --username admin \
  --password password \
  --authenticationDatabase admin \
  /backup/full_backup_20230101_120000

# 恢复指定数据库
mongorestore --host localhost:27017 \
  --username admin \
  --password password \
  --authenticationDatabase admin \
  --db test \
  /backup/test_backup_20230101_120000/test

# 恢复指定集合
mongorestore --host localhost:27017 \
  --username admin \
  --password password \
  --authenticationDatabase admin \
  --db test \
  --collection users \
  /backup/users_backup_20230101_120000/test/users.bson

恢复选项

  • --host:指定 MongoDB 主机和端口
  • --username--password:认证信息
  • --authenticationDatabase:认证数据库
  • --db:指定要恢复的数据库
  • --collection:指定要恢复的集合
  • --gzip:启用压缩恢复
  • --drop:恢复前删除现有集合
  • --oplogReplay:恢复 oplog,支持时间点恢复

文件系统快照恢复

基本恢复步骤

bash
# 停止 MongoDB 服务
systemctl stop mongod

# 清空数据目录
rm -rf /data/db/*

# 挂载快照
mount /dev/vg0/mongodb_snap /mnt/mongodb_snap

# 复制数据文件到目标目录
cp -r /mnt/mongodb_snap/* /data/db/

# 修复文件权限
chown -R mongodb:mongodb /data/db/

# 卸载快照
umount /mnt/mongodb_snap

# 启动 MongoDB 服务
systemctl start mongod

注意事项

  • 确保数据文件的权限正确
  • 恢复后可能需要运行 mongod --repair 修复数据文件
  • 适合大型数据库的快速恢复
  • 恢复后需要验证数据完整性

第三方工具恢复

MongoDB Atlas 恢复

  1. 登录 Atlas 控制台
  2. 选择集群,进入 "Backups" 页面
  3. 选择要恢复的备份快照
  4. 选择恢复方式:
    • 恢复到原集群
    • 恢复到新集群
    • 导出备份文件
  5. 确认恢复设置,开始恢复

Percona Backup for MongoDB 恢复

bash
# 恢复全量备份
pbm restore --time "2023-01-01T12:00:00Z"

# 恢复到指定时间点
pbm restore --time "2023-01-01T12:30:00Z"

全量恢复步骤

标准恢复流程

步骤 1:停止 MongoDB 服务

  • 确保没有客户端连接
  • 停止 MongoDB 进程
  • 验证服务已停止

步骤 2:准备目标环境

  • 清空目标数据目录
  • 确保目录权限正确
  • 检查磁盘空间

步骤 3:执行恢复操作

  • 根据备份类型选择恢复方法
  • 执行恢复命令
  • 监控恢复进度
  • 处理恢复过程中的错误

步骤 4:启动 MongoDB 服务

  • 启动 MongoDB 进程
  • 检查服务状态
  • 验证服务正常运行

步骤 5:验证恢复结果

  • 检查数据库和集合是否存在
  • 验证数据完整性
  • 执行功能测试
  • 监控系统性能

副本集全量恢复

恢复主节点

  1. 停止所有副本集节点
  2. 恢复主节点的数据文件
  3. 启动主节点
  4. 等待主节点初始化完成

恢复从节点

  1. 清空从节点的数据目录
  2. 启动从节点
  3. 从节点自动从主节点同步数据
  4. 验证从节点同步状态

验证副本集状态

javascript
// 连接到主节点
rs.status()
// 检查所有节点的状态
rs.conf()
// 验证数据同步情况
db.printSlaveReplicationInfo()

分片集群全量恢复

恢复配置服务器

  1. 停止所有配置服务器
  2. 恢复配置服务器的数据文件
  3. 启动配置服务器
  4. 等待配置服务器副本集初始化完成

恢复分片

  1. 对每个分片执行副本集恢复
  2. 确保所有分片恢复完成
  3. 启动所有分片

恢复 mongos 实例

  1. 启动 mongos 实例
  2. 验证 mongos 与配置服务器的连接
  3. 检查分片集群状态

验证集群状态

javascript
// 连接到 mongos
sh.status()
// 检查所有分片的状态
db.adminCommand({ shardStatus: 1 })
// 验证数据库和集合的分布
db.adminCommand({ listDatabases: 1 })

恢复验证

数据完整性验证

集合级验证

javascript
// 验证集合完整性
db.users.validate({ full: true })

// 检查集合的文档数量
db.users.count()

// 验证索引完整性
db.users.getIndexes()

数据一致性验证

javascript
// 检查关键数据
 db.users.find({ "username": "admin" })

// 验证聚合结果
 db.orders.aggregate([
  { $group: { _id: null, total: { $sum: "$amount" } } }
])

跨节点一致性验证

  • 在副本集的不同节点上执行相同的查询
  • 比较查询结果是否一致
  • 检查复制延迟

功能验证

基本功能测试

  • 执行 CRUD 操作
  • 测试索引功能
  • 验证聚合查询
  • 测试事务功能(如果使用)

应用兼容性测试

  • 启动应用程序并连接到数据库
  • 执行应用程序的核心业务流程
  • 验证应用程序日志,确保没有数据库相关错误
  • 测试应用程序的性能表现

性能验证

基准测试

  • 与恢复前的性能基准进行对比
  • 测试查询延迟和吞吐量
  • 监控 CPU、内存和磁盘使用率
  • 检查网络连接数和延迟

负载测试

  • 模拟生产环境的负载情况
  • 验证系统在高负载下的表现
  • 检查是否存在性能瓶颈
  • 测试系统的扩展性

全量恢复最佳实践

备份策略

定期备份

  • 制定合理的备份计划,如每天或每周执行一次全量备份
  • 结合增量备份,减少备份时间和存储空间
  • 验证备份的完整性和可恢复性

备份存储

  • 存储备份到安全的位置
  • 考虑异地备份,提高容灾能力
  • 加密备份文件,保护数据安全
  • 定期清理过期备份

备份自动化

  • 使用脚本自动化备份过程
  • 配置备份监控和告警
  • 记录备份日志
  • 定期检查备份状态

恢复准备

恢复计划

  • 编写详细的恢复操作手册
  • 明确恢复步骤和责任人
  • 估算恢复时间和资源需求
  • 准备回滚方案

恢复测试

  • 定期测试恢复流程
  • 记录恢复时间和过程
  • 验证恢复后的系统状态
  • 分析测试结果,优化恢复计划

恢复环境

  • 准备必要的硬件和软件环境
  • 确保恢复工具可用
  • 配置网络和安全设置
  • 准备测试数据和脚本

恢复执行

恢复时间窗口

  • 选择业务低峰期执行恢复
  • 提前通知相关团队
  • 确保有足够的时间完成恢复
  • 预留缓冲时间处理意外情况

恢复过程监控

  • 监控恢复进度
  • 记录恢复过程中的日志
  • 处理恢复过程中的错误
  • 及时向相关团队汇报恢复进度

恢复后验证

  • 执行全面的验证测试
  • 确保所有功能正常
  • 监控系统性能和稳定性
  • 记录恢复结果和经验教训

常见问题(FAQ)

Q1: 全量恢复需要多长时间?

A1: 全量恢复时间取决于:

  • 数据库大小
  • 备份类型(mongodump 备份比文件系统快照恢复慢)
  • 硬件性能(CPU、内存、磁盘 I/O)
  • 网络带宽(如果备份文件存储在远程位置) 一般来说,小型数据库可能需要几分钟到几十分钟,大型数据库可能需要数小时到数天。

Q2: 全量恢复会影响现有数据吗?

A2: 是的,全量恢复会覆盖目标数据库的所有数据。因此:

  • 恢复前应备份现有数据(如果需要)
  • 确保恢复的是正确的备份文件
  • 选择合适的恢复目标(如测试环境或新环境)

Q3: 如何选择合适的全量备份类型?

A3: 选择备份类型的依据:

  • 数据库大小:大型数据库适合文件系统快照,小型数据库适合 mongodump
  • 恢复时间要求:要求快速恢复的场景适合文件系统快照
  • 备份灵活性:需要选择性恢复的场景适合 mongodump
  • 运维成本:考虑备份和恢复的复杂性和成本

Q4: 全量恢复后需要做哪些后续操作?

A4: 恢复后的后续操作:

  • 验证数据完整性和一致性
  • 测试系统功能和性能
  • 更新数据库统计信息
  • 重建索引(如果需要)
  • 调整配置参数
  • 启动应用程序访问

Q5: 如何处理全量恢复过程中的错误?

A5: 处理恢复错误的方法:

  • 仔细查看错误日志,定位错误原因
  • 检查备份文件的完整性
  • 确保目标环境满足恢复要求
  • 尝试使用不同的恢复方法
  • 寻求技术支持

Q6: 副本集全量恢复需要注意什么?

A6: 副本集恢复注意事项:

  • 先恢复主节点,再恢复从节点
  • 确保所有节点使用相同的备份文件
  • 恢复后验证副本集状态
  • 检查复制延迟
  • 确保选举正常

Q7: 分片集群全量恢复的顺序是什么?

A7: 分片集群恢复顺序:

  1. 恢复配置服务器
  2. 恢复每个分片
  3. 启动 mongos 实例
  4. 验证集群状态 确保按照这个顺序恢复,否则可能导致集群状态异常。

Q8: 如何提高全量恢复的效率?

A8: 提高恢复效率的方法:

  • 使用文件系统快照或第三方备份工具
  • 优化硬件性能,使用 SSD 存储
  • 并行恢复多个数据库或集合
  • 减少恢复后的数据验证时间
  • 提前准备恢复环境