场景:CentOS 7.9 服务器,需要把 Redis 数据从 A 机迁到 B 机,最快的方式是什么?直接复制那个 .rdb 文件靠谱吗?
先说结论:可以,但得按规矩来。直接复制 RDB 文件是 Redis 迁移中最简单粗暴的方式,但如果不注意细节,轻则数据丢失几分钟,重则 Redis 起不来。
下面把这件事从头到尾讲清楚。
一、先找文件:RDB 到底在哪?
很多人上来就 find / -name "dump.rdb",其实不用这么麻烦。
Redis 的 RDB 文件位置和文件名由两个配置参数决定:
dir:数据文件存放目录dbfilename:RDB 文件名(默认dump.rdb)
1. 直接问 Redis 自己
# 查看数据目录
redis-cli CONFIG GET dir
# 1) "dir"
# 2) "/var/lib/redis"
# 查看 RDB 文件名
redis-cli CONFIG GET dbfilename
# 1) "dbfilename"
# 2) "dump.rdb"
2. 查配置文件
grep -E "^dir|^dbfilename" /etc/redis.conf
3. CentOS 7.9 常见路径对照
| 安装方式 | 配置文件 | 默认 RDB 路径 |
|---|---|---|
yum install redis (EPEL) |
/etc/redis.conf |
/var/lib/redis/dump.rdb |
| 源码编译安装 | /usr/local/redis/redis.conf |
启动目录下的./dump.rdb |
| Docker 容器 | 容器内配置 | 容器内/data/dump.rdb(视挂载而定) |
注意:如果你改过配置,或者 Redis 是以自定义配置文件启动的,路径可能完全不同。最靠谱的方式还是上面两条
CONFIG GET命令。
二、直接复制 RDB 迁移,完整操作流程
前置条件
- 源端和目标端 Redis 版本兼容(低版本 → 高版本可以,反过来不行)
- 迁移期间源端可以短暂停写,或者你能接受复制期间的新写入丢失
- 目标端 Redis 已安装且能正常启动
步骤一:源端生成最新 RDB 快照
RDB 不是实时文件,它是定时快照。如果你直接复制,拿到的是上一次自动保存时的数据,可能落后几分钟甚至几小时。
必须先手动触发保存:
# 方式A:阻塞式保存(SAVE),数据量小用这个
# 执行期间 Redis 不响应任何请求,但保证快照是最新的
redis-cli SAVE
# 方式B:后台保存(BGSAVE),数据量大用这个
# fork 子进程去写磁盘,不影响线上服务
redis-cli BGSAVE
# 查看最近一次保存的时间戳(Unix时间)
redis-cli LASTSAVE
步骤二:确认 RDB 文件已生成
ls -lh /var/lib/redis/dump.rdb
# 应该能看到文件时间戳是刚刚
步骤三:传输到目标服务器
# 用 scp 或 rsync 都行
scp /var/lib/redis/dump.rdb root@目标IP:/tmp/dump.rdb
# 或者 rsync(断点续传,大文件更稳)
rsync -avz --progress /var/lib/redis/dump.rdb root@目标IP:/tmp/
步骤四:目标端替换并启动
# 1. 先停掉目标端 Redis
systemctl stop redis
# 2. 备份原有 RDB(防止翻车)
mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.bak.$(date +%Y%m%d)
# 3. 放入新 RDB
mv /tmp/dump.rdb /var/lib/redis/dump.rdb
# 4. ⚠️ 改权限!这是最容易翻车的地方
chown redis:redis /var/lib/redis/dump.rdb
chmod 660 /var/lib/redis/dump.rdb
# 5. 启动 Redis
systemctl start redis
步骤五:验证
# 看日志确认加载成功
journalctl -u redis -n 50
# 应该能看到类似输出:
# "DB loaded from disk: 1.234 seconds"
# 对比 key 数量
redis-cli DBSIZE
# 抽查几个关键 key
redis-cli GET "your_key"
redis-cli HGETALL "your_hash"
三、必须避开的 6 个坑
| 坑 | 现象 | 解决办法 |
|---|---|---|
| 1. 没手动 SAVE | 迁移后发现少了最近几分钟的数据 | 迁移前务必SAVE 或 BGSAVE |
| 2. 版本不兼容 | 目标端启动报错Can't handle RDB format |
只能高版本兼容低版本,不能反向迁移 |
| 3. AOF 优先级更高 | 明明复制了 RDB,启动后数据还是旧的 | 目标端如果开启了 AOF,Redis 会优先加载 AOF。需要同时复制 AOF 文件,或临时关闭 AOF |
| 4. 文件权限不对 | Redis 启动失败,日志报 Permission denied | chown redis:redis + chmod 660 |
| 5. SELinux 拦截 | 文件权限对了还是起不来 | restorecon -v /var/lib/redis/dump.rdb 或临时关闭 SELinux |
| 6. 源端还在写 | 迁移期间新数据没进 RDB | 要么接受数据丢失,要么用主从复制方案 |
四、如果数据量大、不能停服务怎么办?
直接复制 RDB 的本质是离线迁移,适合:
- 数据量不大(几百 MB 以内)
- 可以短暂停写或接受少量数据丢失
- 一次性迁移,不追求实时同步
如果需要零停机、在线迁移,正确的姿势是 Redis 主从复制:
# 在目标端执行,把目标端设为源端的从节点
redis-cli SLAVEOF 源端IP 6379
# 等待同步完成(看日志或 INFO replication)
# 同步完成后,断开主从关系,目标端就拥有完整数据了
redis-cli SLAVEOF NO ONE
这种方式的好处:
- 不需要停源端
- 实时同步,数据不丢失
- 同步完成后随时可以切流量
五、总结
直接复制 RDB 文件做 Redis 迁移,在 CentOS 7.9 上完全可行,但记住三步:先 SAVE、再传输、最后改权限。
简单场景(测试环境、小数据量、可停写)→ 直接复制 RDB,最快。
生产环境(大数据量、不能停、要求一致性)→ 用主从复制,最稳。
附:一条命令速查 RDB 位置
redis-cli CONFIG GET dir && redis-cli CONFIG GET dbfilename
拿到路径,后面的操作就心里有数了。