CentOS 上 MongoDB 数据恢复实操指南
一、恢复方式总览
- 使用官方工具恢复:通过 mongorestore 恢复由 mongodump 生成的 BSON 数据,适合常规全量或按库/集合恢复。若备份包含 oplog,可结合 –oplogReplay 实现时间点恢复(推荐在临时实例中回放,确认无误后再导入生产)。
- 文件系统级恢复:当数据目录损坏或误删且具备 WiredTiger 底层文件(如 .wt)时,可用 wt 工具导出/导入或修复,作为“最后手段”。
- 复制集回滚:若为 副本集,可直接从其他成员重新同步或回滚到安全时间点。
- 工具版本匹配:恢复工具(mongodump/mongorestore)与目标 MongoDB 版本尽量一致,避免 BSON/特性不兼容。
二、标准流程 mongorestore 恢复(含时间点恢复)
- 准备环境
- 安装数据库工具(若未安装):sudo yum install -y mongodb-org-tools。
- 建议先备份当前数据目录:sudo cp -R /var/lib/mongo /var/lib/mongo_backup。
- 如涉及认证,准备具有相应权限的账号与 –authenticationDatabase。
- 全量恢复(示例)
- mongorestore --host 127.0.0.1 --port 27017 -u root -p ‘pwd’ --authenticationDatabase admin /path/to/dump/
- 时间点恢复(推荐在临时实例操作)
- 先做含 oplog 的基础备份:mongodump -u root -p ‘pwd’ --authenticationDatabase admin --oplog -o /tmp/bak
- 确定恢复窗口:
- 基础备份时间:stat /tmp/bak/oplog.bson 获取备份完成时刻的时间戳(秒级)。
- 误操作时刻:在源库查询 oplog,例如 db.getCollection(‘oplog.rs’).find({op:“c”, ns:“yourdb.$cmd”, o:{drop:“yourcoll”}}),记录 ts。
- 导出增量 oplog 片段:
- mongodump -u root -p ‘pwd’ --authenticationDatabase admin -d local -c oplog.rs -q ‘{ts:{$lt:Timestamp(TS2,1),$gt:Timestamp(TS1,1)}}’ -o /tmp/zl
- 启动临时实例(端口如 27018):mongod --dbpath /root/mtmp --logpath /root/mtmp/27018.log --port 27018 --bind_ip_all
- 先恢复基础备份并回放 oplog:mongorestore --port 27018 --oplogReplay /tmp/bak
- 再回放增量 oplog:mongorestore --port 27018 --oplogReplay /tmp/zl/local/oplog.rs.bson
- 校验数据后,再按需要导出/导入到生产库。
- 说明
- oplog 回放具备幂等性,重复执行不会产生副作用。
- 若仅需恢复单库/单集合:mongorestore --db dbname --collection coll /path/to/dump/dbname/coll.bson。
三、文件系统级恢复 WT 工具(WiredTiger 底层)
- 适用场景:数据目录损坏、误删集合但 WiredTiger 文件仍在,或需要从 .wt 直接抽取数据。
- 基本步骤
- 安装依赖并编译 wt(示例为 CentOS 7):
- sudo yum install -y epel-release libtool automake snappy snappy-devel lz4 lz4-devel zstd zstd-devel zlib zlib-devel git make
- git clone https://github.com/wiredtiger/wiredtiger.git
- git checkout tags/mongodb-4.4.1 -b v4.4.1
- sh autogen.sh && ./configure --disable-shared --with-builtins=lz4,snappy,zlib,zstd && make -j $(nproc) && make install
- 仅导出集合数据(已知表与文件映射):
- …/wt -C “extensions=[libwiredtiger_snappy.so]” -R dump _mdb_catalog > table.list
- 依据 table.list 找到目标集合对应的 collection-*.wt,导出:
- …/wt -v -C “extensions=[libwiredtiger_snappy.so]” -R dump collection-xxx.wt
- 在临时实例中恢复
- 启动临时 mongod(dbpath 指向新目录),在 mongo shell 中先创建同名空集合以获取目标 collection-*.wt 文件;停掉 mongod。
- 用导出的数据覆盖该 collection-*.wt,执行修复:…/wt salvage file:collection-xxx.wt
- 重启 mongod,校验数据;如需回到正式库,可 mongodump 导出后再 mongorestore 到生产。
- 提示:若压缩算法为 snappy/zstd,需在 wt 命令中通过 -C “extensions=[…]” 正确加载对应库。
四、注意事项与常见问题
- 版本兼容:备份与恢复工具版本尽量与目标 MongoDB 一致;跨大版本恢复需先在测试环境验证。
- 权限与安全:确保用于恢复的账号具备 readWrite/restore 等必要权限;生产恢复前先在临时实例验证。
- 避免覆盖:恢复前备份现有 /var/lib/mongo;尽量恢复到新目录/临时实例,确认无误再切换。
- 锁定与并发:文件系统级恢复时,确保 mongod 已停止,避免 WiredTiger.lock: Resource temporarily unavailable。
- 时间点恢复窗口:精确确定 基础备份完成时刻与误操作时刻的 oplog ts,避免漏回放或误回放。
- 校验:恢复后用 show dbs/集合统计/抽样查询核对数据一致性与数量。