在 CentOS 上恢复 MongoDB 数据的实用步骤
一 准备与通用原则
- 确认备份类型:常见为 mongodump 目录/BSON 文件 与 文件系统拷贝(WiredTiger 数据文件) 两类,恢复方式不同。
- 权限与认证:如使用 SCRAM 认证,准备具有相应权限的账号,并明确 –authenticationDatabase(常见为 admin)。
- 版本匹配:尽量保证 mongorestore/mongod 版本 与备份来源一致,避免兼容性问题。
- 空间与带宽:预估恢复所需 磁盘空间 与 网络带宽,在业务低峰期执行。
- 一致性:如为生产库,建议先 停止写操作 或切换到维护窗口,必要时对当前数据目录做 完整备份 后再恢复。
二 方法一 使用 mongorestore 恢复(推荐)
- 适用:由 mongodump 生成的目录或 .bson 文件。
- 步骤:
- 如为压缩包先解压:
tar -xzvf /path/to/backup_20250401.tar.gz -C /backups
- 连接到目标实例(示例为本地无鉴权):
mongorestore /backups/backup_20250401
- 指定库/集合恢复:
mongorestore --db mydb /backups/backup_20250401/mydb
mongorestore --db mydb --collection mycol /backups/backup_20250401/mydb/mycol.bson
- 远程/鉴权连接:
mongorestore --host 10.0.1.10 --port 27017 --username admin --password ‘******’ --authenticationDatabase admin /backups/backup_20250401
- 时间点恢复(仅当备份目录包含 oplog.bson 时可用):
mongorestore --oplogReplay /backups/backup_20250401_with_oplog
- 验证:
mongo --host 10.0.1.10 --port 27017 -u admin -p ‘******’ --authenticationDatabase admin
在 shell 中执行:show dbs; use mydb; db.mycol.countDocuments({})。
三 方法二 文件系统级恢复(WiredTiger 数据文件)
- 适用:直接拷贝的 /var/lib/mongo(WiredTiger 存储引擎)数据目录。
- 步骤:
- 停止服务:
sudo systemctl stop mongod
- 备份当前数据目录(强烈建议):
sudo cp -a /var/lib/mongo /var/lib/mongo.bak_$(date +%F_%T)
- 将备份的数据文件复制到数据目录(确保文件属主为 mongod):
sudo cp -a /path/to/mongo_bak/* /var/lib/mongo/
sudo chown -R mongod:mongod /var/lib/mongo
- 启动服务并校验:
sudo systemctl start mongod
sudo systemctl status mongod
mongo --eval “db.stats()”
- 如出现不一致或异常,可在维护窗口尝试 –repair(会重写数据文件,务必先全量备份):
sudo -u mongod mongod --dbpath /var/lib/mongo --repair
- 不建议跨大版本直接用文件拷贝替换数据目录,除非明确兼容并做好回滚方案。
四 方法三 使用 WiredTiger wt 工具修复损坏集合文件(进阶)
- 适用:个别 .wt 集合文件损坏,需在 同版本 实例上进行。
- 步骤:
- 安装编译依赖并构建 WiredTiger(示例版本 2.7.0,实际请与实例 WT 版本匹配):
sudo yum install -y epel-release libtool automake snappy snappy-devel lz4 lz4-devel zstd zstd-devel zlib zlib-devel git make gcc-c++
cd /opt && wget http://source.wiredtiger.com/releases/wiredtiger-2.7.0.tar.bz2
bunzip2 wiredtiger-2.7.0.tar.bz2 && cd wiredtiger-2.7.0
sh autogen.sh && ./configure --enable-snappy && make && sudo make install
- 在目标实例中先创建同名空集合,获取其 collection-*.wt 文件路径。
- 用备份的 .wt 文件替换该文件,使用 wt salvage 尝试修复:
wt -C “extensions=[/opt/wiredtiger-2.7.0/ext/compressors/snappy/.libs/libwiredtiger_snappy.so]” salvage file:collection-7-666354062479792805.wt
- 修复完成后,使用 –repair 启动 mongod 进行一致性修复:
sudo -u mongod mongod --dbpath /data/mongo-bak --repair
- 连接 shell 校验:
db.mycol.validate({full: true})
- 风险提示:该方式仅用于特定文件损坏场景,操作前务必全量备份,且版本必须匹配。
五 常见问题与排错要点
- 认证失败:确认 –username/–password 与 –authenticationDatabase 正确;如使用 SCRAM-SHA-256,确保用户创建方式匹配。
- 权限不足:确保运行 mongorestore 的用户对备份目录和目标库具备相应权限。
- 版本不兼容:mongorestore 与备份来源 大版本差异 可能导致导入失败或索引不兼容。
- 时间点恢复失败:仅当备份目录包含 oplog.bson 且为 oplog 备份 时可用。
- 文件拷贝恢复异常:优先检查 属主/权限(mongod:mongod)、SELinux/防火墙、以及 storage.dbPath 配置是否一致。
- 数据校验:恢复后使用 db.collection.validate({full: true})、db.stats()、抽样查询核对数据量与关键业务记录。