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

我尝试了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例如,但毕竟,DUMPRESTORE究竟是如何工作的?


最佳答案:

dump/restore命令实际上不是设计为从命令行使用的,因为序列化格式是二进制的(与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 dump的结果,因为最后一个字符是错误的。比较--raw和printable转储的输出。您将注意到--raw选项在末尾添加了一个额外的\n。raw选项不是100%raw;-)
在-x选项处理数据之前,需要删除这个额外的字符。最后,正确的命令(在GNU/Linux系统上)将转储的输出传输到还原中是:
$ redis-cli --raw dump test | head -c-1 | redis-cli -x restore test1 0
OK

这不漂亮。我希望大多数人会依赖Perl/python/ruby脚本而不是shell来完成这些任务。