redis bgsave 仅触发快照,不自动归档;需脚本等待写入完成、动态获取rdb路径、带时间戳压缩备份,并按策略清理旧文件。

不能靠 crontab 直接调用 bgsave 就算完成“同步到备份池”。Redis 本身不提供自动归档能力,bgsave 只是触发一次快照写入本地 dump.rdb,它不打时间戳、不校验写入完成、不清理旧文件、也不上传或复制——这些必须由外部脚本接管。
必须等待 RDB 真正写完再操作
bgsave 返回 OK 仅表示“已下发任务”,不代表文件已落盘。若脚本立刻拷贝,大概率拿到空文件或上一轮残留。
- 用
redis-cli info persistence | grep rdb_last_save_time获取最近成功保存的时间戳 - 对比当前时间,确认差值小于 5 分钟(例如
$(($(date +%s) - LAST_SAVE)) -lt 300) - 加循环等待(最多 60 秒),避免竞态
动态获取 RDB 路径和文件名
硬编码 /var/lib/redis/dump.rdb 极易出错。不同实例的 dir 和 dbfilename 可能不同,甚至运行在容器中路径完全隔离。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 执行
redis-cli config get dir取实际数据目录 - 执行
redis-cli config get dbfilename取实际文件名 - 拼接完整路径:
RDB_PATH="$RDB_DIR/$RDB_NAME"
拷贝时带时间戳并压缩归档
只保留一个 dump.rdb 没有恢复窗口。每份备份需唯一标识,且节省空间。
- 生成时间戳:
TS=$(date +"%Y%m%d%H%M%S") - 拷贝命令:
cp "$RDB_PATH" "$BACKUP_DIR/dump_$TS.rdb" - 立即压缩:
gzip "$BACKUP_DIR/dump_$TS.rdb"(生成.rdb.gz)
按策略自动清理旧备份
不清理会导致磁盘爆满;盲目 rm -rf * 又可能误删正在使用的备份。
- 按天保留:用
find $BACKUP_DIR -name "dump_*.rdb.gz" -mtime +7 -delete - 按小时保留(如最近 48 小时):
find $BACKUP_DIR -name "dump_*.rdb.gz" -mmin +2880 -delete - 清理前建议先
ls -t | tail -n +$KEEP_COUNT | xargs rm -f更可控










