邏輯備份與恢復是 MySQL 運維核心技能。本文系統整理 mysqldump 導出參數、單庫/全庫/結構/數據分類導出、source 導入流程、大文件優化技巧及跨版本遷移注意事項。
| 參數 | 說明 | 推薦場景 |
|---|---|---|
-u root -p | 用戶名密碼 | 必填 |
--single-transaction | InnoDB 一致性快照,無鎖導出 | 生產環境必加 |
--routines | 導出存儲過程/函數 | 完整遷移必加 |
--triggers | 導出觸發器 | 完整遷移必加 |
--events | 導出定時事件 | 完整遷移必加 |
--master-data=2 | 輸出 CHANGE MASTER 註釋(binlog 位置) | 主從搭建/備份 |
--set-gtid-purged=OFF | 不輸出 GTID 集合 | 跨版本/非 GTID 環境 |
-d / --no-data | 只導結構 | Schema 遷移 |
-t / --no-create-info | 只導數據 | 數據同步 |
--where="condition" | 按條件導出部分數據 | 分表/歸檔 |
--hex-blob | 二進制列用十六進制 | 含 BLOB/BINARY 列 |
--quick | 流式讀取,不緩存全表 | 大表必加 |
--compress | 網絡傳輸壓縮 | 遠程備份 |
mysqldump -u root -p \
--single-transaction \
--routines --triggers --events \
--master-data=2 \
--set-gtid-purged=OFF \
--quick \
db_name > /backup/db_name_$(date +%F_%H%M).sql
mysqldump -u root -p \
--single-transaction --routines --triggers --events \
--all-databases > /backup/full_$(date +%F).sql
mysqldump -u root -p -d db_name > schema.sql
mysqldump -u root -p -t db_name > data.sql
# 指定表
mysqldump -u root -p db_name table1 table2 > tables.sql
# 條件導出(如歸檔 2023 年訂單)
mysqldump -u root -p db_name orders --where="YEAR(created_at) = 2023" > orders_2023.sql
mysqldump -u root -p --single-transaction db_name | gzip > db_name_$(date +%F).sql.gz
mysql -u root -p
# 進入後
CREATE DATABASE IF NOT EXISTS db_name CHARACTER SET utf8mb4;
USE db_name;
SOURCE /backup/db_name.sql;
mysql -u root -p db_name < /backup/db_name.sql
# 壓縮文件直接導入
zcat db_name.sql.gz | mysql -u root -p db_name
# 只建表
mysql -u root -p db_name < schema.sql
# 只導數據(需表已存在)
mysql -u root -p db_name < data.sql
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
SOURCE /backup/large.sql;
COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;
SET GLOBAL max_allowed_packet=1G; SET GLOBAL net_buffer_length=1M;split 將大 SQL 拆分為多個小文件並行導入(需無外鍵依賴)。LOAD DATA 比 SQL 文件快 10-20 倍。| 場景 | 風險 | 對策 |
|---|---|---|
| 5.6 → 5.7/8.0 | 系統表結構變更、sql_mode 默認嚴格、保留字變化 | 導出加 --set-gtid-purged=OFF,導入後必跑 mysql_upgrade |
| MySQL → MariaDB/Percona | 引擎參數差異、GTID 實現不同 | 只導數據 + 目標端建表,或用專用遷移工具 |
| 字符集不一致 | 亂碼、截斷 | 導出指定 --default-character-set=utf8mb4,目標庫同字符集 |
| 大表導入極慢 | 索引維護、事務日誌 | 先導結構 → 禁用二級索引 → 導數據 → 重建索引 |
邏輯備份(mysqldump)適合中小庫、跨版本、結構變更。大庫(>100GB)建議物理熱備:
# Percona XtraBackup(不阻塞寫入)
xtrabackup --backup --target-dir=/backup/full --user=root --password
# 增量備份
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full
# 恢復準備
xtrabackup --prepare --target-dir=/backup/full
# 複制回數據目錄
rsync -av /backup/full/ /data/mysql/