2013-04-21 7 views
8

我試過的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的工作原理是什麼?

回答

21

由於序列化格式是二進制格式(與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選項在最後添加了一個額外的\ n。原始選項不是100%原始;-)

在使用-x選項處理數據之前,需要刪除此額外字符。最後,正確的命令(在GNU/Linux系統上)管理恢復中的轉儲輸出是:

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

這並不美觀。我希望大多數人會依靠perl/python/ruby​​腳本而不是shell來完成這些任務。

+1

那個head命令只會在linux下工作,而不是mac – slf 2013-04-29 14:35:26

+0

謝謝。正如你所說,這兩個命令並不是設計用於命令行的,但仍然可能是這樣做的最好方法。 – 2013-05-11 06:47:39

+3

如果你在Mac上,你可以'brew install coreutils',它將爲你安裝名爲ghead的gnu頭。這樣,您可以運行上述命令替換頭部 – 2015-12-24 12:20:10