恢复脚本

#!/bin/bash

#周日全备,周一到周六增备,每次增备完都将增备应用到全备上

#将可以表示每天周几的数字定义为一个变量
zhouji=$(date +"%w")

#因为考虑到万一在备份的时候数据库崩掉,所以建两个备份目录
if ! ls /backup/perfect &>/dev/null
    then
        mkdir -p /backup/perfect
fi

if ! ls /backup1/perfect &> /dev/null
    then
        mkdir -p /backup1/perfect
fi

#创建一个文件,将备份的过程重定向进去
if ! ls /tmp/guocheng &> /dev/null
    then
        touch /tmp/guocheng
fi

#定义一个函数,为备份成功或失败之后的操作
caozuo1()
{

#将备份结果定义为一个变量
jieguo=$(cat /tmp/guocheng | tail -n -1 | awk '{print $3,$4}')

if [[ $jieguo = "completed OK!" ]]
    then
        echo "$(date +"%Y-%m-%d")日的备份已成功"|mail -s "备份" ch1yanzhi@163.com
        echo "$(date +"%Y-%m-%d")日的备份已成功" >> /tmp/jieguo
else
        echo "$(date +"%Y-%m-%d")日的备份失败,请查看原因"|mail -s "备份" ch1yanzhi@163.com
        echo "$(date +"%Y-%m-%d")日的备份失败,请查看原因" >> /tmp/jieguo
        exit 10
fi
}

#定义一个函数,为应用备份成功或失败之后的操作
caozuo2()
{

#将备份结果定义为一个变量
jieguo=$(cat /tmp/guocheng | tail -n -1 | awk '{print $3,$4}')

if [[ $jieguo = "completed OK!" ]]
    then
        echo "$(date +"%Y-%m-%d")日的备份已应用"|mail -s "应用" ch1yanzhi@163.com
        echo "$(date +"%Y-%m-%d")日的备份已应用" >> /tmp/jieguo
else
        echo "$(date +"%Y-%m-%d")日的备份应用失败,请查看原因"|mail -s "应用" ch1yanzhi@163.com
        echo "$(date +"%Y-%m-%d")日的备份应用失败,请查看原因" >> /tmp/jieguo
        exit 11
fi
}

