生產級 MySQL 備份三要素:**自動化、壓縮、留存策略**。本文提供 Ubuntu Server 下完整 Shell 腳本:mysqldump 熱備份 → gzip 壓縮 → 日期命名 → cron 定時執行 → 超期自動清理,可直接落地生產。
DB_NAME)--single-transaction InnoDB 熱備不鎖表--routines --triggers --events 完整導出對象gzip 壓縮,節省 70%+ 空間mysqldata_bak_YYYY_MM_DD.tar.gzDAYS)chown,便於異地同步
#!/bin/bash
# MySQL 每日自動備份腳本
# 部署路徑:/home/mysql_data/mysql_databak.sh
# 執行權限:chmod +x /home/mysql_data/mysql_databak.sh
# 定時任務:45 22 * * * root /home/mysql_data/mysql_databak.sh
DUMP=/usr/bin/mysqldump # mysqldump 路徑
OUT_DIR=/home/mysql_data # 備份存放目錄
LINUX_USER=root # 文件屬主用戶
DB_NAME=pw85 # 目標資料庫
DB_USER=root # 資料庫用戶(非 root 需加 --skip-lock-tables)
DB_PASS=123456 # 資料庫密碼
DAYS=7 # 保留天數
cd "$OUT_DIR" || exit 1
DATE=$(date +%Y_%m_%d)
OUT_SQL="${DATE}.sql"
TAR_SQL="mysqldata_bak_${DATE}.tar.gz"
# 1. 熱備份 + 導出 SQL
"$DUMP" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" \
--default-character-set=utf8mb4 \
--opt -Q -R --skip-lock-tables \
--single-transaction \
--routines --triggers --events \
> "$OUT_SQL"
# 2. 壓縮
tar -czf "$TAR_SQL" "./$OUT_SQL"
# 3. 清理中間 SQL
rm -f "$OUT_SQL"
# 4. 修正文件屬主
chown "$LINUX_USER:$LINUX_USER" "$OUT_DIR/$TAR_SQL"
# 5. 清理超期備份(7天前)
find "$OUT_DIR" -name "mysqldata_bak_*" -type f -mtime +"$DAYS" -exec rm -f {} \;
echo "[$(date)] Backup completed: $TAR_SQL"
mkdir -p /home/mysql_datanano /home/mysql_data/mysql_databak.sh 貼上內容,Ctrl+O 存檔,Ctrl+X 退出chmod +x /home/mysql_data/mysql_databak.sh/home/mysql_data/mysql_databak.sh,確認生成 .tar.gz 且可解壓導入cron:
nano /etc/crontab
# 添加:每天 22:45 執行
45 22 * * * root /home/mysql_data/mysql_databak.sh
systemctl restart cron / service cron restartsystemctl enable cron
# 1. 解壓
tar -zxvf mysqldata_bak_2024_01_15.tar.gz
# 2. 導入
mysql -u root -p dbname < 2024_01_15.sql
# 或單庫導入(含建庫)
mysql -u root -p < 2024_01_15.sql
rsync -avz /home/mysql_data/ user@backup-server:/remote/backup/gpg --symmetric --cipher-algo AES256 mysqldata_bak_*.tar.gzDB_LIST=("db1" "db2") 迴圈處理curl -X POST "https://webhook/alert" -d "status=$?"xtrabackup 物理全備,工作日邏輯增備「備份未恢復等於沒備份」,定期演練恢復流程,才是高可用的基石。