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

Linux 系統下 MySQL 自動備份腳本實戰 (全量 + 增量 + 定時清理)

     編輯:MySQL 綜合教學

Linux 系統下 MySQL 自動備份腳本實戰 (全量 + 增量 + 定時清理)

基礎版:單庫每日全量備份


# 1. 創建目錄
mkdir -p /backup/mysqlbackup

# 2. 編寫腳本 /backup/mysqlautobackup.sh
#!/bin/bash
FILENAME=$(date +%Y%m%d)
/usr/local/mysql/bin/mysqldump --opt 數據庫名 -u用戶名 -p密碼 | gzip > /backup/mysqlbackup/db_${FILENAME}.sql.gz

# 3. 賦權並加入 crontab
chmod +x /backup/mysqlautobackup.sh
crontab -e
# 每天 01:01 執行
01 01 * * * /bin/bash /backup/mysqlautobackup.sh

# 4. 重啟 cron
/etc/init.d/crond restart

注意:-u 與用戶名、-p 與密碼之間無空格。

進階版:生產級全量備份腳本 (含日志、舊備份清理)


#!/bin/bash
# 全量備份腳本 qbk.sh
scriptsDir=/usr/sbin
user=root; userPWD="你的密碼"
database="目標庫"
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.gz
mysqldump --flush-logs -u$user -p$userPWD --quick $database | gzip > $DumpFile

echo "Dump Done" >> $LogFile
echo "[$DumpFile] Backup Success!" >> $LogFile

# 清理 35 天前的每日備份
dailyDir=${bakDir}/daily_backup
find $dailyDir -name "daily*" -type f -mtime +35 -exec rm {} \;

進階版:增量備份腳本 (基於 Binlog)


#!/bin/bash
# 增量備份腳本 zbk.sh
user=root; userPWD="密碼"; database="目標庫"
mysqlBinDir=/usr/local/mysql/bin
mysqlDataDir=/usr/local/mysql/var
dailyDir=/backup/mysql/daily_backup
DATE=$(date +%Y%m%d)
logFile=${dailyDir}/mysql${DATE}.log

# 1. 刷新日志,產生新 binlog 文件
${mysqlBinDir}/mysqladmin -u$user -p$userPWD flush-logs

# 2. 刪除 3 天前的 binlog (PURGE MASTER LOGS)
TIME=$(date -d "3 day ago" +%Y%m%d%H%M%S)
mysql -u$user -p$userPWD -e "PURGE MASTER LOGS BEFORE '${TIME}'"

# 3. 讀取索引文件獲取 binlog 列表
filename=$(cat ${mysqlDataDir}/mysql-bin.index | awk -F'/' '{print $2}')

# 4. 導出 1 天前至今的增量 SQL
StartTime=$(date -d "1 day ago" +"%Y-%m-%d %H:%M:%S")
for i in $filename; do
    ${mysqlBinDir}/mysqlbinlog -u$user -p$userPWD -d $database --start-datetime="${StartTime}" ${mysqlDataDir}/$i | gzip >> ${dailyDir}/daily${DATE}.sql.gz
done

# 5. 清理 32 天前的增量備份
find $dailyDir -name "*.gz" -type f -mtime +32 -exec rm {} \;

關鍵點總結

  • 全量備份:mysqldump --flush-logs 確保備份一致性並產生新 binlog 切分點。
  • 增量備份:依賴 ROW 格式 binlog,配合 mysqlbinlog --start-datetime 精確提取增量。
  • 清理策略:分別對全量、增量、binlog 設置不同保留天數,防止磁盤寫滿。
  • 恢復演練:定期演練 gunzip < backup.sql.gz | mysql -u... -p... --force 恢復流程,驗證備份可用性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved