如何使用redis的`DUMP`和`RESTORE`(离线)?

问题描述 投票:0回答:3

我尝试了redis的DUMP命令,重定向到文件(或管道),但是RESTORE报告此错误:

$ redis-cli dump test > /tmp/test.dump
$ cat /tmp/test.dump | redis-cli -x restore test1 0
(error) ERR DUMP payload version or checksum are wrong
$ redis-cli dump test | redis-cli -x restore test1 0
(error) ERR DUMP payload version or checksum are wrong

我知道MIGRATE可以在线执行此操作,但是MIGRATE还会从原始服务器中删除该密钥,并且我不希望我的redis暴露在公共互联网上。

有一些第三方选项,例如 redis-rdb-tools,但毕竟,

DUMP
RESTORE
到底是如何工作的?

redis restore dump
3个回答
48
投票

转储/恢复命令并不是真正设计为从命令行使用的,因为序列化格式是二进制的(与 RDB 转储使用的格式相同)。这使得它很不方便,因为 shell 倾向于解释这些字符(即使使用“可打印”格式)。

这是“可打印”格式:

$ redis-cli lpush test 1 2 3 4 5
(integer) 5
$ redis-cli dump test
"\n\x15\x15\x00\x00\x00\x12\x00\x00\x00\x05\x00\x00\xf6\x02\xf5\x02\xf4\x02\xf3\x02\xf2\xff\x06\x00\x1c\x8a\xda\x0e}\xcb\xe1."

“可打印”格式不能用作真正需要实际数据的 -x 选项的输入。这是redis-cli的一种误导行为。

但是,有一个简单的方法来获取原始格式:

$ redis-cli --raw dump test | hexdump -C
00000000  0a 15 15 00 00 00 12 00  00 00 05 00 00 f6 02 f5  |................|
00000010  02 f4 02 f3 02 f2 ff 06  00 1c 8a da 0e 7d cb e1  |.............}..|
00000020  2e 0a                                             |..|

现在,无法在 -x 恢复中直接通过管道传输 --raw 转储的结果,因为最后一个字符是错误的。比较 --raw 和可打印转储的输出。您会注意到 --raw 选项添加了额外的 在最后。原始选项不是 100% 原始;-)

需要先删除这个额外的字符,然后才能通过 -x 选项处理数据。最后,在恢复中通过管道传输转储输出的正确命令(在 GNU/Linux 系统上)是:

$ redis-cli --raw dump test | head -c-1 | redis-cli -x restore test1 0
OK

这不太漂亮。我预计大多数人会依赖 perl/python/ruby 脚本而不是 shell 来完成此类任务。


0
投票

如果值包含

\n
(回车),则
head
tr
版本脚本无法正常工作,您可以使用
split/dd/truncate
或其他bin utils来处理最后一个坏字节。


0
投票

-D
控制分隔符。将其设置为空字符串以进行转储/恢复。

redis-cli --raw -D "" dump test | redis-cli -x restore test1 0
© www.soinside.com 2019 - 2024. All rights reserved.