mysqldump 是 MySQL 官方邏輯備份工具,支援全庫/單表/結構/數據/WHERE 條件過濾、壓縮、遠程傳輸等豐富功能。本文系統整理核心參數、常用場景範例、效能優化選項、導入還原策略,以及 SELECT INTO OUTFILE 替代方案對比。
mysqldump [OPTIONS] database [tables] mysqldump [OPTIONS] --databases db1 [db2...] mysqldump [OPTIONS] --all-databases
| 參數 | 作用 | 推薦場景 |
|---|---|---|
-u, --user | 用戶名 | 必填 |
-p, --password | 密碼(建議不帶值,交互輸入) | 必填 |
-h, --host | 主機地址 | 遠程備份 |
-P, --port | 端口 | 非 3306 |
--single-transaction | InnoDB 一致性備份(啟動事務+快照) | 線上熱備份必加 |
--master-data=2 | 輸出 CHANGE MASTER 註釋(binlog 位置) | 主從搭建 |
--flush-logs | 備份前切割 binlog | 配合主從 |
--routines | 備份存儲過程/函數 | 完整備份 |
--triggers | 備份觸發器 | 完整備份 |
--events | 備份事件調度器 | 完整備份 |
--hex-blob | 二進制欄位用十六進制導出 | 含 BLOB/BINARY |
--quick, -q | 流式讀取,不緩存整個結果集 | 大表必加 |
--opt | 啟用一組優化選項(含 --quick, --add-drop-table 等) | 預設開啟 |
--no-data, -d | 僅導出結構(DDL) | 遷移結構 |
--no-create-info, -t | 僅導出數據(INSERT) | 數據遷移 |
--add-drop-table | 每個 CREATE TABLE 前加 DROP TABLE IF EXISTS | 重複導入安全 |
--complete-insert, -c | INSERT 含欄位名 | 跨版本/異構導入 |
--where | 過濾條件 | 增量/分片導出 |
--tab=path | 導出兩檔:.sql(DDL) + .txt(數據,可指定分隔符) | 大量數據載入 |
--fields-terminated-by=, | 數據檔分隔符(配合 --tab) | CSV 匯入 |
--compress | 客戶端/服務端壓縮傳輸 | 跨網段備份 |
mysqldump -u root -p --single-transaction --master-data=2 --routines --triggers --events --hex-blob --quick \ my_database | gzip > my_database_$(date +%F_%H%M).sql.gz
mysqldump -u root -p --single-transaction my_database my_table > my_table.sql
mysqldump -u root -p --no-data --add-drop-table my_database > schema.sql
mysqldump -u root -p --no-create-info my_database > data.sql
mysqldump -u root -p --where="created_at > '2024-01-01'" my_database orders > orders_2024.sql
mysqldump -u root -p --tab=/tmp/export --no-create-info --fields-terminated-by=, my_database orders
產生 /tmp/export/orders.txt(CSV)與 /tmp/export/orders.sql(DDL)。
mysqldump -h host1 -u root -p --single-transaction db1 | mysql -h host2 -u root -p db2
mysql -u root -p db_name < backup.sql
gunzip < backup.sql.gz | mysql -u root -p db_name
# 使用 sed/awk 分割,或工具 pt-fifo-split # 或在導入時關閉自動提交、唯一檢查、外鍵檢查 mysql -u root -p db_name -e "SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; SOURCE backup.sql; COMMIT; SET unique_checks=1; SET foreign_key_checks=1; SET autocommit=1;"
--quick(預設 --opt 已含),避免客戶端 OOM。--single-transaction,保證一致性不鎖表。gzip 管道,節省磁碟 I/O 與空間。--complete-insert、--hex-blob、--compatible=mysql40 等相容選項。適用於「無需 DDL、需高效導出文本、支援 JOIN 複雜查詢」場景:
SELECT * INTO OUTFILE '/tmp/orders.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM orders WHERE order_date >= '2024-01-01';
FILE 權限,輸出目錄受 secure_file_priv 限制。LOAD DATA INFILE。mysqldump 以靈活參數組合覆蓋 95% 邏輯備份場景。生產環境請確立「每日全量 + Binlog 增量」備份策略,配合 --single-transaction --master-data=2 --quick | gzip 標準命令,並建立自動化驗證流程。大數據量遷移優先考慮 --tab + LOAD DATA 或物理備份工具(xtrabackup、mydumper)。