| 參數 | 說明 | 常用值/範例 |
|---|---|---|
-u, --user | 用戶名 | -u root |
-p, --password | 密碼(提示輸入更安全) | -p 或 -p'pwd' (無空格) |
-h, --host | 主機 | -h 127.0.0.1 |
-P, --port | 埠號 | -P 3306 |
--all-databases | 備份所有庫 | --all-databases |
--databases | 指定多個庫 | --databases db1 db2 |
--tables | 指定表(需配合單庫) | db1 --tables t1 t2 |
--no-data | 僅結構 (DDL) | --no-data |
--no-create-info | 僅資料 (DML) | --no-create-info |
--single-transaction | InnoDB 一致性備份 (不鎖表) | **生產必加** |
--master-data=2 | 記錄 Binlog 位點 (CHANGE MASTER 註解) | --master-data=2 |
--routines | 備份存儲過程/函數 | --routines |
--triggers | 備份觸發器 | --triggers |
--events | 備份事件調度器 | --events |
--hex-blob | 二進制欄位十六進制輸出 | --hex-blob |
--quick | 逐行讀取不緩衝大結果集 | --quick (預設開啟) |
--compress | 網路傳輸壓縮 | --compress |
--set-gtid-purged=OFF | 避免 GTID 污染從庫 | --set-gtid-purged=OFF |
mysqldump -u root -p \
--all-databases \
--single-transaction \
--master-data=2 \
--routines --triggers --events \
--hex-blob \
--set-gtid-purged=OFF \
> full_backup_$(date +%F_%H-%M-%S).sql
mysqldump -u root -p \
--databases mydb \
--single-transaction --master-data=2 \
--routines --triggers --events \
> mydb_$(date +%F).sql
mysqldump -u root -p \
mydb --tables users orders \
--single-transaction \
> mydb_users_orders_$(date +%F).sql
mysqldump -u root -p \
--databases mydb \
--no-data \
--routines --triggers --events \
> mydb_schema_$(date +%F).sql
mysqldump -u root -p \
--databases mydb \
--no-create-info \
--single-transaction \
> mydb_data_$(date +%F).sql
# gzip 即時壓縮
mysqldump -u root -p --all-databases --single-transaction | gzip > full_$(date +%F).sql.gz
# 解壓還原
gunzip -c full_2024-01-15.sql.gz | mysql -u root -p
mysql -u root -p < full_backup_2024-01-15.sql
mysql -u root -p -D target_db < mydb_backup.sql
# 方法一:管道直傳 (需雙向網路通暢)
mysqldump -h prod_host -u root -p --databases mydb --single-transaction | mysql -h test_host -u root -p -D mydb
# 方法二:備份檔傳輸後還原
scp mydb_backup.sql test_host:/tmp/
ssh test_host "mysql -u root -p -D mydb < /tmp/mydb_backup.sql"
/usr/local/bin/mysql_backup.sh#!/bin/bash
set -euo pipefail
# 配置區
MYSQL_USER="backup_user"
MYSQL_PASS="strong_password"
MYSQL_HOST="127.0.0.1"
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=7
COMPRESS="gzip"
LOG_FILE="/var/log/mysql_backup.log"
# 確保目錄存在
mkdir -p "$BACKUP_DIR"
# 日期變數
DATE=$(date +%F_%H-%M-%S)
FILENAME="full_backup_${DATE}.sql"
# 記錄函數
log() { echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"; }
log "=== 開始備份 ==="
# 執行備份
if mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASS" \
--all-databases \
--single-transaction \
--master-data=2 \
--routines --triggers --events \
--hex-blob \
--set-gtid-purged=OFF \
> "${BACKUP_DIR}/${FILENAME}" 2>>"$LOG_FILE"; then
log "備份檔案生成: ${FILENAME} ($(du -h "${BACKUP_DIR}/${FILENAME}" | cut -f1))"
# 壓縮
if [[ "$COMPRESS" == "gzip" ]]; then
gzip "${BACKUP_DIR}/${FILENAME}"
log "壓縮完成: ${FILENAME}.gz ($(du -h "${BACKUP_DIR}/${FILENAME}.gz" | cut -f1))"
FILENAME="${FILENAME}.gz"
fi
# 清理舊備份
find "$BACKUP_DIR" -name "full_backup_*.sql*" -mtime +$RETENTION_DAYS -delete
log "清理 ${RETENTION_DAYS} 天前備份完成"
log "=== 備份成功 ==="
else
log "!!! 備份失敗,請檢查日誌 !!!"
exit 1
fi
chmod +x /usr/local/bin/mysql_backup.sh
crontab -e
# 加入:
30 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup_cron.log 2>&1
前提:啟用 log_bin、binlog_format=ROW、expire_logs_days 足夠長。
--master-data=2 輸出註解)。mysqlbinlog --start-position=XXX --stop-position=YYY 或 FLUSH LOGS 切割後複製新 Binlog。mysqlbinlog --read-from-remote-server --raw --stop-never 即時串流備份 Binlog 至備份機。黃金法則:備份不影響主庫效能
--single-transaction 不鎖表、無主庫壓力)。log_slave_updates=ON、read_only=ON、skip_slave_start(備份前手動啟動同步)。rsync -avz /backup/mysql/ dr-host:/backup/mysql/ 或 S3/MinIO/OSS 上傳。| 坑 | 後果 | 避坑 |
|---|---|---|
未用 --single-transaction | MyISAM 表鎖表、InnoDB 一致性視圖破壞 | InnoDB 必加,MyISAM 改 --lock-all-tables |
| 密碼寫在腳本明文 | 洩露風險 | --defaults-extra-file=/etc/mysql/backup.cnf (chmod 600) |
| 備份目錄磁碟滿 | 備份中斷、損壞 | 監控磁碟、df -h 告警、預留 2 倍最大備份空間 |
| 從不測試還原 | 備份不可用 | 季度演練、自動化驗證腳本 |
| GTID 污染 | 從庫啟動報錯 | --set-gtid-purged=OFF |
| 大表備份耗時過長 | 影響業務、Binlog 過期丟失 | 分表備份、並行 mysqldump (mydumper)、或改用 XtraBackup |
mysqldump 是 MySQL 邏輯備份基石,**單一交易模式 + Binlog 位點 + 壓縮 + 自動化腳本 + 異地同步 + 季度演練** 構成最小可用備份體系。超過 50GB 單庫、極低 RTO 需求、或需即時增量,請引入 XtraBackup 物理熱備或 MyDumper 並行邏輯備份。記住:**備份的價值在於可還原,未驗證的備份等於無備份。**