原理: 透過 SQL 語句重現資料結構與資料,輸出 .sql 文字檔。
| 優點 | 缺點 |
|---|---|
|
|
關鍵參數:
mysqldump --single-transaction --routines --triggers --events \
--master-data=2 --hex-blob --quick --compress \
-u backup_user -p db_name > backup_$(date +%F).sql
原理: 直接複製資料目錄(datadir)或使用 Percona XtraBackup / MySQL Enterprise Backup。
| 優點 | 缺點 |
|---|---|
|
|
XtraBackup 熱備指令:
xtrabackup --backup --target-dir=/backup/full_$(date +%F) \
--user=backup_user --password=xxx --compress --compress-threads=4
架構: Master 寫入 Binlog → Slave 透過 IO Thread 拉取 → Relay Log → SQL Thread 重放
| 優點 | 缺點/挑戰 |
|---|---|
|
|
#!/bin/bash
# mysql_backup.sh - 每日晨間 04:00 執行,保留 7 天
DB_NAME="prod_db"
DB_USER="backup_user"
DB_PASS="strong_password"
BIN_DIR="/usr/bin"
BACK_DIR="/data/backdata"
DATE=$(date +"%Y%m%d-%H%M%S")
LOGFILE="${BACK_DIR}/dbbakup.log"
BACKFILE="${BACK_DIR}/mysql-${DATE}.sql.gz"
# 確保備份目錄存在
mkdir -p "${BACK_DIR}"
# 執行備份(單一交易、壓縮、記錄二進位日誌位置)
${BIN_DIR}/mysqldump --single-transaction --routines --triggers --events \
--master-data=2 --hex-blob --quick \
-u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" | gzip > "${BACKFILE}"
# 記錄結果
if [ $? -eq 0 ]; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")] SUCCESS: ${BACKFILE}" >> "${LOGFILE}"
else
echo "[$(date +"%Y-%m-%d %H:%M:%S")] FAILED: mysqldump exited with $?" >> "${LOGFILE}"
exit 1
fi
# 清理 7 天前備份
find "${BACK_DIR}" -name "mysql-*.sql.gz" -mtime +7 -delete -print | \
while read f; do echo "[$(date +"%Y-%m-%d %H:%M:%S")] DELETED: ${f}" >> "${LOGFILE}"; done
echo "------------------------------------------------------------" >> "${LOGFILE}"
# 每日 04:00 執行備份
0 4 * * * /opt/scripts/mysql_backup.sh >/dev/null 2>&1
# 每週日 02:00 執行完整還原演練(到測試環境)
0 2 * * 0 /opt/scripts/restore_drill.sh >/dev/null 2>&1
「沒有驗證過的備份,等於沒有備份。」建議採用 分層備份策略:
📅 每日邏輯全備(跨平台遷移、審計)
⚡ 每日物理增量備份(快速還原)
🔄 即時主從複寫(高可用、讀寫分離)
☁️ 異地離線備份(勒索軟體防護、合規要求)