2013-04-21 19 views
8

ho provato il comando di Redis DUMP, reindirizzare su file (o tubo), ma RESTORE rapporto di questo errore:Come usare redis '`DUMP` e` RESTORE` (offline)?

$ 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 

Sono consapevole che MIGRATE possibile farlo online, ma MIGRATE anche eliminare tale chiave dal server originale, e Non voglio che i miei redis vengano pubblicati su internet.

Ci sono alcune opzioni di terze parti, ad esempio redis-rdb-tools, ma dopo tutto, come funzionano esattamente DUMP e RESTORE?

risposta

21

I comandi di dump/restore non sono realmente progettati per essere utilizzati dalla riga di comando, poiché il formato di serializzazione è binario (è lo stesso utilizzato per i dump RDB). Rende inopportuno perché la shell tende a interpretare quei caratteri (anche quando viene utilizzato il formato "stampabile").

Ecco il formato "stampabile":

$ 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." 

Il formato "stampabile" non possono essere utilizzati come input per l'opzione -x, che si aspetta in realtà i dati effettivi. Questo è un comportamento fuorviante di redis-cli.

Tuttavia, c'è un modo semplice per ottenere il formato RAW:

$ 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            |..| 

Ora, non è possibile direttamente pipe il risultato di una discarica in un --raw -x ripristino, perché l'ultima il personaggio è sbagliato Confronta l'output di --raw e dump stampabile. Noterai che l'opzione --raw aggiunge un \ n aggiuntivo alla fine. L'opzione raw non è al 100% raw ;-)

Questo carattere aggiuntivo deve essere rimosso prima che i dati possano essere elaborati dall'opzione -x. Infine, il comando corretto (su un sistema GNU/Linux) per inviare l'output di una discarica in un ripristino è:

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

Questo non è abbastanza. Prevedo che la maggior parte delle persone farebbe affidamento su uno script perl/python/ruby ​​piuttosto che sulla shell per svolgere tali compiti.

+1

questo comando di testa funzionerà solo su linux, non mac – slf

+0

Grazie. come hai detto, questi due comandi non sono progettati per essere usati in linea di comando, ma questo è probabilmente il modo migliore di farlo. –

+3

Se sei su un mac puoi 'brew install coreutils' che installerà gnu head per te con il nome ghead. In questo modo è possibile eseguire il comando precedente sostituendo head con ghead –