Redis怎样清理旧的快照文件_配合Shell脚本实现RDB历史备份轮转

老芳小哥_3237

老芳小哥_3237

2026-03-28

458人浏览

原创

Redis RDB快照文件不能直接删除,因为可能误删正在写入的temp-*.rdb临时文件或尚未加载确认的有效快照,导致数据恢复失败;安全清理需结合INFO persistence状态、排除当前文件及临时文件,并按时间(如-mmin)精确筛选。

redis怎样清理旧的快照文件_配合shell脚本实现rdb历史备份轮转

Redis RDB快照文件为什么不能直接删?

因为 redis.conf 里 dbfilename 和 dir 共同决定了当前正在写入的 RDB 文件路径,但 Redis 不会自动管理历史快照——它只管覆盖或新建,不管旧文件。直接用 rm *.rdb 可能误删正在被 SAVE 或 BGSAVE 写入的临时文件(比如 temp-12345.rdb),也可能删掉还没被主进程加载确认的上一份快照,导致恢复失败。

真正安全的做法是:只清理「已确认完成、且超过保留时限」的快照,且避开 Redis 正在操作的文件名模式。

  • redis-cli INFO persistence 中的 rdb_last_save_time 和 rdb_bgsave_in_progress 是判断依据
  • Redis 进程启动时会读取 dbfilename 指定的文件,所以那个文件一定不能删
  • 临时文件名通常是 temp-*.rdb,必须跳过

Shell 脚本怎么安全识别可删除的 RDB 文件?

核心逻辑不是“找 .rdb 后缀”,而是“找符合命名规则 + 时间戳可解析 + 不在 Redis 当前使用列表中”的文件。推荐用 find 配合 -name 和 -mtime,但要注意:

  • 别用 -mtime +7 算“7天前”,它按 24 小时整数倍截断,可能漏掉刚过 6 天 23 小时的文件;改用 -mmin +10080(精确到分钟)更稳
  • 必须排除 temp-*.rdb 和 dump.rdb(默认 dbfilename 值)——后者是当前有效快照
  • 如果改过 dbfilename(比如设成 myapp.rdb),脚本里得同步更新排除名单

示例片段(假设 dir /var/lib/redis,保留最近 3 天):

find /var/lib/redis -name "*.rdb" \
  ! -name "dump.rdb" \
  ! -name "temp-*.rdb" \
  -mmin +4320 \
  -delete

如何避免脚本和 Redis 写入冲突?

最简单的办法是让脚本只在 BGSAVE 不活跃时运行,否则可能删到一半被新快照覆盖,或者删完立刻触发一次 BGSAVE 导致磁盘爆满。检查方式就是读 redis-cli INFO persistence 的输出:

  • 当 rdb_bgsave_in_progress:1 时,跳过本次清理
  • 用 grep -q "rdb_bgsave_in_progress:0" 判断比解析 JSON 更轻量
  • 加个 sleep 30 重试最多 2 次,避免因瞬时繁忙错过执行窗口
  • 不要把清理脚本和 save 触发条件(如 save 900 1)放在同一台机器高频调度,容易形成 I/O 尖峰

为什么轮转策略建议用时间而非数量?

因为 RDB 文件大小波动极大:空实例几 KB,大实例可达几十 GB。固定保留 5 个文件,可能占满 200GB 磁盘;而按时间(比如 72 小时)能自然适配业务写入节奏。但要注意:

  • SAVE 是阻塞的,生产环境几乎不用;BGSAVE 是 fork 子进程,内存翻倍风险存在,所以不能靠频繁快照来“多留几个”
  • 如果用 AOF + RDB 混合持久化,appendfilename 和 dbfilename 的路径最好分开,避免清理脚本误伤 AOF 日志
  • 云环境(如 AWS EBS)要注意快照清理后磁盘空间不会立即释放,需配合 fstrim(仅限支持 TRIM 的文件系统)

实际部署时,最容易被忽略的是 Redis 配置里的 dir 权限——脚本用什么用户跑,就得确保该用户对 dir 有读写权限,且不能依赖 root。否则 cron 里看着执行成功,其实一个文件都没删掉。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2235

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3582

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1196

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4119

7

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4769

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4315

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

8232

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

663

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习