restore命令不能直接加载dump.rdb文件,因其仅接受dump生成的单键序列化值,而dump.rdb是含头部、多库、校验和的全量复合二进制格式,强行传入会报wrongtype或err invalid argument错误。

RESTORE 命令本身不能直接读取 RDB 文件——它只接受 DUMP 生成的序列化值,不是完整的 dump.rdb。想靠一个 RDB 文件跨机房迁移,必须用文件级操作,而不是逐键 RESTORE。
为什么不能直接用 RESTORE 加载 dump.rdb 文件
RESTORE 的输入是单个键的二进制序列化结果(由 DUMP 输出),而 dump.rdb 是 Redis 全量数据的复合二进制格式,含头部、数据库选择、多个键、校验和等。把整个 dump.rdb 当作 serialized_value 传给 RESTORE 会触发 WRONGTYPE 或 ERR invalid argument 错误。
正确做法:停服 + 替换 RDB 文件 + 重启
这是最稳妥、也最常用的大批量跨机房迁移方式,前提是目标 Redis 可停机或能接受短暂不可用:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 在源 Redis 执行
bgsave,确认dump.rdb已生成(用redis-cli config get dbfilename和config get dir查路径) - 停止目标 Redis 实例(
systemctl stop redis或kill -TERM $(cat /var/run/redis.pid)) - 将源端的
dump.rdb复制到目标端dir配置指向的目录下,覆盖原文件 - 确保目标 Redis 的
appendonly no(AOF 必须关闭,否则启动时会优先加载 AOF,RDB 被忽略) - 启动目标 Redis:
systemctl start redis,它会自动加载该 RDB 文件
不重启的替代方案:用 redis-cli --pipe 模拟逐键还原
如果目标 Redis 不能停机,又想复用 RDB 文件内容,得先解析 RDB → 转成 Redis 协议命令流 → 管道注入。这需要外部工具:
- 用
redis-rdb-cli(推荐):redis-rdb-cli -f /path/to/dump.rdb -c pipe -n 0 -o "redis-cli -h target-host -p 6379 -a password"
- 或用
redis-rdb-tools导出为 resp 格式再管道导入(但要注意 TTL 丢失风险) - 注意:
--pipe不保证原子性,过程中新写入的数据可能被覆盖;建议迁移前FLUSHDB清空目标库 - 大 RDB 文件传输时,优先用
rsync --partial --progress断点续传,避免因网络中断重传整份
容易被忽略的关键点
RDB 文件迁移看似简单,但三个细节常导致失败:
- 目标 Redis 版本不能低于源端(例如源是 7.2,目标是 6.2 会报
ERR Invalid RDB version) -
dir配置路径的权限必须让 Redis 进程可读(常见坑:复制完文件后属主仍是 root,Redis 用户无法读取) - 若源 Redis 启用了
requirepass,RDB 文件本身不加密,但迁移过程中的网络传输需走内网或加 SSH 隧道,否则密码和数据明文暴露










