临时文件与原子替换
生成快照时 Redis 不会直接覆盖 dump.rdb,而是先写一个形如 temp-<pid>.rdb 的临时文件,写完再用 rename 原子替换正式文件,这样任意时刻磁盘上都有一份完整可用的快照。进程被强杀或磁盘写满时可能留下写了一半的临时文件,它们通常无害,但清理前必须确认当前没有快照在进行。
基本信息
| 机制 | 写入临时文件后原子重命名替换 |
|---|---|
| 临时文件命名 | temp-<pid>.rdb |
| 残留常见原因 | 进程被强杀、磁盘写满、保存中断 |
| 清理前提 | 确认没有正在进行的后台保存 |
典型使用场景
- 数据目录里出现多余临时文件,判断能不能删
- 磁盘告警时排查空间被谁占用
- 迁移或扩容后确认数据目录内容是否正常
- 快照失败时通过残留文件的时间戳反推发生时间
- 编写自动清理脚本前明确安全判定条件
查看与安全清理
查看与安全清理
# 看数据目录里的残留快照,注意进程号与时间戳
ls -lh /data/redis/temp-*.rdb
# 确认当前没有后台保存在跑(0 表示空闲)
redis-cli INFO persistence | grep -E 'rdb_bgsave_in_progress|rdb_last_bgsave_status'
# 确认该进程号已经不存在,再考虑删除
ls -l /proc/12345 2>/dev/null || echo "进程不存在"
rm /data/redis/temp-12345.rdb文件与状态对照
| 对象 | 含义 | 判断要点 |
|---|---|---|
| dump.rdb | 正式快照文件 | 任何时刻都应能被加载 |
| temp-<pid>.rdb | 写入中的临时文件 | 保存结束后应自动消失 |
| rdb_bgsave_in_progress | 是否正在保存 | 为 1 时不要动临时文件 |
| rdb_last_bgsave_status | 最近一次保存结果 | err 时优先查磁盘与权限 |
| dir | 数据目录配置 | 临时文件与目标文件需在同一文件系统 |
原子替换依赖临时文件与目标文件位于同一文件系统;如果用符号链接或挂载点把它们分到不同设备,rename 不再原子,快照可能只写了一半就被业务看到。
把数据目录指向内存文件系统(如 tmpfs)会让快照在重启后直接消失;数据目录必须落在真实磁盘或持久化卷上,并单独监控剩余空间。