mysqldump 是 MySQL 官方提供的邏輯備份工具,支援完整備份、單表備份、壓縮輸出、跨伺服器遷移等豐富功能。本文系統整理核心參數、實戰範例與效能調優技巧。
mysqldump [選項] 資料庫名稱 [資料表名稱...] > 備份檔案.sql
不指定資料表即備份整個資料庫;不指定資料庫名稱可使用 --all-databases 備份所有資料庫。
mysqldump -u root -p --default-character-set=cp932 --opt --extended-insert=false --hex-blob -R -x mysql > E:\mysql.sql
mysqldump samp_db | gzip > /usr/archives/mysql/samp_db_$(date +%F).gz
mysqldump samp_db student score event absence > gradebook.sql
mysqldump samp_db | mysql -h remote.host.com samp_db
mysqldump --add-drop-table samp_db | mysql -h remote.host.com samp_db
| 參數 | 說明 | 建議場景 |
|---|---|---|
--opt | 綜合優化選項,等同 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset | 預設開啟,大多數備份場景推薦 |
--quick, -q | 逐行輸出,不將整個結果集載入記憶體 | 大表備份必備,防止 OOM |
--extended-insert | 使用多行 INSERT 語句,預設開啟 | 提升還原速度,若遇 max_allowed_packet 限制可設為 false |
--single-transaction | 啟動交易一致性備份(僅 InnoDB/BDB) | 線上熱備份首選,不鎖表 |
--lock-tables | 鎖定當前備份的資料表(MyISAM 適用) | MyISAM 表備份確保一致性 |
--lock-all-tables, -x | 全域讀鎖定所有資料庫表 | 需全域一致性時使用,會阻塞寫入 |
--flush-logs | 備份前刷新二進制日誌 | 配合 binlog 做增量備份檢查點 |
--hex-blob | 二進制欄位以十六進制輸出 | 含 BLOB/BINARY/VARBINARY 欄位必加 |
--routines, -R | 包含預存程序與函數 | 完整備份必加 |
--triggers | 包含觸發器(預設開啟) | 完整備份保持開啟 |
--default-character-set | 指定匯出字符集 | 非 latin1 資料庫必須指定,否則亂碼 |
--disable-keys | 匯入時暫停索引更新,最後重建 | MyISAM 大量匯入大幅加速 |
--compress | 壓縮網路傳輸資料 | 跨網段遠端備份 |
--delayed-insert | 使用 INSERT DELAYED | 還原至線上資料庫減少鎖競爭 |
--no-create-info, -t | 僅匯出資料,不含 CREATE TABLE | 資料同步場景 |
--no-data, -d | 僅匯出結構,不含資料 | 結構遷移、審計 |
--compatible=name | 相容指定 MySQL 版本或其他資料庫 | 跨版本遷移、異構遷移 |
--quick 或 --opt:避免記憶體耗盡--single-transaction:不鎖表、不阻塞寫入--lock-tables:確保表級一致性--flush-logs 做增量備份基準點:binlog 位置對應備份時間點--compress:降低頻寬佔用# 完整還原
mysql -u root -p dbname < backup.sql
# 壓縮檔直接還原
gunzip < backup.sql.gz | mysql -u root -p dbname
# 指定字符集還原(防亂碼)
mysql -u root -p --default-character-set=utf8 dbname < backup.sql
--opt 會鎖表,高併發線上庫慎用,改用 --single-transaction--default-character-set