Shell结合crontab实现MySQL的全量、增量备份

本篇文章主要讲如何使用shell实现mysql全量,增量备份。增量备份在周一-周六凌晨3点,会复制mysql-bin.00000*到指定目录;而全量备份则使用mysqldump将所有的数据库导出,每周日凌晨3点执,并会删除上周留下的mysq-bin.00000*。然后对mysql的备份操作会保留在bak.log文件中。如下图:

微信截图_20200208171613.png


实现:


1.编写全量备份脚本
# vim /Server/Scripts/DBFullyBak.sh //添加以下内容

#!/bin/bash
#use mysqldump to Fully backup mysql data per week!
#Author:xiaoxiao 
#DATE:2020-02-08
#E-Mail:77368447@qq.com
#username 、password、dbname
username="root"
password="123456"
dbname="DB"
beginTime=`date +"%Y年%m月%d日 %H:%M:%S"`
#Backup Directory
bakDir=/data/mysql/backup
#Log File
logFile=/data/mysql/backup/bak.log
#Backup File
nowDate=`date +%Y%m%d`
dumpFile="${dbname}_${nowDate}.sql"
gzDumpFile="${dbname}_${nowDate}.sql.tgz"
cd $bakDir
# Full Backup
/usr/bin/mysqldump -u${username} -p${password} --quick --events --databases ${dbname} --flush-logs --delete-master-logs --single-transaction>$dumpFile
#tar
/bin/tar -zvcf $gzDumpFile $dumpFile
/bin/rm $dumpFile
endTime=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$beginTime 结束:$endTime $gzDumpFile succ >> $logFile
#delete all full backup
cd $bakDir/daily
/bin/rm -f *


2.编写增量备份脚本


# vim  /Server/Scripts/DBDailyBak.sh //内容为下

#!/bin/bash
#use cp to backup mysql data everyday!
#Author:xiaoxiao
#Date:2020-02-08
#E-mail:77368447@qq.com
#username password
username=root
password=123456
# 增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录
BakDir=/data/mysql/backup/daily
# 日志文件
LogFile=/data/mysql/backup/bak.log
# mysql的数据目录
BinDir=/var/lib/mysql
# mysql的index文件路径,放在数据目录下的
BinFile=/var/lib/mysql/mysql-bin.index
# 这个是用于产生新的mysql-bin.00000*文件
/usr/bin/mysqladmin -u${username} -p${password} flush-logs
Counter=`wc -l $BinFile | awk '{print $1}'`
NextNum=0
# 这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
for file in `cat $BinFile`
do
        base=`basename $file`
        NextNum=`expr $NextNum + 1`
        if [ $NextNum -eq $Counter ]
        then
                echo $base skip! >> $LogFile
        else
                dest=$BakDir/$base
                #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去
                if(test -e $dest)
                then
                        echo $base exist! >> $LogFile
                else
                        cp $BinDir/$base $BakDir
                        echo $base copying >> $LogFile
                fi
        fi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $LogFile


3.设置crontab任务,每天执行备份脚本

# crontab -l //内容为下

代码内容:



#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /Server/Scripts/DBFullyBak.sh >/dev/null 2>&1
#周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /Server/Scripts/DBDailyBak.sh >/dev/null 2>&1

脚本附件:

shell.zip


标签: shell

作者头像
南宫俊逸创始人

君子好学,自强不息~

上一篇:CentOS7.x yum 安装mariadb-10.4
下一篇:天天写order by,你知道Mysql底层执行原理吗?

发表评论