【xtarbackup】mysql数据库热备脚本

 Xtrabackup命令属于物理备份,还原速度快,mysql自身带着mysqldump属于逻辑备份,适用于备份小型数据库,,而且mysqldump备份得是二进制文件,还原较慢。

xtarbackup安装过程如下:

yum install -y wget perl perl-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5
wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/binary/Linux/x86_64/percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz
tar xvf percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz 
cd percona-xtrabackup-2.1.9-Linux-x86_64/
cd bin
cp  innobackupex-1.5.1 /usr/bin/innobackupex
cp  xtrabackup_55 /usr/bin/xtrabackup
cp  xtrabackup_56 /usr/bin/
mkdir -p /data/backup/mysql/log
mkdir -p /data/backup/mysql/bin-log

mysql数据库热备脚本如下:

#!/bin/bash
#mysql热备脚本
#备份策略:每周一进行完整备份,以后每一天在前一天的基础上进行增量备份
#备份目录
back_dir="/data/backup/mysql"
#备份数据库信息
host=""
dbuser=""
dbpasswd=""
 
#日志文件
back_log="${back_dir}/log/mysql_back.log"
 
#week day
week_day=`date +%w`
#yesterday
yesterday=`date +%F -d "1 days ago"`
 
#日志记录函数
function log(){
  echo "`date` $1" | tee -a ${back_log}
}

#判断当前日期,是周一进行全备份,其他时间进行增量备份
if [ ${week_day} -eq 1 ]; then
#完整备份
  log "周${week_day}开始完全备份..."
  innobackupex --defaults-file=/etc/my.cnf --host=${host} --user=${dbuser} --password=${dbpasswd} ${back_dir} &>> ${back_log}
  if [ $? -eq 0 ]; then
    log "完全备份完毕."
    else
       log "完全备份出错,请检查."
       exit 1
  fi
  else
    let dir_num=`find ${back_dir} -type d -name "${yesterday}*" | wc -l`
    if [ ${dir_num} -ne 1 ]; then
      log "昨天增量目录未找到或昨天备份目录大于等于2个,请确认后再次备份."
      exit 1
    fi
    incremental_dir=`find ${back_dir} -type d -name "${yesterday}*"`
    log "周${week_day}开始增量备份..."
    #增量备份
    innobackupex --host=${host} --user=${dbuser} --password=${dbpasswd} --incremental ${back_dir} --incremental-basedir=${incremental_dir} &>> ${back_log}
    if [ $? -eq 0 ]; then
      log "增量备份成功."
      else
        log "备份失败,请检查日志..."
        exit 1
    fi
fi
exit $?

备份二进制如下:

#!/bin/bash
# operating environment :CentOS release 6.8
# chkconfig: 2345 80 50
# Auther:wangjiana

bin=$(cat xtrabackup_binlog_info | awk 'BEGIN {FS=" "}{print $1}')
log=$(cat xtrabackup_binlog_info | awk 'BEGIN {FS=" "}{print $2}')
/data/mysql/bin/mysqlbinlog -j $log  /data/mysql/data/$bin > /data/backup/mysql/bin-log/Mon.sql

还原脚本如下:

#!/bin/bash
#mysql数据恢复脚本
 
#back dir
back_dir='/data/backup/mysql'
#full back day
full_back_day=1
#today
today=`date +%F`
#week day
week_day=`date +%w`
#log file
recovery_log="${back_dir}/log/mysql_recovery.log"
 
#log
function log(){
  echo "`date` $1" | tee -a ${recovery_log}
}
 
#find back dir
function finddir(){
  if [ `find $back_dir -type d -name "$1*" | wc -l` -ne 1 ]; then
    log "发现备份目录$1为0个或多于一个,请检查..."
    exit 1
    else
      log "发现备份目录`find $back_dir -type d -name "$1*"`"
      find_dir="`find $back_dir -type d -name "$1*"`"
  fi
}
 
#all recovery
function allredo(){
 log "开始完整备份恢复准备..."
 innobackupex --apply-log --redo-only $1 &>> ${recovery_log}
 if [ $? -ne 0 ]; then
    log "完整恢复准备出错,请检查..."
    exit 1
 fi
 log "完整备份恢复准备完成"
}
 
#incremental recovery
function incredo(){
 log "开始增量数据恢复准备..."
 innobackupex --apply-log --redo-only $1 --incremental-dir=$2 &>> ${recovery_log}
 if [ $? -ne 0 ]; then
    log "增量数据恢复准备出错,请检查..."
    exit 1
  fi
  log "增量数据$2恢复准备完成"
}
#real recovery
function recovery(){
  log "备份数据准备完成,开始恢复数据..."
  innobackupex --copy-back $1 &>> ${recovery_log}
  if [ $? -ne 0 ]; then
    log "完整恢复准备出错,请检查..."
    exit 1
  fi
  log "恢复数据完成,请检查."
  log "请手动恢复二进制文件数据."
}
 
#判断今日是否是周一
 
if [ $week_day -eq ${full_back_day} ]; then
  finddir ${today}
  all_dir="${find_dir}"
  if [ ! -z "${all_dir}" ]; then
    allredo $all_dir
    recovery $all_dir
    else
      log "未发现今日备份,恢复上周数据."
      for i in "7 6 5 4 3 2 1"
        do
          back_date=`date +%F -d "${i} days ago"`
          if [ $i -eq 7 ]; then
            finddir ${back_date}
            all_dir="${find_dir}"
            allredo ${all_dir}
            else
              finddir ${back_date}
              dir_back=${find_dir}
              incredo ${all_dir} ${dir_back}
          fi
      done
      recovery ${all_dir}
  fi
  else
    back_date=`date +%F -d "$((${week_day}-${full_back_day})) days ago"`
    finddir ${back_date}
    all_dir="${find_dir}"
    allredo ${all_dir}
    let flag=$((${week_day}-1-${full_back_day}))
    while [ ${flag} -ge 0 ]
      do
        incr_date=`date +%F -d "${flag} days ago"`
        finddir ${incr_date}
        incr_dir="${find_dir}"
        incredo ${all_dir} ${incr_dir}
        let flag=`expr $flag - 1`
    done
    recovery ${all_dir}
fi
 
exit 0

#恢复数据文件的过程
:'
  1、首先关闭mysql程序
  2、删除/data/mysql/data文件数据,保证文件夹内容为空
  3、运行恢复脚本
  4、修改权限chown -R mysql.mysql /data/mysql/data
  5、启动mysql程序
    如果报错,报错内容:
    Starting MySQL...The server quit without updating PID file (/var/lib/mysql/mysql.pid).[失败]
    解决的过程各个方法:
    1)、可能是/data/MySQL/mysql.pid没有写权限
    2)、可能已经存在mysql进程
    3)、有残余数据文件影响服务启动,删除mysql-bin.index
    4) 、skip-federated字段的问题,注释掉
    5)、错误日志目录不存在,关闭seliunx
  6、恢复二进制文件
     mysql 进入后首先关闭二进制文件
     set sql_log_bin = 0;
     source /data/backup/mysql/bin-log/Mon.sql
      set sql_log_bin = 1 ;
'

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值