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