mysql二進制增量備份

最近一直在思考如何增量備份二進制日誌,這樣一來我們就可以用mysqldump +二進制全備或者利用xtrabackup+二進制備份

思想:利用mysql-bin.index,如果是第一次備份,就將mysql-bin.index中的所有文件都複製到備份目錄下,然後保存備份後二進制日誌的序號到一個文件中backbinlogpostion
        增量備份時(非第一備份),就用backbinlogpostion存的序號與當前mysql_bin.index中的比較,如果序號小於mysql-bin.index的序號,則複製該二進制文件到備份目錄

#!/bin/bash
#################################################################
#name:incrementalbackdb
#function:incremental-backup for mysql everyday
#finish-time:2015-04-02 by [email protected]
#################################################################
BinDir=/usr/local/mysql/data
BackupDir=/usr/backupyzx
BinLogFile=/usr/local/mysql/data/mysql-bin.index
BackLogPostion=0
BackupLog=${BackupDir}/backup.log
printN=
BinLogPostion=$(wc -l $BinLogFile|awk '{print $1}')
#get Binnary log sequ
LastSeqBinLog=$(basename $(tail -n 1 $BinLogFile))
LastBinLogPostion=${LastSeqBinLog##*0}
#before you backup,you should flush logs
/usr/local/mysql/bin/mysqladmin -uroot -p'tianqu' flush-logs
echo "begin increment-backup,time is:" $(date +'%Y-%m-%d %H:%M:%S') >>$BackupLog
if [ -e ${BackupDir}/backbinlogpostion  ];then
#取出backbinlogpostion中二進制的序號,例如mysql-bin.000002,保存的序號就是2
    BackLogPostion=$(cat ${BackupDir}/backbinlogpostion)
#如果當前二進制的序號與備份的二進制序號相同
    if [ ${LastBinLogPostion} -eq $BackLogPostion ];then
        echo "backup skiped,backup success!" >>${BackupLog}
    else
#取出序號的之間的差值
        printN=$((${LastBinLogPostion}-${BackLogPostion}))
        echo $printN
        q=$((${BackLogPostion}+1))
        for file in $(tail -n ${printN} ${BinLogFile});do
            basefile=$(basename ${file})
            if [ $q -ge ${LastBinLogPostion} ];then
            break;
            fi
            cp -pd ${BinDir}/${basefile} ${BackupDir}
            echo ${basefile}" is copying...">>${BackupLog}
            ((q++))
        done
    echo ${LastBinLogPostion} >${BackupDir}/backbinlogpostion
    fi
else
#如果是第一次備份,則創建backbinlogpostion,記錄當前已經複製二進制的日誌,方便第二次備份時,只備份新增的部分
    touch ${BackupDir}/backbinlogpostion
    i=1
    for file in $(cat ${BinLogFile});do
        basefile=$(basename ${file})
        if [ $i -eq ${BinLogPostion} ];then
        echo ${basefile##0} >${BackupDir}/backbinlogpostion
        fi
        if [ $i -eq $((${BinLogPostion}+1)) ];then
        break;
        fi
        cp -pd ${BinDir}/${basefile} ${BackupDir}
        echo ${basefile}" is copying...">>${BackupLog}
        ((i++))
    done
fi
echo "increment-backup finished,time is :" $(date +'%Y-%m-%d %H:%M:%S')>>$BackupLog
#Delete old file
#將當前備份的文件轉移到遠程機器,然後刪除本地的存檔
#find ${BackupDir} -type f -mtime +15 -exec rm -rf {} \;
#/usr/bin/rsync -vzrtopg --progress ${BackupDir} [email protected]::backup/backdb/ --password-file=/usr/local/etc/rsyncd.sec          
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章