mysqldump 參數超 50 個,掌握核心 10 個即可應對 90% 場景。本文逐一解析高頻參數,並提供三種備份模式 (邏輯/熱拷貝/物理) 的生產級腳本。
| 分組 | 參數 | 作用 | 建議 |
|---|---|---|---|
| 輸出格式 | --add-drop-table | CREATE 前加 DROP | 覆蓋恢復必加 |
--add-locks | 每表加 LOCK/UNLOCK | 加速導入,默認開啟 | |
--extended-insert | 多行 INSERT | 默認開啟,保持 | |
--complete-insert (-c) | 帶列名 INSERT | 跨版本/異構遷移加上 | |
| 一致性/鎖 | --single-transaction | InnoDB 熱備 (快照隔離) | **InnoDB 生產必加** |
--lock-tables | 鎖定所有表 (MyISAM 需要) | 混合引擎場景 | |
--lock-all-tables | 全局讀鎖 (FLUSH TABLES WITH READ LOCK) | 獲取一致位點,配合 --master-data | |
| 性能/內存 | --quick (-q) | 流式讀取,不緩存結果集 | **大表必加,防 OOM** |
--opt | 綁定 --quick --add-drop-table --add-locks --extended-insert --lock-tables | **最常用組合,等價推薦** | |
--compress (-C) | 客戶端/服務端壓縮傳輸 | 跨網絡備份加上 | |
| 過濾/選擇 | --no-create-info (-t) | 只導數據,無 CREATE TABLE | 增量數據同步 |
--no-data (-d) | 只導結構,無數據 | Schema 遷移、代碼審查 | |
--where='cond' | 按條件導出 | 分片導出、歷史數據歸檔 | |
--tables tbl1 tbl2 | 指定表 | 單表/少數表備份 | |
| 主從/GTID | --master-data=2 | 輸出 CHANGE MASTER 註釋 (位點) | 搭建從庫、PITR 必加 |
--set-gtid-purged=OFF | 不輸出 GTID 集合 | 異構遷移、避免 GTID 污染 | |
--dump-slave=2 | 從庫備份時記錄主庫位點 | 從庫作為備份源 |
mysqldump --opt --single-transaction --master-data=2 \
--routines --triggers --events --hex-blob \
--all-databases | gzip > full_$(date +%F).sql.gz
#!/bin/bash
systemctl stop mysql
tar czf /backup/mysql_physical_$(date +%F).tar.gz /var/lib/mysql
systemctl start mysql
⚠️ 需停機,僅適用維護窗口、純 MyISAM/只讀實例。
mysqlhotcopy -u root -p db_name /backup/mysqlhotcopy_$(date +%F)
tar czf /backup/mysqlhotcopy_$(date +%F).tar.gz /backup/mysqlhotcopy_$(date +%F)
⚠️ **已棄用 (MySQL 5.7 移除)**,InnoDB 不支持,勿用於新架構。
#!/bin/bash
# /usr/local/bin/backup_mysql_daily.sh
set -euo pipefail
DB_USER="backup"
DB_PASS_FILE="/root/.my_backup.cnf" # [client] password=xxx
BACKUP_DIR="/backup/mysql"
RETENTION=5
mkdir -p "${BACKUP_DIR}"
FILE="${BACKUP_DIR}/full_$(date +%F).sql.gz"
mysqldump --defaults-extra-file="${DB_PASS_FILE}" \
--opt --single-transaction --master-data=2 \
--routines --triggers --events --hex-blob \
--all-databases | gzip > "${FILE}"
if [[ ${PIPESTATUS[0]} -eq 0 ]]; then
echo "[$(date)] SUCCESS: ${FILE}"
find "${BACKUP_DIR}" -name "full_*.sql.gz" -mtime +${RETENTION} -delete
else
echo "[$(date)] FAILED" >&2
exit 1
fi
# crontab -e (root)
0 2 * * * /usr/local/bin/backup_mysql_daily.sh >> /var/log/mysql_backup.log 2>&1
stat -c%s file.gz 對比歷史均值 ±50%。sha256sum file.gz >> checksums.log。**核心原則**:邏輯備份用 --opt --single-transaction --master-data=2,物理備份用 XtraBackup,腳本化、校驗、演練、異地存儲,四件套缺一不可。