2014-04-22 6 views

Odpowiedz

18

Jeśli nie można używać MIGRATE COPY z powodu swojej wersji Redis może chcesz skopiować każdy klawisz osobno, która trwa dłużej, ale nie wymaga logowania się do samych maszyn i umożliwia przenoszenie danych z jednej bazy danych do drugiej. Oto jak skopiować wszystkie klucze z jednej bazy danych do innego (ale bez zachowywania TTLS)

#set connection data accordingly 
source_host=localhost 
source_port=6379 
source_db=0 
target_host=localhost 
target_port=6379 
target_db=1 

#copy all keys without preserving ttl! 
redis-cli keys \* | while read key; do echo "Copying $key"; redis-cli --raw -h $source_host -p $source_port -n $source_db DUMP "$key" | head -c -1|redis-cli -x -h $target_host -p $target_port -n $target_db RESTORE "$key" 0; done 

Keys nie będą overwriten, za to usuń klucz przed skopiowaniem lub opróżnić całej bazy danych przed uruchomieniem.

+0

Dla wersji redis> 2.6 można użyć polecenia migrate 'klucze redis-cli \ * | podczas czytania klucza; wykonaj echo "Copying key"; abc = "MIGRATE localhost 1234 $ key 0 5000 COPY"; redis-cli "MIGRATE localhost 1234 $ key 0 5000 COPY"; done' –

+0

Stworzyłem [istotę, która obsługuje również uwierzytelnianie i TTL] (https://gist.github.com/nicStuff/ee7feb8eed00174a46db42812545b403). @uditmittal to wspaniałe, w każdym razie rozważ, że MIGRATE nie obsługuje uwierzytelniania nawet w wersji 3.2. – reallynice

0

Nie bezpośrednio. Proponuję użyć zawsze wygodnego pakietu redis-rdb-tools (od Sripathi Krishnan), aby wyodrębnić dane z normalnego zrzutu RDB i ponownie wprowadzić go do innej instancji.

Zobacz https://github.com/sripathikrishnan/redis-rdb-tools

+0

Oprócz odpowiedzi Didier za: jeśli chcesz zrobić to przez Internet i przyrostowo, możesz użyć kombinacji ['SCAN'] (http://redis.io/commands/scan) i [' MIGRATE'] (http://redis.io/commands/migrate) –

-1

Spróbuj użyć zrzutu najpierw zrzucić wszystkie klucze, a następnie przywrócić taką samą

+0

Próbuję to ale nie można przywrócić w wymaganej db.Its pokazują błąd - nazwa klucza Target jest zajęty. – Subo

+1

Może to być spowodowane tym, że nazwa klucza już istnieje w docelowej bazie danych. Spróbuj utworzyć nowy db, a następnie przywróć zrzucone klucze. Upewnij się także, że db jest poprawnie przełączony i nie jest poprzedni podczas przywracania, co może powodować konflikt. –

0

O ile mi zrozumieć, trzeba skopiować klucze od określonego DB (na przykład 5) określonego DB powiedzieć 10. Jeśli tak jest w istocie można użyć Redis wywrotka bazie (https://github.com/r043v/rdd). Chociaż zgodnie z dokumentacją ma przełącznik (-d), aby wybrać bazę danych do działania, ale nie działa dla mnie, więc to, co zrobiłem

1.) Edytuj plik rdd.c i poszukaj int main (int argc, char argv) funkcja
2.) Zmień DB jak na swoje wymagania
3.) sporządza src przez ** dokonać

4.) Dump wszystkie klucze używając ./rdd -o "save.rdd"
5.) Ponownie edytuj plik rdd.c i zmień DB
6.) Zrób ponownie
7.) importu za pomocą ./rdd "save.rdd" -o wstawić -s "IP" -p "port"

0

wiem, że to jest stary, ale dla tych z was przychodzi tu tworzyć Google :

Właśnie opublikowałem narzędzie interfejsu wiersza poleceń do npm i github, które pozwala kopiować klucze, które pasują do danego wzoru (nawet *) z jednej bazy danych Redis do drugiej.

można znaleźć narzędzia tutaj:

https://www.npmjs.com/package/redis-utils-cli

0
redis-cli -a $source_password -p $source_port -h $source_ip keys /*| while read key; 
do echo "Copying $key"; 
redis-cli --raw -a $source_password -h $source_ip -p $source_port -n $dbname DUMP "$key"| head -c -1| redis-cli -x -a $destination_password -h $destination_IP -p $destination_port RESTORE "$key" 0; 
0

kopiuje wszystkie klucze z numerem 0 do bazy danych bazy danych numer 1 na localhost.

redis-cli --scan | xargs redis-cli migrate localhost 6379 '' 1 0 copy keys

Jeśli używasz tego samego serwera/portu dostaniesz błąd przekroczenia limitu czasu, ale klawisze wydają się powodzeniem skopiować tak.GitHub Redis issue #1903

0

Jeśli migracji klucze wewnątrz tego samego silnika Redis, wówczas można użyć wewnętrznego MOVE polecenia dla tego (potokowego dla większej prędkości):

#!/bin/bash 

#set connection data accordingly 
source_host=localhost 
source_port=6379 
source_db=4 
target_db=0 

total=$(redis-cli -n 4 keys \* | sed 's/^/MOVE /g' | sed 's/$/ '$target_db'/g' | wc -c) 
#copy all keys without preserving ttl! 
time redis-cli -h $source_host -p $source_port -n $source_db keys \* | \ 
    sed 's/^/MOVE /g' | sed 's/$/ 0/g' | \ 
    pv -s $total | \ 
    redis-cli -h $source_host -p $source_port -n $source_db >/dev/null