讲师中心 微信公众号
AI工具推荐 视频效率加速

怎么清理MongoDB配置数据库(config)的庞大日志_changelog集合的定期轮转与保留策略

落瑶吖_5426

落瑶吖_5426

发布时间:2026-03-10 21:00:53

|

589人浏览过

|

来源于php中文网

原创

config.changelog不可直接truncate或drop,否则导致元数据不一致;它由mongos写入、记录配置变更且无自动过期机制;唯一安全清理方式是MongoDB 4.2+中通过mongos执行deleteMany(需先停balancer并限定时间范围)。

怎么清理mongodb配置数据库(config)的庞大日志_changelog集合的定期轮转与保留策略

MongoDB 的 config.changelog 集合不能直接 truncate 或 drop,强行删会导致分片集群元数据不一致甚至不可用。

为什么 config.changelog 会越长越大

这个集合由 mongos 写入,记录所有分片集群的配置变更(如添加/删除分片、迁移 chunk、更新 balancer 状态等)。只要集群长期运行且频繁调整,日志就持续追加——它不自动过期,也不受 TTL 索引支持(MongoDB 官方明确禁止在 config 数据库建索引)。

常见错误现象:config.changelog 占用几十 GB,查询变慢,mongos 启动或重载配置时卡顿,备份时间飙升。

  • 不是业务数据,但属于集群“操作心跳”,删了不影响当前服务,但删错会破坏集群可恢复性
  • 不能用 db.changelog.deleteMany({}) 或 db.changelog.drop() —— config 库只读,写操作会被 mongos 拦截并报错:not authorized on config to execute command { delete: "changelog", ... }
  • 也不能通过 mongod 直连 config server 执行删除:config server 是特殊角色,其本地 config 库受内部保护,绕过 mongos 操作极大概率导致元数据损坏

唯一安全的清理方式:用 sh.stopBalancer() + mongos 连接执行 remove(仅限 MongoDB 4.2+)

从 MongoDB 4.2 开始,官方开放了有限度的 config.changelog 清理入口,但仍要求严格前置条件和操作顺序。

  • 必须先停掉 balancer:sh.stopBalancer(),否则清理过程中新日志写入会导致状态不一致
  • 必须通过 mongos(不能直连 config server)连接到集群,用 admin 数据库权限执行
  • 只能按时间范围删旧数据,推荐保留最近 7–30 天(取决于你故障回溯需求),例如:
use config
db.changelog.remove({ "time": { "$lt": ISODate("2024-04-01T00:00:00Z") } })

注意:remove() 在 4.4+ 已标记为 deprecated,应改用 deleteMany(),但它在 config 库中仍被允许(仅此一处例外);deleteMany() 行为相同,但更符合当前语法习惯。

自动化轮转必须靠外部脚本 + 时间窗口控制

MongoDB 不提供内置轮转机制,得自己定时调用。关键不是“能不能删”,而是“删多少”和“什么时候删最稳”。

  • 脚本必须检查 balancer 状态:sh.getBalancerState() 返回 true 时禁止执行清理
  • 建议在每日低峰期(如凌晨 2–4 点)运行,且每次只删 1 天或 3 天,避免单次操作阻塞 mongos
  • 命令行示例(用 mongo shell 脚本):
mongo --host mongos-host:27017 --eval "
  if (sh.getBalancerState()) {
    print('Balancer is ON, skip cleanup');
    quit(1);
  }
  db = connect('config');
  cutoff = new Date();
  cutoff.setDate(cutoff.getDate() - 15); // 保留最近 15 天
  result = db.changelog.deleteMany({ 'time': { '\$lt': cutoff } });
  print('Deleted ' + result.deletedCount + ' changelog entries');
"

别依赖 system.timeZone:config server 和 mongos 时区可能不一致,统一用 UTC 时间比较安全。

容易被忽略的兼容性坑

不同版本行为差异极大,错配就会失败或静默无效果:

  • MongoDB not authorized,别白费力气
  • MongoDB 4.2–4.4:支持 deleteMany,但部分 patch 版本(如 4.2.8 之前)有 bug,删完后 sh.status() 可能显示异常,建议升到 4.2.12+
  • MongoDB 5.0+:依然支持,但官方文档已移除相关说明,属“未弃用但不鼓励”,未来版本可能收紧
  • 云托管服务(如 Atlas、MongoDB Cloud):默认禁用 config 库写权限,即使你有 admin 角色,也会被平台拦截,需提工单申请临时开通

真正麻烦的从来不是命令怎么写,而是确认当前集群版本、balancer 实际状态、以及你连的是不是真正的 mongos(而不是误连了 config server 或 shard primary)——这三个点错一个,清理就变成高危操作。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

3329

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2348

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

1300

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1238

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

1376

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2238

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

3620

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

16655

2023.09.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn