mysqldump 作為 MySQL 生態系統中最基礎、最重要的邏輯備份工具,幾乎是每位 DBA 與開發人員的必修課。它能將資料庫結構(CREATE DATABASE/TABLE)、資料(INSERT)、存儲過程、觸發器、事件等導出為可執行的 SQL 腳本。本文將從參數分類、預設值解讀、核心場景實戰三個維度,構建完整的 mysqldump 知識體系。
mysqldump 擁有超過 100 個參數,按功能可歸納為六大類:
-h/-P/-u/-p、--protocol、--ssl* 等-A/--all-databases、-B/--databases、--tables、--ignore-table、-w/--where-d/--no-data、-t/--no-create-info、-n/--no-create-db、-R/--routines、-E/--events、--triggers--compact、--compatible、-c/--complete-insert、-e/--extended-insert、--fields-terminated-by、--tab--single-transaction、--lock-tables、--lock-all-tables、--master-data、--flush-logs-q/--quick、--max-allowed-packet、--net-buffer-length、-C/--compress執行 mysqldump --help 可見預設值表,重點關注預設為 TRUE 的關鍵選項:
| 參數 | 預設值 | 實際行為影響 | 生產建議 |
|---|---|---|---|
--add-drop-table | TRUE | 建表前加 DROP TABLE IF EXISTS | 還原時防衝突,通常保留 |
--add-locks | TRUE | INSERT 前後加 LOCK/UNLOCK TABLES | 加速導入,但會阻塞讀寫 |
--extended-insert | TRUE | 多行合併為單條 INSERT | 大幅提升導入速度,建議保留 |
--lock-tables | TRUE | 備份期間鎖定所有表 | InnoDB 必須關閉,改用 --single-transaction |
--quick | TRUE | 流式輸出,不緩存結果集 | 大表必須保留,防 OOM |
--disable-keys | TRUE | 導入前禁用索引,導入後重建 | MyISAM 有效,InnoDB 無效 |
--set-charset | TRUE | 輸出 SET NAMES utf8 | 建議改 utf8mb4 避免 Emoji 問題 |
關鍵洞察:預設參數組合 --opt(等同上述多項)雖然通用,但 InnoDB 環境下 --lock-tables 是效能殺手,必須顯式關閉。
# 單庫單表:結構+資料
mysqldump -h192.168.1.20 -uxxx -p -P3057 db1 tb1 > tb1.sql
# 單庫多表
mysqldump -uxxx -p db1 tb1 tb2 > tb1_tb2.sql
# 僅結構(不含資料)
mysqldump -uxxx -p --no-data db1 tb1 > tb1_struct.sql
# 僅資料(不含結構)— 需配合 --no-create-db --no-create-info
mysqldump -uxxx -p --no-create-db --no-create-info --databases db1 > db1_data.sql
mysqldump -uxxx -pxxx \
--single-transaction \
--master-data=2 \
--flush-logs \
--routines \
--triggers \
--events \
--databases db1 > db1_full.sql
參數組合邏輯解析:
--single-transaction:InnoDB 一致性快照,**自動關閉 --lock-tables**--master-data=2:輸出二進制日誌位置(註釋形式),**隱式開啟短暫全局讀鎖**--flush-logs:配合 --master-data 確保日誌刷新與位置記錄在同一時間點--skip-events),避免雙主觸發器衝突| 場景 | 命令範例 | 關鍵參數說明 |
|---|---|---|
| 跨版本遷移(MySQL 5.7 → 8.0) | --compatible=mysql80 --default-character-set=utf8mb4 | 相容模式 + 字符集顯式指定 |
| 大表並行導出 | --where="id BETWEEN 1 AND 1000000" 分批次 | 配合應用層並行,需主鍵連續 |
| 導出 CSV 給數據分析 | -T /tmp/out --fields-terminated-by=',' --fields-enclosed-by='"' | 需 secure_file_priv 允許路徑 |
| 僅導出存儲過程/函數 | -R --no-create-db --no-create-info --no-data --databases db1 | 排除表結構與資料 |
三大互斥鎖選項的關係決定了備份的一致性等級與業務影響:
--lock-tables(預設開啟):對每個庫加 READ LOCAL 鎖,MyISAM 可並發插入,InnoDB 完全阻塞寫入--single-transaction:啟動 REPEATABLE READ 事務,**不加表鎖**,依賴 MVCC 實現一致性視圖,**僅支援 InnoDB**--lock-all-tables:全局 FLUSH TABLES WITH READ LOCK,**阻塞所有寫入**,關閉前兩者核心結論:InnoDB 獨佔環境,--single-transaction 是唯一正解;混合引擎或需精確 Binlog 位置時,需權衡 --master-data 帶來的短暫全局鎖影響。
utf8 實為 utf8mb3,**強制指定 --default-character-set=utf8mb4**--max-allowed-packet 客戶端與伺服端需一致,建議 1G 起步--set-gtid-purged=AUTO 可能導致從庫報錯,建議顯式 OFF 或 ONmysql 系統庫時必加 --flush-privileges-C 或管道 | gzipmysqldump --no-data --routines ... | head -20 檢查結構完整性精通 mysqldump 不僅是記住參數,更是理解其背後的鎖機制、一致性模型與版本差異。將本文範本內化為標準化操作手冊,是每位 MySQL 從業者邁向專業 DBA 的關鍵一步。