mysqldump 是 MySQL 官方提供的邏輯備份工具,支援全庫/單表/結構/數據靈活導出,產出標準 SQL 腳本,跨版本、跨平台遷移通用。本文系統整理核心參數、常用場景、還原方法與生產級自動化備份策略。
mysqldump [options] db_name [tbl_name ...]
mysqldump [options] --databases db_name1 [db_name2 ...]
mysqldump [options] --all-databases
| 類別 | 參數 | 作用 | 建議 |
|---|---|---|---|
| 輸出格式 | --opt | 綁定 --quick --add-drop-table --add-locks --extended-insert --lock-tables,**最推薦** | ✅ 預設開啟 |
--quick / -q | 不緩存結果集,直接流式輸出,**大表必加** | ✅ | |
--extended-insert / -e | 多行 INSERT,大幅減小檔案、加快導入 | ✅ | |
--single-transaction | InnoDB 熱備份核心:啟動事務一致性讀,無鎖表** | ✅ InnoDB 必加 | |
--master-data=2 | 輸出 Binlog 位置 (註釋行),支援增量恢復/主從搭建 | ✅ 主庫備份 | |
--hex-blob | 二進制欄位十六進制輸出,避免字符集問題 | ✅ 含 BLOB/BINARY | |
| 篩選控制 | --databases / -B | 輸出含 CREATE DATABASE、USE,跨庫遷移必備 | 按需 |
--tables | 指定表名,配合 --databases 使用 | 按需 | |
--where / -w | 導出符合條件的行,如 -w "id > 1000" | 分批導出 | |
--no-data / -d | 僅導出結構 (DDL) | 遷移 Schema | |
--no-create-info / -t | 僅導出數據 (INSERT),無建表語句 | 數據同步 | |
| 效能與鎖 | --lock-tables / -l | 鎖定所有表 (MyISAM 適用),InnoDB 用 single-transaction | MyISAM |
--lock-all-tables / -x | 全庫鎖,極度阻塞,慎用 | 極少用 | |
--flush-logs / -F | 備份前切換 Binlog,配合增量恢復 | 主庫備份 | |
--compress / -C | 客戶端-服務端壓縮傳輸,跨網路備份加速 | 遠程備份 |
mysqldump -u backup_user -p \
--single-transaction \
--master-data=2 \
--flush-logs \
--hex-blob \
--routines --triggers --events \
--databases app_db > /backup/app_db_$(date +%F_%H%M).sql
mysqldump -u user -p -d --add-drop-table app_db users > users_schema.sql
# 每 100 萬行一批
mysqldump -u user -p --quick --where="id BETWEEN 1 AND 1000000" app_db big_table > part1.sql
mysqldump -u user -p --quick --where="id BETWEEN 1000001 AND 2000000" app_db big_table > part2.sql
mysqldump -h src_host -u user -p --single-transaction --compress app_db | \
mysql -h dst_host -u user -p app_db
mysql -u root -p target_db < backup.sql
# 或進入 mysql 客戶端
SOURCE /path/backup.sql;gunzip < backup.sql.gz | mysql -u root -p target_db# 需將備份檔拆分為多個表檔案
sed -n '/^-- Table structure for table/,/^-- Table structure for table/p' backup.sql | split -l 10000 - part_
# 並行導入
ls part_* | xargs -P 8 -I {} sh -c 'mysql -u root -p target_db < {}'#!/bin/bash
# /usr/local/bin/mysql_backup.sh
set -euo pipefail
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=14
DB_USER="backup_user"
DB_PASS="$(cat /etc/mysql/backup.pass)" # 密碼文件權限 600
DATABASES="app_db log_db"
mkdir -p "$BACKUP_DIR"
DATE=$(date +%F_%H%M)
for DB in $DATABASES; do
FILE="$BACKUP_DIR/${DB}_${DATE}.sql.gz"
mysqldump -u "$DB_USER" -p"$DB_PASS" \
--single-transaction --quick --hex-blob \
--routines --triggers --events \
--master-data=2 --flush-logs \
--databases "$DB" | gzip > "$FILE"
# 驗證備份完整性
if ! gzip -t "$FILE"; then
echo "ERROR: Backup corrupted: $FILE" | mail -s "MySQL Backup Failed" admin@example.com
exit 1
fi
done
# 清理舊備份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Backup completed: $(ls -lh $BACKUP_DIR/*_${DATE}.sql.gz)"
現象:預設 --triggers 導出觸發器,但 --routines 需顯式指定。
重複導入錯誤:ERROR 1235: multiple triggers with same action time and event for one table
解決:導出時加 --triggers=false (僅導出結構/數據),或目標庫先 DROP TRIGGER。
pt-table-checksum 主從/備份一致性驗證mysqldump 雖非物理備份最快,但通用性最強、人工可讀、跨版本遷移無障礙。配合 --single-transaction、--master-data=2、壓縮、校驗、演練,構建企業級備份體系。