能,但必须停机、关AOF、路径权限对、版本兼容——缺一不可,否则启动失败或数据不全;常见错误包括路径/权限不对导致“No such file”、版本不匹配报“Wrong RDB version”、AOF启用致RDB被跳过。

直接拷贝 dump.rdb 文件能用吗
能,但必须停机、关 AOF、路径权限对、版本兼容——缺一不可,否则启动就失败或数据不全。
常见错误现象:Failed to open the RDB file dump.rdb: No such file or directory 不是文件没传过去,而是 dir 配置路径不对,或者 Redis 进程用户(如 redis)没读权限;Wrong RDB version 是源 Redis 7.2 写的 RDB 拿去 Redis 6.2 启动,直接报错退出。
- 目标 Redis 的
appendonly必须设为no,否则优先加载appendonly.aof,RDB 被跳过 -
dbfilename和dir配置要跟源端一致,默认是dump.rdb放在dir目录下 - 复制完文件后执行
chown redis:redis /path/to/dump.rdb,别留着 root 属主 - 用
redis-check-rdb dump.rdb校验文件完整性,它不改文件,只报错或静默通过
为什么不能用 RESTORE 命令加载 dump.rdb
RESTORE 不是 RDB 加载器,它是单键还原命令,输入必须是 DUMP 输出的二进制值,不是整个 dump.rdb 文件。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
强行把 dump.rdb 当作 serialized_value 传给 RESTORE key ttl dump.rdb,会触发 WRONGTYPE 或 ERR invalid argument 错误——因为 dump.rdb 开头是 REDIS0011 头部,根本不是合法的键序列化格式。
-
RESTORE的典型用法是:RESTORE mykey 0 "$(redis-cli DUMP mykey)" - 想逐键还原 RDB,得先用
redis-rdb-cli -f dump.rdb -c pipe解析成 RESP 协议流,再管道注入目标实例 - 这种方案不保证原子性,迁移中写入的数据可能被覆盖,建议提前
FLUSHDB
大文件传输和版本兼容怎么避坑
RDB 文件越大,传输和加载风险越高;版本不匹配不是警告,是直接启动失败。
- 传输用
rsync --partial --progress,断点续传,避免网络抖动重传整份 - 源 Redis 版本 ≥ 目标 Redis 版本(例如 7.0 → 7.2 可行,7.2 → 7.0 不行),官方只保证向后兼容
- 如果目标启用了
requirepass,RDB 文件本身不含密码,但连接时仍需认证——迁移完连不上,八成是忘了配密码 - 目标
maxmemory设得太小,RDB 数据超限不会拒绝加载,但后续写入立刻触发 LRU 清洗,容易误判为“数据丢了”
停机迁移和不停机迁移怎么选
停机迁移(拷 RDB + 重启)是默认推荐路径,简单可靠;不停机只能靠解析 RDB + --pipe 或主从同步,代价高、细节多。
- 停机窗口允许?选停机迁移:关服务 → 拷文件 → 启服务,5 分钟内搞定
- 完全不能停?优先考虑主从切换:把目标设为源的 slave,等同步完成再 promote,比解析 RDB 更稳
- 非要用
--pipe?注意 TTL 丢失问题——redis-rdb-tools导出的 RESP 不带过期时间,除非加--escape参数 - AOF 方案适合保留目标端增量数据:把源端
appendonly.aof用redis-cli --pipe < appendonly.aof注入,它只是重放命令,不覆盖已有键
redis-check-rdb 没跑、以及误以为 RESTORE 能当 RDB 加载器用。

















