2013-04-21 46 views
8

dosyalayamıyorum (veya boru) yönlendirme, REDIS en DUMP komutu çalıştı, ancak RESTORE rapor bu hata:Redis 'DUMP' ve 'RESTORE` (çevrimdışı) nasıl kullanılır?

$ 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 
Ben MIGRATE Bu işlemi şuradan yapabilirsiniz farkındayım

ancak MIGRATE da orijinal sunucudan o anahtarı silin ve Redisimin kamuya açıklanmasını istemiyorum.

Orada bazı üçüncü taraf seçenekleri, örneğin redis-rdb-tools, ama sonuçta tam olarak nasıl DUMP ve RESTORE çalışır?

cevap

21

Doldurma/geri yükleme komutları gerçekten komut satırı tarafından kullanılmak üzere tasarlanmamıştır çünkü seri hale getirme biçimi ikilidir (RDB dökümleri için kullanılanla aynıdır). Kabuk, bu kabuğun bu karakterleri yorumlama eğiliminde olduğundan ("yazdırılabilir" biçim kullanıldığında bile) rahatsızlık verir.

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

"yazdırılabilir" formatında gerçekten gerçek verileri bekliyor -x seçeneği için girdi olarak kullanılamaz: Burada

"yazdırılabilir" biçimidir. Bu redis-cli'nin yanıltıcı bir davranışıdır.

Ancak ham biçimi elde etmenin kolay bir yolu vardır: Artık

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

, doğrudan boru bir -x ile bir -Ham dökümü sonucu geri mümkün değildir son çünkü karakter yanlış. --raw ve yazdırılabilir döküntünün çıktısını karşılaştırın. --raw seçeneğinin sonunda ek bir \ n eklediğini göreceksiniz. Ham seçenek% 100 raw değildir ;-)

Veriler -x seçeneği tarafından işlenmeden önce bu ek karakterin kaldırılması gerekir. Son olarak, boruya doğru komut (bir GNU/Linux sisteminde) bir geri yükleme bir dökümü çıktısı: Bu hoş değil

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

. Çoğu insanın böyle görevler yerine kabuktan ziyade perl/python/ruby ​​betiğine güvenmesini beklerim.

+1

bu başlık komutu sadece linux üzerinde çalışacaktır, mac değil – slf

+0

Teşekkürler. Dediğiniz gibi, bu iki komut, komut satırında kullanılmak üzere tasarlanmamıştır, ancak yine de bu muhtemelen bunu yapmanın en iyi yolu. –

+3

Eğer bir macdaysanız, gnu başını ghead ismiyle yükleyeceğiniz install coreutils' demeleyebilirsiniz. Bu şekilde, yukarıdaki komutu ghead ile değiştirerek başınızı çalıştırabilirsiniz –