MongoDB 日志滚动更新:不停机解决磁盘占满问题
生产环境 MongoDB 单机节点因日志未滚动导致磁盘告警,记录排查过程以及如何在不停机的情况下完成日志滚动配置。
如果你在一台机器上通过包管理器安装了 MongoDB 并直接启动,那么大概率会遇到这个问题:某天登录机器,发现磁盘快满了,一查是 MongoDB 日志文件占了十几个 G。
# 问题出现
某天登录服务器,发现磁盘使用率接近 90%:
输出类似:
第一反应:是不是日志或者数据文件膨胀了。
# 如何排查
# 找到占用大的目录
一路定位下去,发现 /var/log/mongodb/mongod.log 有 29G。
# 确认 MongoDB 日志配置
看到类似:
问题明确了:logAppend: true 会让日志一直追加到同一个文件,没有任何滚动策略,时间一长文件就会膨胀到十几 G。
# 不停机解决
MongoDB 提供了
logRotate命令,可以在线切换日志文件,无需重启服务。
# 方案一:直接执行 logRotate(一次性切换)
连接 MongoDB Shell:
执行:
MongoDB 会将当前日志重命名为 mongod.log.2026-01-17T...,然后创建新的 mongod.log 继续写入。磁盘空间此时还没有释放,但旧日志文件已经可以安全删除或压缩归档了。
# 方案二:用系统 logrotate 自动管理(推荐)
MongoDB 的 logRotate 命令可以和 Linux 的 logrotate 配合使用,实现自动滚动。
创建 /etc/logrotate.d/mongodb:
关键点说明:
daily/size 100M:每天或达到 100M 就滚动rotate 7:保留 7 天历史compress:压缩旧日志节省空间sharedscripts+postrotate:滚动后发送SIGUSR1信号给 MongoDB 进程,等同于logRotate命令,让 MongoDB 切换到新文件
验证配置:
# 方案三:通过 systemd 信号
如果 MongoDB 是通过 systemd 管理的,也可以直接发信号:
MongoDB 收到 SIGUSR1 后行为与 logRotate 命令一致。
# 安装服务时的最佳配置
一次配置到位,避免日后踩坑。
在安装 MongoDB 后,直接在 /etc/mongod.conf 的 systemLog 中配置:
logRotate: reopen 表示收到 SIGUSR1 信号或执行 logRotate 命令后,MongoDB 会关闭当前日志文件并打开一个新的。这是配合系统 logrotate 的前置条件(默认值就是 reopen,但显式写上更清晰)。
然后再手动创建 /etc/logrotate.d/mongodb,就能一劳永逸。
# 总结
整个处理过程其实很简单:
- 排查:
du -sh逐层定位到 MongoDB 日志文件过大 - 在线切换:
db.adminCommand({ logRotate: 1 })不停机切换日志 - 配置自动化:添加
logrotate配置,一劳永逸 - 清理历史:确认滚动生效后,删除或归档旧的日志文件
核心在于 MongoDB 的 logRotate / SIGUSR1 机制,让整个过程完全不需要停机。
