利用系統 crontab 實現 MySQL 定時備份,提供**物理備份 (tar datadir)** 與**邏輯備份 (mysqldump)** 兩種模式,按業務 RTO/RPO 選擇。
# 1. 創建備份腳本 /usr/sbin/bak_mysql_physical.sh
cat > /usr/sbin/bak_mysql_physical.sh <<'EOF'
#!/bin/bash
set -euo pipefail
DATE=$(date +%Y%m%d)
BAK_DIR="/mysqlbackup"
DATADIR="/var/lib/mysql" # 確認實際 datadir
mkdir -p "${BAK_DIR}"
# 可選:只讀鎖定 (InnoDB 熱備無需停機,但需確保一致性)
# mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;"
# systemctl stop mysql # 純物理冷備最簡單
tar czf "${BAK_DIR}/mysql_${DATE}.tar.gz" -C / "${DATADIR#/}"
# mysql -u root -p -e "UNLOCK TABLES;"
# systemctl start mysql
echo "[$(date)] Physical backup done: ${BAK_DIR}/mysql_${DATE}.tar.gz"
EOF
chmod +x /usr/sbin/bak_mysql_physical.sh
# 2. 加入 crontab (每日 03:01)
echo "1 3 * * * root /usr/sbin/bak_mysql_physical.sh" >> /etc/crontab
systemctl restart crond
# 1. 創建備份腳本 /usr/sbin/bak_mysql_logical.sh
cat > /usr/sbin/bak_mysql_logical.sh <<'EOF'
#!/bin/bash
set -euo pipefail
DATE=$(date +%Y%m%d)
BAK_DIR="/mysqlbackup"
mkdir -p "${BAK_DIR}"
mysqldump --single-transaction --master-data=2 \
--routines --triggers --events --hex-blob --quick \
--all-databases -u root -p'PASSWORD' | \
gzip > "${BAK_DIR}/mysql_${DATE}.sql.gz"
echo "[$(date)] Logical backup done: ${BAK_DIR}/mysql_${DATE}.sql.gz"
EOF
chmod +x /usr/sbin/bak_mysql_logical.sh
# 2. 加入 crontab (每日 03:00)
echo "0 3 * * * root /usr/sbin/bak_mysql_logical.sh" >> /etc/crontab
systemctl restart crond
| 維度 | 物理備份 (tar) | 邏輯備份 (mysqldump) |
|---|---|---|
| 備份速度 | 極快 (磁盤順序讀) | 較慢 (SQL 解析、轉換) |
| 恢復速度 | 極快 (直接解壓覆蓋) | 較慢 (SQL 重放) |
| 服務影響 | 需停機/只讀鎖 | 無影響 (--single-transaction) |
| 跨版本/異構 | 不支持 | 完美支持 |
| 文件大小 | 含索引/碎片,較大 | 僅數據,壓縮後極小 |
| 適用場景 | 大庫 (TB)、維護窗口充足、同版本遷移 | 中小庫、7x24 無停機、異構遷移、審計歸檔 |