'Copy all keys from one db to another in redis

Instade of move I want to copy all my keys from a particular db to another. Is it possible in redis if yes than how ?



Solution 1:[1]

If you can't use MIGRATE COPY because of your redis version (2.6) you might want to copy each key separately which takes longer but doesn't require you to login to the machines themselves and allows you to move data from one database to another. Here's how I copy all keys from one database to another (but without preserving 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 -h $source_host -p $source_port -n $source_db 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 are not going to be overwritten, in order to do that, delete those keys before copying or simply flush the whole target database before starting.

Solution 2:[2]

Copies all keys from database number 0 to database number 1 on localhost.

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

If you use the same server/port you will get a timeout error but the keys seem to copy successfully anyway. GitHub Redis issue #1903

Solution 3:[3]

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;

Solution 4:[4]

Not directly. I would suggest to use the always convenient redis-rdb-tools package (from Sripathi Krishnan) to extract the data from a normal rdb dump, and reinject it to another instance.

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

Solution 5:[5]

As far as I understand you need to copy keys from a particular DB (e.g 5 ) to a particular DB say 10. If that is the case you can use redis database dumper (https://github.com/r043v/rdd). Although as per documentation it has a switch (-d) to select a database for operation but didn't work for me, so what I did

1.) Edit the rdd.c file and look for int main(int argc,char argv) function
2.) Change the DB to as per your requirement
3.) compile the src by **make

4.) Dump all keys using ./rdd -o "save.rdd"
5.) Edit the rdd.c file again and change the DB
6.) Make again
7.) Import by using ./rdd "save.rdd" -o insert -s "IP" -p"Port"

Solution 6:[6]

I know this is old, but for those of you coming here form Google:

I just published a command line interface utility to npm and github that allows you to copy keys that match a given pattern (even *) from one Redis database to another.

You can find the utility here:

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

Solution 7:[7]

Try using dump to first dump all the keys and then restore the same

Solution 8:[8]

If migrating keys inside of the same redis engine, then you might use internal command MOVE for that (pipelining for more speed):

#!/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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Zectbumo
Solution 3 Amit Joshi
Solution 4 Didier Spezia
Solution 5 upendra singh
Solution 6
Solution 7 Chhavi Gangwal
Solution 8 Arie Skliarouk