Skip to content

Instantly share code, notes, and snippets.

@mandhor
Forked from nicStuff/redis-migrate.sh
Created March 22, 2017 08:18
Show Gist options
  • Save mandhor/8941940824ed1a344f1f0e41df7b68c8 to your computer and use it in GitHub Desktop.
Save mandhor/8941940824ed1a344f1f0e41df7b68c8 to your computer and use it in GitHub Desktop.

Revisions

  1. @nicStuff nicStuff revised this gist Jun 8, 2016. No changes.
  2. @nicStuff nicStuff created this gist Jun 8, 2016.
    42 changes: 42 additions & 0 deletions redis-migrate.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,42 @@
    #!/bin/bash

    ######
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
    # TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
    # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
    # CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
    # DEALINGS IN THE SOFTWARE.
    ######

    ######
    ### Migrates the keys responding to the pattern specified on the command line, using DUMP/RESTORE, supports authentication differently from MIGRATE
    ######

    KEYS_MATCHER=$1
    SOURCE_PASSWORD=foobared
    SOURCE_PORT=6379
    SOURCE_SCHEMA=0
    TARGET_PASSWORD=foobared
    TARGET_PORT=6479
    TARGET_SCHEMA=0
    LOG_FILE="redis-migrate.log"

    if [[ -z "$KEYS_MATCHER" ]]; then
    echo -e "Please provide a KEYS matcher, like *~cache"
    exit 1
    fi

    echo "*** Migrating keys matching $KEYS_MATCHER"

    redis-cli -a $SOURCE_PASSWORD -p $SOURCE_PORT keys $KEYS_MATCHER | while read key; do
    # Preparing TTL
    key_ttl=`redis-cli -a $SOURCE_PASSWORD -p $SOURCE_PORT ttl "$key"`
    if [[ $key_ttl -lt 1 ]]; then
    key_ttl=0
    fi

    echo "Dump/Restore \"$key\", ttl $key_ttl" &>> $LOG_FILE

    key_ttl+="000" # TTL must be in milliseconds when specifying it
    redis-cli --raw -p $SOURCE_PORT -n $SOURCE_SCHEMA -a $SOURCE_PASSWORD DUMP "$key" | head -c -1 | redis-cli -x -p $TARGET_PORT -n $TARGET_SCHEMA -a $TARGET_PASSWORD RESTORE "$key" $key_ttl &>> $LOG_FILE
    done