SHUTDOWN

将数据库同步保存到磁盘并关闭 Redis 服务器。

语法

SHUTDOWN [NOSAVE | SAVE] [NOW] [FORCE] [ABORT]

引入版本:1.0.0

复杂度摘要:O(N)

命令行为如下:

  • 如果有任何副本复制滞后:
  • 通过执行带有 WRITE 选项的 CLIENT PAUSE 来暂停尝试写入的客户端。
  • 等待副本配置的 shutdown-timeout(默认 10 秒)以赶上复制偏移量。
  • 停止所有客户端。
  • 如果至少配置了一个 保存点,则执行阻塞 SAVE。
  • 如果启用了 AOF,则刷新仅追加文件。
  • 退出服务器。

如果启用了持久性,此命令可确保 Redis 关闭而不会丢失任何数据。

注意:配置为不在磁盘上保留的 Redis 实例(未配置 AOF,也未“保存”指令)不会将 RDB 文件转储到 SHUTDOWN 上,因为通常您不希望仅用于缓存的 Redis 实例在关闭时阻塞。

另请注意:如果 Redis 接收到信号 SIGTERM 和 SIGINT 之一,则会执行相同的关闭序列。另请参见 信号处理。

可选参数

NOSAVE | SAVE

即使没有配置保存点,SAVE 也会强制进行 DB 保存;即使配置了一个或多个保存点,NOSAVE 也会阻止 DB 保存。

NOW

跳过等待滞后副本,绕过关闭序列中的第一步。

FORCE

忽略通常会阻止服务器退出的任何错误。

ABORT

取消正在进行的关闭。不能与其他标志组合。

详细说明

SHUTDOWN 失败的情况

配置保存点或指定SAVE修饰符时,如果无法保存RDB文件,可能会导致关机失败。然后,服务器继续运行以确保不丢失数据。这可以使用 FORCE 修饰符绕过,导致服务器无论如何退出。

当启用仅附加文件时,关闭可能会失败,因为系统处于不允许立即安全地保留在磁盘上的状态。

通常,如果有 AOF 子进程执行 AOF 重写,Redis 会简单地杀死它并退出。但是,在某些情况下这样做是不安全的,除非指定了 FORCE 修饰符,否则 SHUTDOWN 命令将被拒绝并出现错误。这种情况发生在以下情况:

  • 用户刚刚开启 AOF,服务器触发第一次 AOF 重写,以创建初始 AOF 文件。在这种情况下,停止将导致完全丢失数据集:一旦重新启动,服务器可能会启用 AOF,但根本没有任何 AOF 文件。
  • 启用 AOF 的副本重新与其主服务器连接,执行完全重新同步,并重新启动 AOF 文件,触发初始 AOF 创建过程。在这种情况下,不完成 AOF 重写是危险的,因为从 master 接收到的最新数据集将会丢失。新的主服务器实际上甚至可以是不同的实例(如果使用 REPLICAOF 或 SLAVEOF 命令来重新配置副本),因此完成 AOF 重写并从代表服务器终止时内存中的数据集的正确数据集开始非常重要。

在某些情况下,我们只想尽快终止 Redis 实例,无论其内容是什么。在这种情况下,可以使用命令SHUTDOWN NOW NOSAVE FORCE。在 7.0 之前的版本中,NOW 和 FORCE 标志不可用,正确的命令组合是发送 CONFIG 附加 否,然后发送 SHUTDOWN NOSAVE。第一个命令将在需要时关闭 AOF,并在有活动的情况下终止 AOF 重写子进程。由于 AOF 不再启用,所以执行第二个命令不会有任何问题。

最大限度地降低数据丢失的风险

从 Redis 7.0 开始,服务器在关闭之前等待滞后副本直至可配置的 shutdown-timeout(默认情况下为 10 秒)。在未配置保存点且禁用 AOF 的情况下,这可以最大程度地降低数据丢失的风险。在版本 7.0 之前,关闭无盘设置中负载较重的主节点更有可能导致数据丢失。为了最大限度地降低此类设置中数据丢失的风险,建议在关闭主节点之前触发手动 FAILOVER(或 CLUSTER FAILOVER)以将主节点降级为副本并将副本之一提升为新的主节点。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
❌ 标准
❌主动-主动
❌ 标准
❌主动-主动

返回值

RESP2

简单字符串回复:如果指定了 ABORT 并且关闭被中止,则为 OK。成功关闭后,不会返回任何内容,因为服务器退出并且连接关闭。失败时,会返回错误。

RESP3

简单字符串回复:如果指定了 ABORT 并且关闭被中止,则为 OK。成功关闭后,不会返回任何内容,因为服务器退出并且连接关闭。失败时,会返回错误。

资料来源:Redis 官方 SHUTDOWN 文档;中文内容参考 Redis 文档许可。