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

hup*_*xue 59 snapshot redis

我将我的redis快照(dump.rdb文件)转移scp到远程服务器.我需要在这个遥控器上运行一个redis服务器并从dump.rdb文件中恢复数据.我怎样才能做到这一点?

Did*_*zia 63

没有什么特别的事情要做.只需在新机器上安装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/
Run Code Online (Sandbox Code Playgroud)

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

  • @Evgeny我想也许你犯了同样的错误并试图重启服务器.确保先停止redis,将dump.rdb文件复制到正确的目录,然后启动服务器.如果重新启动,redis将写入文件,覆盖复制的转储,然后导入它写入的文件,而不是您作为备份移动的文件. (7认同)
  • 在我编辑配置文件并重新启动redis-server之后,我的转储被重新编译(100Mb - > 0Mb).我的错误在哪里? (6认同)
  • 这是一个极其糟糕和危险的答案,没有提及“redis.conf”文件中“appendonly”设置的任何内容。任何时候你想恢复redis的`dump.rdb`文件,你必须确保`redis.conf`中的`appendonly`设置为`no`。否则,它将完全清空您的“dump.rdb”文件并从点 0 重新开始,就像什么都没发生一样。各位小心之前! (4认同)
  • 我恢复数据成功遵循您的步骤,谢谢! (3认同)

Rob*_*jic 47

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

  1. 停止redis(因为redis在退出时会覆盖当前的rdb文件).
  2. 将备份rdb文件复制到redis工作目录(这是dirredis配置中的选项).还要确保备份文件名与dbfilenameconfig选项匹配.
  3. 启动redis.

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

  1. 停止redis(因为redis在退出时会覆盖当前的rdb文件).
  2. 将备份rdb文件复制到redis工作目录(这是dirredis配置中的选项).还要确保备份文件名与dbfilenameconfig选项匹配.
  3. 将redis配置appendonly标志更改为no(否则redis会在启动时忽略您的rdb文件).
  4. 启动redis.
  5. 运行redis-cli BGREWRITEAOF以创建新的appendonly文件.
  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 append only mode is enabled Redis will load the data from the                                                          
# >> log file at startup ignoring the dump.rdb file. 
Run Code Online (Sandbox Code Playgroud)

  • 并且在复制文件后不要忘记`chown redis:redis dump.rdb`和`chmod 644 dump.rdb` (3认同)

tza*_*bal 14

假设您运行Redis 2.6或更高版本,您的Redis快照文件名是dump.rdb,并且它存在于目录中/home/user/dbs,以下命令将执行此操作:

redis-server --dbfilename dump.rdb --dir /home/user/dbs
Run Code Online (Sandbox Code Playgroud)

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


Rux*_* T. 10

或者你可以:

  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文件.


Tla*_*-ES 8

该解决方案适用于 redis-cluster,但也应该适用于 redis。

安装此依赖项https://github.com/sripathikrishnan/redis-rdb-tools

pip install rdbtools python-lzf
Run Code Online (Sandbox Code Playgroud)

之后执行这个

rdb -c protocol /path/to/dump.rdb | redis-cli -h host -p port --pipe
Run Code Online (Sandbox Code Playgroud)

如果这是一个集群,则该端口应该是主端口。


typ*_*gic 6

我想在这里添加一个没有提到的小细节,我不会使用配置文件,而是在命令行中指定所有内容。

当启动时指定了 mydump.rdb 和appendonly.aof 文件时redis-server,该文件将appendonly.aof获胜,以便加载appendonly.aof 中的数据。例如:

redis-server --dbfilename mydump001.rdb --dir /data --appendonly yes
Run Code Online (Sandbox Code Playgroud)

上面的启动调用将使用该位置来查找或文件/dir的存在。在这种情况下,将从 加载内容。如果不存在,它将创建一个空的并且redis-server将为空。mydump001.rdbappendonly.aofredis-serverappendonly.aofappendonly.aof/data/appendonly.aof

如果你想加载特定的转储文件,你可以这样做:

redis-server --dbfilename mydump001.rdb --dir /data
Run Code Online (Sandbox Code Playgroud)

我添加了这个答案,因为不清楚哪个是哪个。在存在2个备份文件的情况下,这通常不会被提及。


dou*_*oug 5

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

$ > redis-server /path/to/my/redis/configuration/file/redis.conf
Run Code Online (Sandbox Code Playgroud)

当redis启动时,它会找到你的rdb文件,因为它会在你启动redis服务器时提供的配置文件(redis.conf)中查找名称文件路径,如上所述.

要提供文件名和路径,只需在redis.conf文件模板中编辑两行(在redis源的根目录中提供.将修改后的版本保存为redis.conf,在启动服务器时提供的目录位置.

您可以在源顶级目录的redis.conf模板中找到所需的设置,第127137行(redis版本2.6.9).

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

# The working directory
dir ./
Run Code Online (Sandbox Code Playgroud)

如您所见,为这两个设置提供了默认值

所以只需更改这两行中的第一行(127)以标识您的rdb文件,然后在第二行(137)中将默认的"./"替换为快照rdb文件的实际文件路径; 使用您的更改保存redis.conf,然后启动redis传递这个新的conf文件.