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