生產環境 MySQL 備份必須:自動化、壓縮、保留策略、異地存儲、可恢復驗證。本文提供生產級 Shell 腳本,部署於 Ubuntu Server,每日定時執行。
/home/mysql_data/mysql_databak.sh
#!/bin/bash
# ==========================================
# MySQL 定時備份腳本
# 功能:單庫備份 → 壓縮 → 保留最近 N 天 → 異地上傳(可選)
# ==========================================
set -euo pipefail
# ----- 配置區 -----
DUMP="/usr/bin/mysqldump" # mysqldump 路徑
OUT_DIR="/home/mysql_data" # 備份存放目錄
LINUX_USER="root" # 文件所有者
DB_NAME="pw85" # 目標數據庫
DB_USER="root" # 備份賬號(建議專用備份用戶)
DB_PASS="123456" # 密碼(建議用 ~/.my.cnf)
DAYS=7 # 保留天數
DATE=$(date '+%Y_%m_%d') # 日期後綴
OUT_SQL="${DATE}.sql" # 臨時 SQL 文件
TAR_SQL="mysqldata_bak_${DATE}.tar.gz" # 最終壓縮包
# ------------------
# 進入備份目錄
cd "$OUT_DIR"
# 1. 執行備份(關鍵參數解釋見下表)
"$DUMP" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" \
--default-character-set=utf8mb4 \
--opt \
-Q \
-R \
--skip-lock-tables \
--single-transaction \
--master-data=2 \
> "$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. 清理過期備份(保留最近 DAYS 天)
find "$OUT_DIR" -name "mysqldata_bak_*" -type f -mtime +$DAYS -delete
# 6. 可選:上傳至異地存儲(OSS/S3/FTP/SCP)
# aws s3 cp "$OUT_DIR/$TAR_SQL" s3://my-backup-bucket/mysql/
# scp "$OUT_DIR/$TAR_SQL" user@backup-server:/backups/mysql/
echo "[$(date)] Backup completed: $TAR_SQL"
| 參數 | 作用 | 建議 |
|---|---|---|
--default-character-set=utf8mb4 | 指定導出字符集,防亂碼 | 必加 |
--opt | 啟用 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset | 默認開啟 |
-Q / --quote-names | 反引號包裹標識符 | 必加 |
-R / --routines | 導出存儲過程/函數 | 必加 |
--skip-lock-tables | 不鎖表(配合 --single-transaction) | InnoDB 必加 |
--single-transaction | 啟動事務導出,保證一致性視圖(不鎖表) | InnoDB 核心參數 |
--master-data=2 | 輸出 CHANGE MASTER TO 註釋(含 binlog 位點),用於主從搭建/PITR | 建議開啟 |
--events | 導出 Event 調度器任務 | 視業務需要 |
--triggers | 導出觸發器(默認開啟) | 保持默認 |
# 1. 創建目錄與腳本
mkdir -p /home/mysql_data
cat > /home/mysql_data/mysql_databak.sh <<'EOF'
# 上述腳本內容
EOF
# 2. 賦予執行權限
chmod +x /home/mysql_data/mysql_databak.sh
# 3. 安全:將密碼移至 ~/.my.cnf(僅 root 可讀)
cat > /root/.my.cnf <
# 編輯 root crontab
sudo crontab -e
# 每天 22:45 執行備份
45 22 * * * /home/mysql_data/mysql_databak.sh >> /var/log/mysql_backup.log 2>&1
# 或使用 systemd timer(更現代、支持隨機延遲、日志管理)
# /etc/systemd/system/mysql-backup.service
# /etc/systemd/system/mysql-backup.timer
# 1. 解壓
tar -zxvf mysqldata_bak_2024_01_15.tar.gz
# 2. 創建目標庫
mysql -e "CREATE DATABASE IF NOT EXISTS pw85_restore CHARACTER SET utf8mb4;"
# 3. 導入
mysql pw85_restore < 2024_01_15.sql
# 4. 校驗
mysql -e "SELECT COUNT(*) FROM pw85_restore.core_table;"
mysql -e "CHECKSUM TABLE pw85_restore.core_table;"
--databases db1 db2、--all-databasesmydumper 多線程導出,速度提升 5-10 倍mysqlbinlog)或 Percona XtraBackup 物理增量| 等級 | 特徵 |
|---|---|
| L1 手工 | 人工執行 mysqldump,無壓縮、無保留、無驗證 |
| L2 腳本定時 | Shell + Cron,壓縮、保留、日志 |
| L3 專用工具 | mydumper/XtraBackup,並行、增量、流式、加密 |
| L4 平台化 | 集中調度、多實例、異地多副本、自動驗證、RTO/RPO 量化 |
| L5 智能化 | AI 預測故障、自動優化備份窗口、一鍵演練、合規報表 |
從 L2 起步,持續向 L4/L5 邁進,構建「備份可用、恢復可靠、審計可查」的數據保護體系。