首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 全量與增量備份腳本實戰(基於 binlog)

     編輯:MySQL 綜合教學

備份策略設計

  • 全量備份:每 7 天一次,使用 mysqldump --flush-logs --delete-master-logs 切換 binlog,舊增量備份自動清理
  • 增量備份:每天一次,備份前一天產生的所有 binlog 文件(除最新正在寫入的)
  • 前提:必須開啟 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 產生新文件,備份舊文件
  • 生產環境必須將備份文件異地存儲(FTP/對象存儲/異地機房)
  • 定期演練恢復流程,驗證備份可用性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved