2013-04-21 23 views
8

tôi đã cố gắng DUMP lệnh redis của, chuyển hướng đến tập tin (hoặc ống), nhưng RESTORE báo cáo lỗi này:Làm thế nào để sử dụng redis '`DUMP` và` RESTORE` (ngoại tuyến)?

$ 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 

Tôi biết rằng MIGRATE có thể làm trực tuyến này, nhưng MIGRATE cũng xóa mà quan trọng từ máy chủ gốc, và Tôi không muốn redis của tôi tiếp xúc với internet công cộng.

Có một số tùy chọn của bên thứ ba, ví dụ: redis-rdb-tools, nhưng sau khi tất cả, làm thế nào chính xác làm DUMPRESTORE hoạt động?

Trả lời

21

Lệnh kết xuất/khôi phục không thực sự được thiết kế để sử dụng từ dòng lệnh, bởi vì định dạng tuần tự là nhị phân (nó là cùng một được sử dụng cho các bãi RDB). Nó làm cho nó bất tiện vì vỏ có xu hướng diễn giải các ký tự đó (ngay cả khi định dạng "có thể in" được sử dụng).

Đây là "in" định dạng:

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

Định dạng "in" không thể được sử dụng như là đầu vào cho các tùy chọn -x mà thực sự hy vọng dữ liệu thực tế. Đây là một hành vi gây hiểu lầm của redis-cli.

Tuy nhiên, có một cách dễ dàng để có được những định dạng thô:

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

Bây giờ, nó không thể trực tiếp dẫn kết quả của một bãi chứa --raw trong một -x khôi phục, bởi vì cuối cùng nhân vật là sai. So sánh đầu ra của kết xuất - in và in. Bạn sẽ thấy tùy chọn --raw thêm một \ n ở cuối. Tùy chọn thô không phải là 100% nguyên ;-)

Ký tự thừa này cần được xóa trước khi dữ liệu có thể được xử lý bằng tùy chọn -x. Cuối cùng, lệnh đúng (trên hệ thống GNU/Linux) để kết nối đầu ra của bãi chứa trong khôi phục là:

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

Điều này không đẹp. Tôi hy vọng hầu hết mọi người sẽ dựa vào một kịch bản perl/python/ruby ​​chứ không phải là trình bao để thực hiện các tác vụ đó.

+1

lệnh đầu sẽ chỉ hoạt động trên linux, chứ không phải mac – slf

+0

Cảm ơn bạn. như bạn đã nói, hai lệnh này không được thiết kế để sử dụng trong dòng lệnh, nhưng đây vẫn là cách tốt nhất để làm như vậy. –

+3

Nếu bạn đang ở trên một mac bạn có thể 'brew cài đặt coreutils' mà sẽ cài đặt gnu đầu cho bạn với tên ghead. Bằng cách đó bạn có thể chạy lệnh trên thay thế đầu bằng ghead –

Các vấn đề liên quan