rdb写入失败主因是磁盘空间或inode耗尽:即使df -h显示10%剩余空间,若实际可用空间小于used_memory_human值、inode使用率超95%或ext4预留空间不可用,均会导致bgsave失败。

磁盘空间或inode耗尽导致RDB写入失败
Redis执行BGSAVE时需一次性写入完整快照,文件大小≈当前used_memory_human值。即使df -h显示还有10%空间,也可能因以下原因失败:
- 磁盘实际可用空间
-
df -i显示 inode 使用率 ≥95%,尤其在大量小key场景下极易触发 - ext4默认预留5%空间不可用,root用户能写,但redis用户(非root)无法使用这部分空间
- 云盘底层I/O队列满,
dd if=/dev/zero of=/tmp/test bs=1M count=100延迟极高或超时
目录权限或路径配置错误
Redis不会自动创建dir配置的路径,也不校验权限——它只尝试open(),失败就报Permission denied。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 用
redis-cli CONFIG GET dir查出路径后,必须手动ls -ld /path/to/dir确认存在、属主为redis用户、权限含rwx - 常见错误:配置
dir /var/lib/redis/data,但只建了/var/lib/redis,子目录缺失 - SELinux启用时,
chmod 777可能无效,应改用chcon -t redis_var_lib_t /path/to/dir -
dbfilename含空格或中文字符,或用了相对路径(如./dump.rdb),解析失败
fork()失败引发BGSAVE中止
BGSAVE依赖fork()创建子进程,内存不足时直接返回Can't save in background: fork failed,而非磁盘错误。
- 典型日志线索:
Failed opening .rdb for saving: No child processes - Linux内核参数
vm.overcommit_memory设为0(默认)时,fork需预分配与父进程等量内存,易失败 - 临时缓解:运行
redis-cli CONFIG SET vm.overcommit_memory 1,长期应调低maxmemory或升级内存 - 注意:该问题和磁盘无关,查
free -h和cat /proc/meminfo | grep Commit更准
MISCONF错误只是表象,不是根源
客户端收到(error) MISCONF Redis is configured to save RDB snapshots...,本质是stop-writes-on-bgsave-error yes被触发——它只是保护机制,掩盖了真正的失败原因。
- 先执行
redis-cli INFO PERSISTENCE,重点看rdb_last_bgsave_status:err和rdb_last_bgsave_time - 立刻翻
/var/log/redis/redis-server.log,找紧挨着Background saving started之后的那行错误(如No space left on device) - 切勿直接
CONFIG SET stop-writes-on-bgsave-error no来“修复”,这会让后续重启丢失全部数据 - 真正要修的是日志里那行原始错误,不是这个开关
No space left on device,和磁盘满一样,必须用df -i二次确认。










