mysqldump 導出篇
基礎語法
mysqldump -u user -p [options] db_name [tbl_name...] > dump.sql
# 密碼交互輸入,或 -ppassword(無空格,不安全)
核心參數速查
| 參數 | 作用 | 推薦場景 |
--opt | 啟用 quick、add-drop-table、add-locks、extended-insert、lock-tables | 常規備份(默認開啟) |
--quick/-q | 不緩存結果直接寫文件,省內存 | 大表必加 |
--no-data/-d | 僅導出結構(無 INSERT) | 遷移結構、對比 Schema |
--add-drop-table | CREATE 前加 DROP IF EXISTS | 重複導入環境 |
--extended-insert/-e | 多行 VALUES 批量 INSERT | 加速導入(默認開啟) |
--single-transaction | InnoDB 一致性快照(不鎖表) | 線上熱備份核心參數 |
--master-data=2 | 輸出 CHANGE MASTER TO 註釋(從庫搭建) | 主從構建 |
--where="cond" | 按條件導出數據 | 增量/分表/歸檔 |
--skip-lock-tables | 不鎖表(配合 single-transaction) | 高併發線上備份 |
實戰範例
# 1. 全庫熱備份(生產標配)
mysqldump -u root -p --single-transaction --master-data=2 --routines --triggers --events db_name > full_$(date +%F).sql
# 2. 單表結構
mysqldump -u root -p -d db_name tbl_name > tbl_struct.sql
# 3. 條件導出(歸檔歷史數據)
mysqldump -u root -p --where="created_at < '2023-01-01'" db_name tbl_name > archive.sql
# 4. 多表並行導出(配合 xargs)
echo "tbl1 tbl2 tbl3" | xargs -n1 -P4 -I{} mysqldump -u root -p db_name {} > {}.sql
source / mysql 導入篇
交互式導入
mysql -u root -p
USE target_db;
SOURCE /path/to/dump.sql;
非交互式導入(腳本/自動化)
# 推薦:管道導入
mysql -u root -p target_db < dump.sql
# 大文件優化參數
mysql -u root -p --max_allowed_packet=100M --net_buffer_length=1M target_db < dump.sql
導入加速技巧
-- 臨時關閉檢查(導入前執行)
SET FOREIGN_KEY_CHECKS=0;
SET UNIQUE_CHECKS=0;
SET AUTOCOMMIT=0;
SET SQL_LOG_BIN=0; -- 需 SUPER 權限
-- 導入後恢復
COMMIT;
SET FOREIGN_KEY_CHECKS=1;
SET UNIQUE_CHECKS=1;
SET AUTOCOMMIT=1;
SET SQL_LOG_BIN=1;
進階:條件導出與分庫分表
# 按 ID 範圍分片導出(分庫分表遷移)
for i in {0..9}; do
mysqldump -u root -p --where="id % 10 = $i" db_name tbl_name > tbl_part_$i.sql &
done
wait
避坑清單
- ❌ 導出含
VIEW 導入報錯 → 加 --skip-views 或手動處理
- ❌ 導出
DEFINER 導入權限不足 → sed -i 's/DEFINER=[^ ]* //g' dump.sql
- ❌ 字符集不匹配亂碼 → 導出導入同指定
--default-character-set=utf8mb4
- ❌ 大事務導入卡住 → 調大
innodb_log_file_size、max_allowed_packet