mysqldump 是 MySQL 官方邏輯備份工具,將數據庫導出為可重放的 SQL 腳本。本文梳理核心參數分類、常用場景命令模板與避坑指南。
| 類別 | 參數 | 說明 |
|---|---|---|
| 連接認證 | -u, --user | 用戶名 |
-p, --password[=...] | 密碼(不建議明文,留空交互輸入) | |
-h, --host | 主機,默認 localhost | |
-P, --port | 端口,默認 3306 | |
| 輸出內容控制 | --databases, -B | 後跟多個庫名,輸出含 CREATE DATABASE,跨庫遷移必加 |
--all-databases, -A | 備份所有庫 | |
--no-create-info, -t | 僅導出數據(無 DDL) | |
--no-data, -d | 僅導出結構(無 DML) | |
--routines, -R | 包含存儲過程/函數 | |
--events, -E | 包含 Event 事件 | |
| 一致性與性能 | --single-transaction | InnoDB 熱備份核心,啟動一致性快照,配合 --quick |
--quick, -q | 流式讀取不緩存全表結果集,大表必加 | |
--master-data=[1|2] | 輸出 CHANGE MASTER TO 位置,1=註釋,2=可執行 | |
--lock-tables, -l | 鎖表備份(MyISAM),InnoDB 勿用 | |
--flush-logs, -F | 備份前切換二進制日志,配合增量備份 | |
| 格式與兼容 | --hex-blob | 二進制列用十六進制導出,避免字符集亂碼 |
--default-character-set | 指定連接字符集,建議 utf8mb4 | |
--compatible=mysql40 | 兼容舊版本語法 | |
--skip-comments | 去除版本註釋,減小文件體積 | |
| 文本導出 | -T, --tab=path | 導出 .sql (DDL) + .txt (數據) 分離文件,需 FILE 權限 |
--fields-terminated-by=, | 字段分隔符 | |
--lines-terminated-by=\n | 行分隔符 |
# 1. 生產庫全量熱備份(InnoDB,含位置、事件、觸發器,流式讀取) mysqldump -u backup_user -p -h 10.0.0.1 \ --all-databases --events --routines --triggers \ --single-transaction --quick --master-data=2 \ --hex-blob --default-character-set=utf8mb4 \ > full_$(date +%F_%H-%M).sql # 2. 單庫遷移(含建庫語句,目標端可直接 source) mysqldump -u root -p --databases mydb \ --single-transaction --quick --master-data=2 \ --hex-blob > mydb_migrate_$(date +%F).sql # 3. 只導結構(審計/評審用) mysqldump -u root -p -d --databases mydb > mydb_schema.sql # 4. 只導數據(同結構實例同步) mysqldump -u root -p -t --databases mydb > mydb_data.sql # 5. 導出純文本供 LOAD DATA / 異構導入 mysqldump -u root -p -T /data/export --databases mydb \ --fields-terminated-by=, --fields-enclosed-by=\" \ --lines-terminated-by=\r\n
--databases:導出文件無 CREATE DATABASE,目標端需手動建庫再導入,否則報 ERROR 1046 (3D000): No database selected。--quick:客戶端緩存全表結果集導致 OOM,必加 --quick 或 --single-transaction(隱含 quick)。--default-character-set=utf8mb4,目標庫建庫同字符集。--master-data 衝突:GTID 複制環境下 --master-data 可能導致從庫報錯,改用 --set-gtid-purged=OFF 或不加該參數。--compatible=mysql56 或手動調整語法(如 utf8mb4_0900_ai_ci → utf8mb4_general_ci)。# 1. 語法檢查 mysql -u root -p --dry-run < backup.sql # 2. 實際導入(建議事務包裹) mysql -u root -p -e "SET autocommit=0; SOURCE backup.sql; COMMIT;" # 3. 核心表行數對比 mysql -u root -p -e "SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='mydb';"