真正能手动强制全量同步的只有replicaof命令重配或清空复制状态:先执行replicaof no one断开关系,再执行replicaof重新连接,触发psync ? -1,从而强制全量同步。

直接执行 DEBUG RELOAD 或重启从节点,都不会触发全量同步;真正能手动强制全量同步的,只有 replicaof 命令重配或清空复制状态。
用 replicaof 重新指定主节点(最常用)
这是生产环境最稳妥的手动触发方式,本质是让从节点“假装第一次连接”:
- 先执行
replicaof no one,断开当前主从关系,从节点变为主节点(此时数据仍保留) - 再执行
replicaof,重新建立连接 → 触发PSYNC ? -1→ 强制全量同步 - 注意:该操作会清空从节点当前所有数据(加载新 RDB 前自动
FLUSHALL),务必确认业务可接受写阻塞和短暂只读 - Redis 6.0+ 推荐用
replicaof,旧版本用slaveof(已废弃但仍兼容)
清空复制缓冲区与偏移量(绕过增量判断)
当只想重做同步、又不想改配置时,可人工破坏增量同步前提条件:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 从节点执行
DEBUG RELOAD不影响复制状态,不会触发全量同步 - 必须同时清除两个关键元数据:
runID和offset,方法是执行CONFIG RESETSTAT+REPLICAOF NO ONE+REPLICAOF ...组合 - 更直接的方式:在从节点上执行
CLIENT REPLY OFF无效,真正有效的是删除redis.conf中的replicaof配置项并重启,但重启后首次连接仍走全量 - 不推荐仅靠
CONFIG SET repl-backlog-size 1来“逼迫”全量——它只影响后续增量缓冲,对当前同步无作用
为什么 SYNC 命令不能用了?
Redis 2.8+ 已弃用原始 SYNC 命令,现在统一用 PSYNC 协议:
-
SYNC是 Redis 2.6 及之前的老协议,会阻塞主节点、不支持部分重同步,现已被完全移除 - 即使你手动发
SYNC,主节点会返回-ERR unknown command错误 - 所有现代 Redis 版本(包括当前最新的 8.2.3)只响应
PSYNC,且从节点内部自动构造请求,用户无法直接调用 - 想验证是否进入全量流程?看主节点日志:出现
Starting BGSAVE for SYNC就对了
真正要手动全量,核心就一条:让从节点丢失 runID 和 offset,并重新发起连接。任何绕过这个逻辑的操作,比如只清 backlog、只 reload、只 flushdb,都只会维持增量同步或干脆不同步。










