[mysqld]
log-bin
重啟服務生效。FLUSH LOGS 會切換新日誌檔,舊檔歸檔,配合 --delete-master-logs 可自動清理已備份日誌。
mysql_full_backup.sh#!/bin/sh
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
# --quick 逐行輸出 --all-databases 全庫 --flush-logs 切換日誌 --delete-master-logs 刪除已備份日誌 --lock-all-tables 全域鎖表
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
# 清理增量備份目錄(全備後增量歸零)
cd $BakDir/daily
rm -f *
echo "Backup Done! Please check $BakDir"
ls -al $BakDir
mysql_inc_backup.sh#!/bin/sh
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
NextNum=$((NextNum+1))
if [ $NextNum -eq $COUNTER ]; then
echo "skip latest $f"
else
dest=$BAKDIR/$(basename $f)
if [ -e $dest ]; then
echo "skip exist $f"
else
cp $f $dest
echo "copied $f"
fi
fi
done
echo "backup mysql binlog ok"
/root/.my.cnf 存放帳密(chmod 600):[mysqladmin]
user=root
password=你的密碼
[mysqldump]
user=root
password=你的密碼
crontab:0 3 * * 0 /path/mysql_full_backup.sh0 3 * * 1-6 /path/mysql_inc_backup.sh腳本未含遠端傳輸(scp/rsync/FTP)與舊備份刪除邏輯,請依實際需求自行擴充。