mkdir -p /www/mysql_backup
chown mysql:mysql /www/mysql_backup
chmod 750 /www/mysql_backup
#!/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
chmod +x /www/autobackup.sh
chown mysql:mysql /www/autobackup.sh
# 編輯系統 crontab
vim /etc/crontab
# 每日 02:30 執行 (避開業務高峰)
30 2 * * * mysql /www/autobackup.sh >> /www/mysql_backup/cron.log 2>&1
# 複製腳本到對應目錄
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 控制。
# System V
/etc/rc.d/init.d/crond restart
# systemd
systemctl restart crond
# 或 systemctl restart cron (Debian/Ubuntu)
# 備份後驗證
CHECKSUM=$(sha256sum ${FULLPATH} | cut -d' ' -f1)
echo "SHA256: ${CHECKSUM}" >> ${LOG_FILE}
# 可對比上次備份 checksum 偵測資料異常
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-transaction | InnoDB 一致性備份 (不鎖表,需可重複讀隔離級) |
--routines | 包含預存程序/函數 |
--triggers | 包含觸發器 |
--events | 包含 Event 排程任務 |
--hex-blob | 二進位欄位以十六進位匯出 (避免字元集問題) |
--opt | 啟用快速匯出優化組合 (add-drop-table, add-locks, create-options, disable-keys, extended-insert, lock-tables, quick, set-charset) |
--quick (已含於 --opt)、分庫備份、實體備份/var/log/cron、腳本 Shebang (#!/bin/bash)、環境變數 PATH