Redis运行20-30分钟后报Background saving error权限错误排查
Redis RDB持久化权限拒绝故障修复
故障表现
- Redis服务启动后前20-30分钟可正常对外提供服务,之后持续抛出后台保存错误
- 核心报错信息为RDB持久化fork出的子进程写入rdb文件时返回
Permission denied权限拒绝,触发固定间隔的循环重试,持续报后台保存失败
[2476] 24 Jun 19:06:21.293 # Background saving error [2476] 24 Jun 19:06:27.016 * 1 changes in 3600 seconds. Saving... [2476] 24 Jun 19:06:27.025 * Background saving started by pid 9044 [9044] 24 Jun 19:06:27.147 # Failed opening .rdb for saving: Permission denied [9044] 24 Jun 19:06:27.148 # rdbSave failed in qfork: Permission denied [2476] 24 Jun 19:06:27.230 # fork operation complete [2476] 24 Jun 19:06:27.231 # Background saving error
根因说明
启动初期无报错是因为RDB持久化不会在服务启动时立刻执行,只有满足配置文件中预设的save触发阈值时才会启动后台保存任务。首次触发bgsave时子进程没有目标rdb文件的写入权限,就会持续报错重试。
常见诱因:
- Redis配置文件中
dir参数指定的工作目录,归属用户与Redis服务的实际运行用户不匹配 - 目录下已存在的历史dump.rdb文件权限异常,Redis运行用户无覆盖写入权限
- 系统SELinux策略为强制模式,拦截了Redis进程对目标目录的写入操作
- RDB文件所在磁盘分区被挂载为只读模式
修复步骤
- 确认基础配置信息
登录Redis实例查询配置的RDB工作目录:
查询Redis服务的实际运行用户:redis-cli CONFIG GET dirps -ef | grep redis-server | grep -v grep - 修正目录与文件权限
假设查询到工作目录为/var/lib/redis,Redis运行用户为redis,执行以下命令修正权限归属:# 修正目录权限 chown -R redis:redis /var/lib/redis chmod 700 /var/lib/redis # 修正已存在的rdb文件权限,无历史文件时忽略报错 chown redis:redis /var/lib/redis/dump.rdb 2>/dev/null chmod 600 /var/lib/redis/dump.rdb 2>/dev/null - 排查SELinux拦截
查询当前SELinux运行状态:
如果返回结果为getenforceEnforcing,先临时切换为宽容模式验证问题:
手动触发一次后台保存验证:setenforce 0
如果手动触发后无权限报错,说明是SELinux策略拦截,需要配置对应SELinux规则放行Redis的写入操作,不建议长期关闭SELinux。redis-cli BGSAVE - 验证修复效果
手动触发bgsave后查看Redis日志,确认无权限报错,持续观察1小时以上,确认定时触发的RDB保存任务可正常执行即可。
内容的提问来源于stack exchange,提问作者Kalimuthu K
相关产品推荐
相关产品推荐