#定义一个函数,为备份的操作
beifen()
{
    if (( $zhouji == 0 ))
    then
        #做一个全备
        innobackupex --no-timestamp --user=root --password=123 /$1/perfect &> /tmp/guocheng
        caozuo1

        sleep 2
        #应用全备并且不回滚
        innobackupex --apply-log --redo-only /$1/perfect &>> /tmp/guocheng
        caozuo2
        #创建存放增量备份的目录
        if ! ls /$1/ | grep "increment" &> /dev/null
        then
            mkdir /$1/increment
        fi

        #删除上周的备份文件
        if (( $(ls /$2 | wc -l ) != 0 ))
            then
                rm -rf /$2/*
        fi

    elif (( $zhouji == 1 )) 
    then
        #在全备的基础上做增备
        innobackupex --incremental --incremental-basedir=/$1/perfect/ --user=root --password=123 /$1/increment/ &> /tmp/guocheng
        caozuo1

        sleep 2
        #将增量的目录名设置为一个变量
        qidian1=$(ls -l /$1/increment/ | tail -n -1 | awk '{print $9}')

        #将增备应用到全备上并且不回滚
        innobackupex --apply-log --redo-only --incremental /$1/perfect/ --incremental-dir=/$1/increment/$qidian1/ &>> /tmp/guocheng
        caozuo2

    elif (( $zhouji == 6 ))
    then
        if (( $(ls /$1/increment/ | wc -l) ==0 ))
        then
            #在全备的基础上做增备
            innobackupex --incremental --incremental-basedir=/$1/perfect/ --user=root --password=123 /$1/increment/ &> /tmp/guocheng
            caozuo1

            sleep 2
            #将增量的目录名设置为一个变量
            qidian1=$(ls -l /$1/increment/ | tail -n -1 | awk '{print $9}')

            #将增备应用到全备上并且不回滚
            innobackupex --apply-log --redo-only --incremental /$1/perfect/ --incremental-dir=/$1/increment/$qidian1/ &>> /tmp/guocheng
            caozuo2
        else
            #将上一次增量的目录名设置为一个变量
            qidian2=$(ls -l /$1/increment/ | tail -n -1 | awk '{print $9}')

            #在上一次增备的基础上做增备
            innobackupex --incremental --incremental-basedir=/$1/increment/$qidian2/ --user=root --password=123 /$1/increment/ &> /tmp/guocheng
            caozuo1

            sleep 2
            #将本次增量的目录定义一个变量
            qidian3=$(ls -l /$1/increment/ | tail -n -1 | awk '{print $9}')

            #将本次增量应用到新的全备上,回滚
            innobackupex --apply-log --incremental /$1/perfect/ --incremental-dir=/$1/increment/$qidian3/ &>> /tmp/guocheng
            caozuo2
        fi

    else
        if (( $(ls /$1/increment/ | wc -l) ==0 ))
        then
            #在全备的基础上做增备
            innobackupex --incremental --incremental-basedir=/$1/perfect/ --user=root --password=123 /$1/increment/ &> /tmp/guocheng
            caozuo1

            sleep 2
            #将增量的目录名设置为一个变量
            qidian1=$(ls -l /$1/increment/ | tail -n -1 | awk '{print $9}')

            #将增备应用到全备上并且不回滚
            innobackupex --apply-log --redo-only --incremental /$1/perfect/ --incremental-dir=/$1/increment/$qidian1/ &>> /tmp/guocheng
            caozuo2
        else    
            #将上一次增量的目录名设置为一个变量
            qidian2=$(ls -l /$1/increment/ | tail -n -1 | awk '{print $9}')

            #在上一次增备的基础上做增备
            innobackupex --incremental --incremental-basedir=/$1/increment/$qidian2/ --user=root --password=123 /$1/increment/ &> /tmp/guocheng
            caozuo1
            sleep 2
            #将本次增量的目录定义一个变量
            qidian3=$(ls -l /$1/increment/ | tail -n -1 | awk '{print $9}')

            #将本次增量应用到新的全备上,并且不回滚
            innobackupex --apply-log --redo-only --incremental /$1/perfect/ --incremental-dir=/$1/increment/$qidian3/ &>> /tmp/guocheng
            caozuo2
        fi
    fi
}


if (( $(ls /backup/perfect/ | wc -l ) == 0 )) && (( $(ls /backup1/perfect/ | wc -l ) == 0 )) && (( $zhouji != 0 ))
then
   #当两个全备备份目录都是是空的时候,不管是星期几,都要进行全备,其他的按照计划来,这样就保证了在第一次全备不是星期天的时候也可以进行全备
    innobackupex --no-timestamp --user=root --password=123 /backup/perfect &> /tmp/guocheng
    caozuo1

    sleep 2
    #应用全备并且不回滚
    innobackupex --apply-log --redo-only /backup/perfect &>> /tmp/guocheng
    caozuo2
    #创建存放增量备份的目录
    if ! ls /backup/ | grep "increment" &> /dev/null
    then
        mkdir /backup/increment
    fi

elif (( $(ls /backup/perfect/ | wc -l ) == 0 )) && (( $zhouji == 0 ))
then
    beifen backup backup1
elif (( $(ls /backup/perfect/ | wc -l ) != 0 )) && (( $zhouji != 0 ))
then
    beifen backup backup1

elif (( $(ls /backup1/perfect/ | wc -l ) == 0 )) && (( $zhouji == 0 ))
then
    beifen backup1 backup
elif (( $(ls /backup1/perfect/ | wc -l ) != 0 )) && (( $zhouji != 0 ))
then
    beifen backup1 backup

else
    echo "两个备份文件都不是空的,请至少清空一个"
    echo "两个备份文件都不是空的,请至少清空一个" | mail -s "备份文件" ch1yanzhi@163.com
fi


[root@server jiaoben]# cat huifu.sh 
#!/bin/bash



huifu1()
{
if ls /backup/increment &> /dev/null
    then
        innobackupex ----defaults-file=/etc/my.cnf --copy-back /backup/perfect &> /tmp/guocheng
    else
        innobackupex ----defaults-file=/etc/my.cnf --copy-back /backup1/perfect &> /tmp/guocheng
    fi
}

huifu2()
{
if (( $(ls /data | wc -l) == 0 ))
then
    huifu1
elif ls /data/mysqlbinlog.* &> /dev/null
then
    if ! ls /tmp/mysqlbinlog.bak &> /dev/null
    then
        mkdir /tmp/mysqlbinlog.bak
    else
        rm -rf /tmp/mysqlbinlog.bak/*
    fi
    mv /data/mysqlbinlog.* /tmp/mysqlbinlog.bak/
    rm -rf /data/*
    huifu1
else
    rm -rf /data/*
    huifu1
fi
}

zhuangtai=$(netstat -tnulp|grep 3306 | awk '{print $7}' | awk -F'/' '{print $2}')
mysql_pid=$(netstat -tnulp|grep 3306 | awk '{print $7}' | awk -F'/' '{print $1}')

if [[ -z $zhuangtai ]]
then

    huifu2
else
    kill -9 $mysql_pid
    huifu2
fi


sleep 2

chown -R mysql:mysql /data/

service mysqld start &>> /tmp/guocheng

if netstat -tnulp|grep 3306 &>> /tmp/guocheng
then
    echo "重启成功" >> /tmp/guocheng

else
   echo "重启失败,请手动恢复数据库" >> /tmp/guocheng

猜你喜欢

转载自blog.csdn.net/qq_39570637/article/details/81673479