2013-04-21 4 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-rdb-toolsというサードパーティのオプションがいくつかありますが、結局のところ、DUMPRESTOREはどのくらい正確に機能しますか?

答えて

21

シリアライズ形式がバイナリ(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            |..| 

が、直接パイプが-xで--rawダンプの結果を復元することはできませんので、最後の文字は間違っています。 --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​​スクリプトに頼っていると思います。

+1

headコマンドはMacではなくlinuxでのみ動作します – slf

+0

ありがとうございます。あなたが言ったように、これらの2つのコマンドはコマンドラインで使用するようには設計されていませんが、おそらくこれを行う最良の方法です。 –

+3

あなたがマックにいる場合は、brew install coreutilsを実行するとgnuの頭部がgheadという名前でインストールされます。そのようにして、上記のコマンドを実行して、頭を灰色で置き換えることができます –