如何从从另一台机器复制的快照(rdb文件)中恢复redis数据?

92

我使用scp命令将我的redis快照(dump.rdb文件)传输到远程服务器。 我需要在该远程服务器上运行redis服务器,并从dump.rdb文件中恢复数据。 如何操作?

9个回答

81

如果设置了appendonly标志为no的数据库,您可以执行以下操作:

  1. 停止Redis(因为Redis在退出时会覆盖当前的rdb文件)。
  2. 将备份的rdb文件复制到Redis工作目录中(这是Redis配置中的dir选项)。同时,请确保您的备份文件名与配置选项dbfilename匹配。
  3. 启动Redis。

另一方面,如果您需要将rdb文件还原到追加文件数据库中,则应该执行以下类似操作:

  1. 停止Redis(因为Redis在退出时会覆盖当前的rdb文件)。
  2. 将备份的rdb文件复制到Redis工作目录中(这是Redis配置中的dir选项)。同时,请确保您的备份文件名与配置选项dbfilename匹配。
  3. 更改Redis配置文件appendonly标志为no(否则Redis在启动时将忽略您的rdb文件)。
  4. 启动Redis。
  5. 运行redis-cli BGREWRITEAOF以创建新的追加文件。
  6. 将Redis配置appendonly标志恢复为yes

具体而言,这是Redis配置文件注释中相关的部分内容:

# Note that you can have both the async dumps and the append only file if you                                                     
# like (you have to comment the "save" statements above to disable the dumps).                                                    
# >> Still if appendonly mode is enabled Redis will load the data from the                                                          
# >> log file at startup ignoring the dump.rdb file. 

8
在拷贝文件后别忘了执行chown redis:redis dump.rdbchmod 644 dump.rdb命令。 - RickyA
谢谢!对我来说,将appendonly标志设置为yes导致RDB文件被忽略并重写。 - rubik
谢谢!在处理大型rdb文件时,您可能仍会看到“KEYS”的空结果。请耐心等待几分钟。 - ozma

72

没有具体的操作步骤。只需在新机器上安装redis服务器并编辑配置文件。您只需要更改以下参数,以指向您刚刚复制的转储文件的位置。

# The filename where to dump the DB
dbfilename mydump.rdb

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
# 
# Also the Append Only File will be created inside this directory.
# 
# Note that you must specify a directory here, not a file name.
dir /data/mydirectory/

最后,可以以正常方式启动redis服务器。


8
我编辑了配置文件并重启 Redis 服务器后,我的 dump 文件被重写了(从100MB变成了0MB)。我犯了什么错误? - Evgenii
19
@Evgeny,我觉得你可能犯了和我一样的错误,试图重新启动服务器。确保先停止redis,将dump.rdb文件复制到正确的目录,然后再启动服务器。如果你重新启动,redis会写入文件,覆盖你复制的备份,然后导入它自己所写的文件,而不是你移动的备份文件。 - akahunahi
只有在我们首先停止Redis服务器时,我们才能成功迁移数据库。 - Pramod S. Nikam
我认为@Ligemer的评论非常重要!如果在答案中也能包含它就更好了(除了那个小问题,答案已经很到位了)。 - mikey
4
这是一个非常糟糕和危险的答案,没有提到在redis.conf文件中的appendonly设置。每当您想要恢复Redis dump.rdb文件时,您必须确保在redis.conf内将appendonly设置为no。否则,它会完全清空您的dump.rdb文件,并从零开始重新开始,就好像什么都没有发生过一样。小心谨慎! - Paul D.

26
假设您运行的是 Redis 2.6 及以上版本,您的 Redis 快照文件名为 dump.rdb,并且存在于目录 /home/user/dbs 中,那么以下命令可以完成该操作:
redis-server --dbfilename dump.rdb --dir /home/user/dbs

官方文档的相关部分:通过命令行传递参数


14
您可以选择以下方式之一:
  1. 停止您的 Redis 服务器/实例,例如,service redis6379 stop
  2. 将 dump.rdb 文件复制到正确的位置,例如,cp /path/to/dump-6379.rdb /var/lib/redis/dump-6379.rdb。给它正确的权限(用户:组应该是 redis:redis,并且模式为 644)
  3. 启动您的 Redis 服务器/实例,例如,service redis6379 start
重要提示:在将文件复制到正确的位置之前,请确保先停止 Redis 服务器,因为 Redis 在终止前会保存快照,这样它会替换您的文件。
另外,您可能需要先备份现有的 dump.rdb 文件。

7
这个解决方案适用于redis-cluster,但也应该适用于redis。
安装此依赖项:https://github.com/sripathikrishnan/redis-rdb-tools
pip install rdbtools python-lzf

执行此操作

rdb -c protocol /path/to/dump.rdb | redis-cli -h host -p port --pipe

如果这是一个集群,端口应该是主节点的端口。


6
我希望在此添加一个小细节,即不使用配置文件,而是在命令行中指定所有内容。当启动redis-server时,如果同时指定了mydump.rdb和appendonly.aof文件,则以appendonly.aof文件为准,因此将加载来自appendonly.aof的数据。例如:
redis-server --dbfilename mydump001.rdb --dir /data --appendonly yes

上述启动调用将使用/dir位置来查找mydump001.rdbappendonly.aof文件的存在。在这种情况下,redis-server将从appendonly.aof中加载内容。如果appendonly.aof不存在,则会创建一个空的/data/appendonly.aof,redis-server将为空。
如果您想要加载特定的转储文件,可以执行以下操作:
redis-server --dbfilename mydump001.rdb --dir /data

我添加了这个答案,因为哪一个是哪一个并不明显。如果存在两个备份文件,这通常没有被提及。


5

在你的第二台服务器上启动Redis,如下所示:

$ > redis-server /path/to/my/redis/configuration/file/redis.conf

当 Redis 启动时,它会查找你在启动 Redis 服务器时提供的配置文件(redis.conf)中的名称文件路径,以便找到你的文件。
要提供文件名和路径,只需编辑redis.conf文件模板中的两行。该文件模板位于 Redis 源代码根目录中。将修改后的版本保存为 redis.conf,并放置在启动服务器时指定的目录位置中。
你可以在源代码的顶层目录中找到所需设置的行号127137redis.conf模板中。注意,此处保留了 HTML 标签。
# The filename where to dump the DB
dbfilename dump.rdb

# The working directory
dir ./

如您所见,这两个设置都有默认值。

只需更改第一个设置 (第127行) 来标识您的 RDB 文件, 在第二个设置中 (第137行),将默认值“./”替换为快照 RDB 文件的实际文件路径; 保存带有更改的 redis.conf 文件,并启动 Redis 传递这个新的配置文件。


3

非常好用,谢谢! - Manuel Meurer

2

请尝试设置appendonly为no。在我的案例中,*.aof文件为空(0字节),必须将appendonly设置为no,然后使其加载dump.rdb。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接