Ubuntu运行1年的MongoDB突发code 100崩溃,如何无数据损失恢复?
MongoDB报错退出码100问题排查与解决
问题背景
一台运行MongoDB的Ubuntu服务器稳定运行1年以上,无操作情况下突然崩溃,启动报错退出码100,执行mongod的启动日志如下:
ubuntu@ip-172-26-6-171:~/project$ mongod 2021-10-21T17:14:23.214+0000 I CONTROL [initandlisten] MongoDB starting : pid=868751 port=27017 dbpath=/data/db 64-bit host=ip-172-26-6-171 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] db version v3.6.8 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] git version: 8e540c0b6db93ce994cc548f000900bdc740f80a 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.1.1f 31 Mar 2020 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] allocator: tcmalloc 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] modules: none 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] build environment: 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] distarch: x86_64 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] target_arch: x86_64 2021-10-21T17:14:23.215+0000 I CONTROL [initandlisten] options: {} 2021-10-21T17:14:23.220+0000 I STORAGE [initandlisten] exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating 2021-10-21T17:14:23.220+0000 I CONTROL [initandlisten] now exiting 2021-10-21T17:14:23.220+0000 I CONTROL [initandlisten] shutting down with code:100
存在三个待解答疑问:
- 未修改配置、未执行相关操作的情况下,为什么会突然出现该错误?
- 数据库数据是否已经丢失?
- 如何在不损失数据的前提下恢复MongoDB服务?
问题根因说明
从日志报错NonExistentPath: Data directory /data/db not found可以明确,退出码100是MongoDB找不到默认数据存储目录/data/db触发的标准错误。无操作情况下突发该问题的常见原因有三类:
- 数据盘挂载失效:如果
/data目录挂载在独立的数据盘/云盘上,服务器异常重启、云平台底层故障都可能导致挂载丢失,/data回到系统盘初始的空目录状态,自然找不到/data/db - 系统自动更新异常:Ubuntu的unattended-upgrades自动更新部分系统组件后,小概率会触发目录归属变更或目录被删除的异常
- 无感知的误操作:其他运维进程、其他管理员误删除目录,操作人没有同步信息,导致你误以为没有做过任何操作
数据安全性判断
数据大概率没有丢失:
该报错只是MongoDB找不到数据目录的位置,不是数据本身损坏。只要能找到原有的MongoDB数据文件(一般是后缀为.wt、名称带WiredTiger前缀的文件集合),就可以完整恢复全部数据。
如果之前用了独立数据盘,可以先执行fdisk -l查看数据盘是否还在设备列表,执行mount命令确认挂载状态,绝大多数情况数据都还存在于数据盘内,只是没有正常挂载到/data路径。
无损失恢复方案
你自己测试的「手动创建/data/db目录,移动原有数据库文件到该路径」的方案完全可行,标准的完整操作流程如下:
- 先将所有找到的原有MongoDB数据文件备份到独立目录,避免操作失误导致数据丢失
- 用如下命令查找原有MongoDB数据文件的存放路径:
sudo find / -name "WiredTiger" 2>/dev/null
- 创建
/data/db目录并配置正确的权限:
sudo mkdir -p /data/db sudo chown -R mongodb:mongodb /data/db
- 将原有数据文件全部移动到
/data/db目录下,保持文件原有权限不变 - 启动MongoDB验证即可,如果你用systemd管理MongoDB服务,可以执行
sudo systemctl start mongod启动
后续优化建议
- 如果使用独立数据盘存储MongoDB数据,将挂载规则写入
/etc/fstab,确保开机自动挂载,避免再次出现挂载失效问题 - 定期全量备份MongoDB数据到独立存储,避免极端场景下的数据丢失
内容的提问来源于stack exchange,提问作者aquatic7
相关产品推荐
相关产品推荐

