mysqldump --flush-logs --delete-master-logs 切換 binlog,舊增量備份自動清理my.cnf 加 log-bin)full_backup.sh#!/bin/bash
BakDir=/backup/mysql
LogFile=$BakDir/mysqlbak.log
DATE=$(date +%Y%m%d)
echo "-------------------------------------------" >> $LogFile
echo $(date +"%Y-%m-%d %H:%M:%S") >> $LogFile
cd $BakDir
DumpFile=$DATE.sql
GZDumpFile=$DATE.sql.tgz
mysqldump --quick --all-databases --flush-logs --delete-master-logs --lock-all-tables > $DumpFile
echo "Dump Done" >> $LogFile
tar czvf $GZDumpFile $DumpFile >> $LogFile 2>&1
echo "[$GZDumpFile] Backup Success!" >> $LogFile
rm -f $DumpFile
# 清理舊增量備份
rm -f $BakDir/daily/*
echo "Backup Done! Please copy to remote storage."
incr_backup.sh#!/bin/bash
/usr/bin/mysqladmin flush-logs
DATADIR=/var/lib/mysql
BAKDIR=/backup/mysql/daily
HOSTNAME=$(uname -n)
cd $DATADIR
FILELIST=$(cat $HOSTNAME-bin.index)
COUNTER=0
for f in $FILELIST; do COUNTER=$((COUNTER+1)); done
NextNum=0
for f in $FILELIST; do
base=$(basename $f)
NextNum=$((NextNum+1))
if [ $NextNum -eq $COUNTER ]; then
echo "skip latest $base"
else
dest=$BAKDIR/$base
if [ -e $dest ]; then
echo "skip exist $base"
else
echo "copying $base"
cp $base $BAKDIR
fi
fi
done
echo "backup mysql binlog ok"
在 /root/.my.cnf(權限 600)配置帳密:
[mysqladmin]
user=root
password=yourpass
[mysqldump]
user=root
password=yourpass
crontab -e 設置:
0 3 * * 0 /path/full_backup.sh # 每周日全量
0 3 * * 1-6 /path/incr_backup.sh # 周一至六增量
--delete-master-logs 會刪除已備份的 binlog,請確認從庫已同步flush-logs 產生新文件,備份舊文件