腳本核心功能
- 逐庫匯出(
mysqldump --opt --lock-all-tables)
- 自動排除系統庫(
information_schema、mysql、test)
- 按日期建立目錄、檔名含時間戳、
gzip 壓縮
- 僅需設定 5 個參數即可運行
關鍵參數設定
BACKUPDIR="/path/to/backup" # 備份根目錄
MUSER="backup_user" # MySQL 備份帳號
MPASS="strong_password" # 密碼
MHOST="127.0.0.1" # 主機 IP
MPORT="3306" # 埠號
完整腳本(可直接存為 mysql_backup.sh)
#!/bin/bash
NOW=$(date +"%Y-%m")
BACKUPDIR="${BACKUPDIR}/${NOW}"
MUSER="backup_user"
MPASS="strong_password"
MHOST="127.0.0.1"
MPORT="3306"
IGNOREDB="information_schema mysql test"
MYSQL=$(which mysql)
MYSQLDUMP=$(which mysqldump)
GZIP=$(which gzip)
[ ! -d "$BACKUPDIR" ] && mkdir -p "$BACKUPDIR"
DBS=$($MYSQL -u "$MUSER" -p"$MPASS" -h "$MHOST" -P "$MPORT" -Bse 'SHOW DATABASES')
NOW=$(date +"d%dH%HM%MS%S") # 日-時-分-秒
for db in $DBS; do
DUMP="yes"
for i in $IGNOREDB; do
[ "$db" = "$i" ] && DUMP="no" && break
done
if [ "$DUMP" = "yes" ]; then
FILE="${BACKUPDIR}/${NOW}-${db}.gz"
echo "BACKING UP $db"
$MYSQLDUMP --add-drop-database --opt --lock-all-tables \
-u "$MUSER" -p"$MPASS" -h "$MHOST" -P "$MPORT" "$db" \
| $GZIP > "$FILE"
fi
done
部署與自動化
chmod a+x mysql_backup.sh
- 手動測試:
./mysql_backup.sh
- 加入 crontab 每日備份:
crontab -e → @daily /path/to/mysql_backup.sh
進階強化建議
- 加密:管線接
openssl enc -aes-256-cbc -k "key"
- 異地備份:
rsync 或 scp 推送至遠端/雲端儲存
- 保留策略:
find $BACKUPDIR -mtime +30 -delete 保留 30 天
- 監控告警:腳本回傳碼非 0 時發送郵件/Slack 通知
- 權限最小化:備份帳號僅需
SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER 權限