首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Linux MySQL 自動備份腳本實戰:mysqldump + gzip 壓縮、crontab 定時執行、RedHat 目錄式排程

     編輯:MySQL 資料庫相關知識

自動備份腳本設計原則

  • ✅ 完整備份 (Schema + Data)
  • ✅ 壓縮儲存 (節省空間、加速傳輸)
  • ✅ 日期命名 (避免覆蓋、便於保留策略)
  • ✅ 錯誤處理 (非零退出碼、日誌記錄)
  • ✅ 權限最小化 (備份專用唯讀帳號)

五步驟部署流程

1. 建立備份目錄


mkdir -p /www/mysql_backup
chown mysql:mysql /www/mysql_backup
chmod 750 /www/mysql_backup

2. 編寫備份腳本 /www/autobackup.sh


#!/bin/bash
# MySQL 自動備份腳本
# 配置區 ----------------------------------------------------
MYSQL_BIN="/usr/local/mysql/bin"
DB_NAME="production_db"
DB_USER="backup_user"
DB_PASS="StrongBackupPass123!"
BACKUP_DIR="/www/mysql_backup"
PREFIX="prod_db"
RETENTION_DAYS=30
# -----------------------------------------------------------

DATE=$(date +%Y%m%d_%H%M%S)
FILENAME="${PREFIX}_${DATE}.sql.gz"
FULLPATH="${BACKUP_DIR}/${FILENAME}"
LOG_FILE="${BACKUP_DIR}/backup.log"

echo "$(date '+%Y-%m-%d %H:%M:%S') 開始備份 ${DB_NAME}" >> ${LOG_FILE}

# 執行備份並壓縮
${MYSQL_BIN}/mysqldump \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    --hex-blob \
    --opt \
    -u ${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${FULLPATH}

EXIT_CODE=$?

if [ $EXIT_CODE -eq 0 ]; then
    FILE_SIZE=$(du -h ${FULLPATH} | cut -f1)
    echo "$(date '+%Y-%m-%d %H:%M:%S') 備份成功: ${FILENAME} (${FILE_SIZE})" >> ${LOG_FILE}
    
    # 清理舊備份
    find ${BACKUP_DIR} -name "${PREFIX}_*.sql.gz" -mtime +${RETENTION_DAYS} -delete
    echo "$(date '+%Y-%m-%d %H:%M:%S') 清理 ${RETENTION_DAYS} 天前備份完成" >> ${LOG_FILE}
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') 備份失敗, 退出碼: ${EXIT_CODE}" >> ${LOG_FILE}
    # 可加入郵件/簡訊告警
fi

3. 賦予執行權限


chmod +x /www/autobackup.sh
chown mysql:mysql /www/autobackup.sh

4. 配置定時任務

標準 crontab (通用 Linux)


# 編輯系統 crontab
vim /etc/crontab

# 每日 02:30 執行 (避開業務高峰)
30 2 * * * mysql /www/autobackup.sh >> /www/mysql_backup/cron.log 2>&1

RedHat/CentOS 目錄式排程 (較簡單)


# 複製腳本到對應目錄
cp /www/autobackup.sh /etc/cron.daily/      # 每日執行 (run-parts)
# 或
cp /www/autobackup.sh /etc/cron.weekly/     # 每週執行
# 或
ln -s /www/autobackup.sh /etc/cron.daily/mysql_autobackup

RedHat run-parts 每日透過 /etc/cron.daily 腳本執行,時間由 /etc/anacrontab 控制。

5. 重啟 Cron 服務


# System V
/etc/rc.d/init.d/crond restart

# systemd
systemctl restart crond
# 或 systemctl restart cron (Debian/Ubuntu)

進階強化功能

備份驗證 (Checksum)


# 備份後驗證
CHECKSUM=$(sha256sum ${FULLPATH} | cut -d' ' -f1)
echo "SHA256: ${CHECKSUM}" >> ${LOG_FILE}
# 可對比上次備份 checksum 偵測資料異常

異地同步 (rsync over SSH)


rsync -avz --progress ${BACKUP_DIR}/ backup_user@backup_server:/remote/backup/mysql/

備份帳號最小權限


CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongBackupPass123!';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, PROCESS ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;

關鍵參數說明

mysqldump 參數作用
--single-transactionInnoDB 一致性備份 (不鎖表,需可重複讀隔離級)
--routines包含預存程序/函數
--triggers包含觸發器
--events包含 Event 排程任務
--hex-blob二進位欄位以十六進位匯出 (避免字元集問題)
--opt啟用快速匯出優化組合 (add-drop-table, add-locks, create-options, disable-keys, extended-insert, lock-tables, quick, set-charset)

常見問題排查

  • 權限拒絕:確認腳本擁有者/執行權限、MySQL 帳號密碼正確
  • 磁碟空間不足:監控備份目錄使用率、調整保留天數
  • 備份耗時過長:考慮 --quick (已含於 --opt)、分庫備份、實體備份
  • Cron 未執行:檢查 /var/log/cron、腳本 Shebang (#!/bin/bash)、環境變數 PATH
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved