redis备份与恢复

1.redis的备份

redis需要远程访问 添加密码进行登录,修改主配置文件添加:
requirepass xxx

redis-cli -h 127.0.0.1 -p 6379 -a 123456 bgsave

###

-h 指定主机ip

-p 指定redis端口

-a 指定密码

bgsave:数据文件持久化到磁盘

    然后到数据目录下打包备份。

tar zcf /usr/local/192.168.0.161_redis_6379.tar.gz dump.rdb

附上一个自动备份的脚本    或者写到任务计划里

 

#bin/bash

REDIS_DIR="/usr/local/redis/var/db/"

REDIS_PORT=`netstat -tunlp|grep redis|egrep '6379' |grep -v grep|awk '{print $4}'|awk -F: '{print $2}'`

BACKUP_DIR="/usr/local/hero_all_backup"

MYSQL_LOG="/home/msbakscript/logs/mysql.log"

HOST=$(awk -F= '/IPADDR=/ {print $2}' /etc/sysconfig/network-scripts/ifcfg-eth1)

DATE=`date +%F_%H-%M`

Hour=`date '+%H'`

pwd=xxx

all_bak=("$HOST"_"$DATE")

increase_bak=("$HOST"_"$DATE""-increase")

DEL_DAY="7"

#################################################################

PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/mysql/bin:/usr/local/redis/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/python/bin:/usr/local/python/sbin:/usr/

local/eventlog/bin:/usr/local/eventlog/sbin:/usr/local/syslog-ng/bin:/usr/local/syslog-ng/sbin:/root/bin"

redis_backup(){

for i in ${REDIS_PORT}

        do

                idt=`redis-cli -p $i -a ${pwd} info |grep role|awk -F: '{print $2}'|tr -d '\r'`

                #根据redis的角色进行备份,master不开启AOF持久化,通过bgsave对RDB快照;slave开启AOF持久化,通过bgrewriteaof进行备份;

                case $idt in

                master)

                        echo "redis-cli -h 127.0.0.1 -p $i -a ${pwd} bgsave"

                        redis-cli -h 127.0.0.1 -p $i -a ${pwd} bgsave

                        ;;

                slvae)

                        echo "redis-cli -h 127.0.0.1 -p $i -a ${pwd} bgrewriteaof"

                        redis-cli -h 127.0.0.1 -p $i -a ${pwd} bgrewriteaof

                        ;;

                *)

                        exit 1

                        ;;

                esac

        done

}

cp_backup(){

        echo "sleep 30 waiting redis write to disk"

        sleep 30

        for i in ${REDIS_PORT}

        do

                idt=`redis-cli -p $i -a ${pwd} info |grep role|awk -F: '{print $2}'|tr -d '\r'`

                #根据redis的角色进行备份,master不开启AOF持久化,通过bgsave对RDB快照;slave开启AOF持久化,通过bgrewriteaof进行备份;

                case $idt in

                master)

                        #echo cp ${REDIS_DIR}/dump.rdb ${BACKUP_DIR}/${HOST}_${i}.dump.rdb.$tt >> ${BACKUP_DIR}/redis_backup.log

                        #/bin/cp -f ${REDIS_DIR}/dump.rdb ${BACKUP_DIR}/${HOST}_${i}.dump.rdb.$tt

                        cd ${REDIS_DIR}

                        tar zcf ${BACKUP_DIR}/${all_bak}_${i}.tar.gz dump.rdb

                        echo -en "%${all_bak}_${i}.tar.gz" >>${MYSQL_LOG}

                        cd -

                        ;;

                slvae)

                        #echo cp ${REDIS_DIR}/appendonly.aof ${BACKUP_DIR}/${HOST}_${i}.appendonly.aof.$tt >> ${BACKUP_DIR}/redis_backup.log

                        #/bin/cp -f ${REDIS_DIR}/appendonly.aof ${BACKUP_DIR}/${HOST}_${i}.appendonly.aof.$tt

                        cd ${REDIS_DIR}

                        tar zcf ${BACKUP_DIR}/${all_bak}_${i}.tar.gz appendonly.aof

                        echo -en "%${all_bak}_${i}.tar.gz" >>${MYSQL_LOG}

                        cd -

                       

                        ;;

                *)

                        exit 1

                        ;;

                esac

        done

 

}

 

 

del_backup(){

        #因所有备份都是全库备,所以按日期删除4天以前的备份数据

        cd ${BACKUP_DIR}

        find . \( -name "*appendonly*" -o -name "*dump*" \)  -mtime +${DEL_DAY} -exec  rm -f {} \;

}

 

#main start

mkdir -p ${BACKUP_DIR}

tt=`date +"%Y%m%d-%H%M%S"`    ###按照日期时间格式进行备份

redis_backup

cp_backup

del_backup

2.redis还原

 

(1)停掉redis

 

(2)启动redis,重启是因为释放redis内存

 

(3)解压备份出来的redis备份

 

(4)拷贝覆盖到正在使用的数据目录里面

 

(5)再重启redis即可。

 

posted @ 2017-07-25 15:56  GeminiMp  阅读(1785)  评论(0编辑  收藏  举报