Как использовать redis ''DUMP' и 'RESTORE' (offline)?

Я попытался Рэдис по DUMP команда, перенаправление в файл (или канал), но восстановить сообщить об этой ошибке:

$ 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

Я знаю, что перенос можете сделать это онлайн, но перенос также удалите этот ключ с исходного сервера, и я не хочу, чтобы мой redis подвергался публичному интернету.

есть некоторые сторонние варианты,redis-rdb-tools например, но в конце концов, как именно сделать DUMP и RESTORE работа?

1 ответов


команды дампа/восстановления на самом деле не предназначены для использования из командной строки, потому что формат сериализации является двоичным (он же используется для дампов 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."

формат "printable" нельзя использовать как входной сигнал для-X вариант который действительно ожидает фактические данные. Это вводящее в заблуждение поведение redis-cli.

тем не менее, есть простой способ получить формат 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                                             |..|

Теперь невозможно напрямую передать результат -- raw-дампа в A-X restore, потому что последний символ неверен. Сравните выходные данные -- raw и дампа для печати. Вы заметите, что опция --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, а не на оболочку для выполнения таких задач.