温馨提示×

MongoDB在Linux上如何进行故障恢复

小樊
35
2026-01-01 04:32:58
栏目: 云计算

MongoDB 在 Linux 上的故障恢复实操指南

一 快速定位与通用处置

  • 查看服务状态与日志:使用命令检查 mongod 是否存活并抓取最新错误日志,例如:sudo systemctl status mongod;sudo tail -n 50 /var/log/mongodb/mongod.log。日志通常直接指明是配置、权限、磁盘还是存储引擎问题。
  • 核对关键配置:确认 /etc/mongod.conf 中的关键项是否正确,尤其是 dbPath(数据目录)、logPath(日志目录)、bindIpport;同时检查这些目录是否存在且属主为 mongodb/mongod
  • 资源与系统线索:用 df -h 检查磁盘空间,用 ulimit -nlsof -p $(pidof mongod) 排查文件描述符限制,必要时在 systemd 服务单元中设置 LimitNOFILE=65535 并 reload。
  • 变更前先备份:在任何修复操作前,先对现有数据目录与配置做一次离线拷贝,避免二次损坏。

二 无法启动的恢复流程

  • 非法关机或异常退出(Unclean shutdown)
    1. 备份当前数据目录;2) 删除锁文件 mongod.lock(路径取自 dbPath,常见为 /var/lib/mongodb/mongod.lock/var/lib/mongo/mongod.lock);3) 以修复模式启动:mongod -f /etc/mongod.conf --repair;4) 修复完成后按常规方式启动:mongod -f /etc/mongod.conf;5) 用 ps/日志确认进程就绪。
  • 配置或权限错误
    1. 依据日志修正 /etc/mongod.conf(如错误的 dbPath/logPathbindIp 不可达等);2) 校正目录权限:sudo chown -R mongodb:mongodb /var/lib/mongodb;3) 重启服务:sudo systemctl restart mongod。
  • 资源不足(磁盘满、文件句柄不足)
    1. 清理或扩容磁盘(df -h 定位);2) 提升 ulimit 并在 /lib/systemd/system/mongod.service 的 [Service] 段添加 LimitNOFILE=65535,执行 systemctl daemon-reload 后重启。
  • 存储引擎错误(WiredTiger)
    1. 查看日志中 WiredTiger 报错与磁盘空间;2) 优先释放空间或迁移数据;3) 执行 mongod --repair 重建索引与校验;4) 仍失败时,使用最近有效备份进行恢复。

三 有备份时的标准恢复

  • 使用 mongorestore 恢复全量或指定库/集合:
    • 全量恢复:mongorestore /path/to/backup/
    • 指定库:mongorestore --db myDatabase /path/to/backup/myDatabase/
    • 指定集合:mongorestore --db myDatabase --collection myCollection /path/to/backup/myDatabase/myCollection.bson
    • 谨慎使用 --drop(会先删除目标库/集合再导入)。
  • 恢复后校验:mongo myDatabase --eval “db.collection.countDocuments()” 或查询样本数据,确认记录数与关键业务数据一致。

四 无备份时的修复与重建

  • 使用 mongod --repair 修复数据文件(建议在副本集从节点或离线环境执行):
    • 方式一(指定配置):mongod -f /etc/mongod.conf --repair
    • 方式二(直接指定数据目录):mongod --repair --dbpath /var/lib/mongodb
    • 修复会重建索引、丢弃损坏数据,耗时与数据量成正比。
  • 修复失败或数据不可用的兜底方案:从最近一次有效备份恢复;若无备份,评估从副本集其他成员 resync 或从较早备份+增量导入的可行性。

五 复制集与分片的恢复要点

  • 复制集:优先在 SECONDARY 节点上执行修复/重建,完成后再重新加入集群并等待数据追赶;必要时以备份重建该节点。
  • 分片集群:依次处理各 shard(优先从节点修复/重建),确认分片数据一致后再恢复 mongos 路由与业务接入。
  • 恢复完成后,使用 rs.status()sh.status() 校验拓扑与健康度,并抽样查询验证业务数据。

0