我尝试了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的工具,例如,但毕竟,究竟如何做DUMP和RESTORE工作?
DUMP
RESTORE
实际上,转储/还原命令不是为从命令行使用而设计的,因为序列化格式是二进制的(与用于RDB转储的格式相同)。由于外壳程序倾向于解释那些字符(即使使用“可打印”格式时),这也带来了不便。
这是“可打印”格式:
$ 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 |..|
现在,由于最后一个字符是错误的,因此无法直接通过管道将-raw dump的结果传递给-x还原。比较–raw和printable转储的输出。您会注意到– raw选项在末尾添加了一个额外的\ n。原始选项不是100%原始;-)
必须先删除此多余的字符,然后才能通过-x选项处理数据。最后,在恢复中通过管道传输转储输出的正确命令(在GNU / Linux系统上)是:
$ redis-cli --raw dump test | head -c-1 | redis-cli -x restore test1 0 OK
不好看 我希望大多数人会依靠perl / python / ruby脚本而不是shell来执行此类任务。