场景: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

拿到路径,后面的操作就心里有数了。