MongoDB节点一直处于RECOVERING状态怎么排查_Oplog陈旧与全量同步失败

MongoDB副本集节点卡在RECOVERING状态的根本原因只有两个:一是无法追上主节点oplog(oplog过短或过旧),二是全量同步中途失败且未重试成功;其他如网络、磁盘、权限等问题只是诱因,不直接导致卡住。为什么 MongoDB 副本集节点卡在 RECOVERING 状态根本原因只有两个:要么无法追上主节点的 oplog(oplog 太短或太旧),要么全量同步(initial sync)中途失败且没重试成功。不是网络抖动、磁盘满、权限错这些"外围问题"导致的卡住,而是同步机制本身被阻断了。典型现象是:rs.status() 里该节点状态长期为 RECOVERING,日志里反复出现 cannot find starting oplog entry 或 initial sync pending,但没报具体错误码。oplog 不够长:主节点已把从节点需要的起始 oplog 条目覆盖掉了全量同步被中断后未自动重启:比如复制过程中磁盘写满、目标节点崩溃、或 storage.mmapv1(已弃用)下锁冲突从节点时间落后太多:导致 oplog 时间戳校验失败(尤其在 WT 引擎 + logicalSessionTimeoutMinutes 配置敏感时)查 oplog 是否陈旧:用 db.getReplicationInfo() 和 db.oplog.rs.find().sort({natural: -1}).limit(1)先确认主节点的 oplog 覆盖窗口是否足够。执行 db.getReplicationInfo() 看 timeDiffHours ------ 如果小于从节点上次同步时间差,就铁定追不上。再手动查最新一条 oplog:db.oplog.rs.find().sort({natural: -1}).limit(1),看 ts 字段的时间戳。对比从节点日志里报错的 "need oplog entry at timestamp X",如果 X 已不在主节点 oplog 中,说明陈旧。修复方法不是"拉长 oplog",而是删掉从节点数据目录,强制重新 initial sync临时补救可改主节点 oplogSizeMB 并重启,但仅对后续同步有效,不能救当前卡住的节点注意:4.4+ 版本默认使用 WiredTiger,oplog 是 capped collection,大小由 storage.oplogMinRetentionHours 控制,不是固定大小判断是否卡在全量同步:看 mongod 日志里的 InitialSync 关键字和 progress 字段启动从节点后,日志里会密集打印 InitialSync 相关行。如果某条 progress 卡住不动超过 30 分钟(比如一直停在 "collection": "admin.system.version"),基本就是同步卡死。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
Minner-Scrapy9 分钟前
Scrapy 2.17 源码解析:Scheduler 调度器与磁盘/内存双队列
java·爬虫·python·scrapy·网络爬虫·twisted
CODER030419 分钟前
Anaconda和Mamba创建环境管理包常用命令合集
python·深度学习·conda·虚拟环境·mamba·常用命令大全
闲猫31 分钟前
LangGraph / Capabilities / Fault tolerance
python·agent·langgraph
程序员夏洛1 小时前
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
数据库·mysql
IvanCodes1 小时前
Python 基础语法(一):变量、数据类型与运算符
python
Wang's Blog1 小时前
PostgreSQL笔记34:索引优化策略全景解析——从B-tree到HOT的核心原理与实践
数据库·笔记·postgresql
程序员三藏2 小时前
浅谈性能测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
l1258652 小时前
# RAG向量数据库优化实战:HNSW索引调参与生产级性能设计
数据库·python·mysql·langchain
梦Arrebol2 小时前
Mysql内容及相关实验
数据库·mysql
OceanWaves19932 小时前
mysql 8.0.32 磁盘爆满,清理从库日志
数据库·mysql