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即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM