mysql备份

mysqldump逻辑备份

每周一凌晨3点全量备份,每周二到周日增量备份

全量备份

#!/bin/bash
 
today=`date +%Y%m%d` #当前的年月日(如20230209,2023年2月9日)
 
whichday=`date -d $today +%w`  #今天是星期几(如果2月9号是星期四)
 
monday=`date -d "$today -$[${whichday}-1] days" +%Y%m%d`  #这周一是几号(如20230206,2023年2月6日)
 
Date=$monday  
 
BakDir=/home/mysql/backup/$Date
 
LogFile=/home/mysql/backup/bak.log
 
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
 
if [ ! -d $BakDir ];then
 
  mkdir -p $BakDir && mkdir -p $BakDir/daily
 
fi
 
cd $BakDir
 
DumpFile=$Date.sql
 
GZDumpFile=$Date.sql.tgz
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
 
mysqldump -uroot -p123 --quick --events --databases litemall  --flush-logs --delete-master-logs --single-transaction > $DumpFile



if [ $? -eq 0 ];then   #如果mysqldump备份成功,$?应该是0

	tar -zvcf $GZDumpFile $DumpFile
	rm -f  $DumpFile
	echo "***********$GZDUMPFILE******************"         
	echo "***********${today}全量备份成功******************"  
	echo 开始全量备份:$Begin 结束:$Last $GZDumpFile 结果:成功 >> $LogFile
else
	rm -f $DumpFile
	echo "***********${today}全量备份失败******************"  
	echo 开始全量备份:$Begin 结束:$Last 结果:成功  >> $LogFile
	exit 1
fi

 

# 删除增量
#if [ -d "/data/backup/increment" ];then
	#rm -f /data/backup/increment/* 
#fi

如果备份多个数据库那么:

mysqldump -u root -p --databases mysql stady > /opt/mysql-stady.sql

增量备份

#!/bin/bash
 
 
today=`date +%Y%m%d`
 
whichday=`date -d $today +%w`
 
monday=`date -d "$today -$[${whichday}-1] days" +%Y%m%d`
 
Date=$monday
 
BakDir=/home/mysql/backup/$Date/daily  #                   //增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录
 
BinDir=/data/3306/binlog          #                        //mysql的数据目录
 
LogFile=/home/mysql/backup/bak.log
 
BinFile=$BinDir/mysql-bin.index  #         //mysql的index文件路径,放在数据目录下的
 
mysqladmin -uroot -p123 flush-logs        #这个是用于产生新的mysql-bin.00000*文件
 
Counter=`wc -l $BinFile |awk '{print $1}'`
 
NextNum=0
 
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
 
for file in `cat $BinFile`
 
do
 
    base=`basename $file`
 
      #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
 
    NextNum=`expr $NextNum + 1`
 
    if [ $NextNum -eq $Counter ]
 
      then
 
      echo $base skip! >> $LogFile
 
    else
 
      dest=$BakDir/$base
 
      if(test -e $dest)
 
      #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去
 
      then
 
      echo $base exist! >> $LogFile
 
      else
 
      echo $base copying >> $LogFile
 
      cp $BinDir/$base $BakDir
 
      echo `date +"%Y年%m月%d日 %H:%M:%S"` $base  新的增量备份 Bakup succ! >> $LogFile
 
      fi
 
    fi
 
done

设置crontab任务,执行备份脚本。先执行的是增量备份脚本,然后执行的是全量备份脚本:

[root@test-huanqiu ~]# crontab -e
 
#每个星期1凌晨3:00执行完全备份脚本
 
0 3 * * 1 /bin/bash -x /root/mysqlbackup/full_backup.sh >/dev/null 2>&1
 
#周2-7凌晨3:00做增量备份
 
0 3 * * 2-7 /bin/bash -x /root/mysqlbackup/binlog_backup.sh >/dev/null 2>&1

增量备份恢复

mysqlbinlog --no-defaults --start-datetime='18-07-03 21:56:11' --stop-datetime='18-07-03 21:56:04' mysql-bin.000003 | mysql -u root -p   #结束节点

你可能感兴趣的:(mysql,bash,linux)