# 完全備份 (含所有庫、例程、觸發器、事件、Binlog 位置、事務一致性)
mysqldump -u root -p \
--single-transaction \
--master-data=2 \
--routines --triggers --events \
--hex-blob \
--all-databases > /backup/full_$(date +%F_%H-%M).sql
# 單庫備份
mysqldump -u root -p --single-transaction --master-data=2 --databases db_name > /backup/db_name_$(date +%F).sql
# 單表備份
mysqldump -u root -p --single-transaction --master-data=2 db_name table_name > /backup/table_name_$(date +%F).sql
# 只導出結構 (不含數據)
mysqldump -u root -p --no-data --databases db_name > /backup/structure_db_name_$(date +%F).sql
| 參數 | 作用 | 必備場景 |
|---|---|---|
--single-transaction | InnoDB 熱備核心,啟動 REPEATABLE READ 快照,無需鎖表 | InnoDB 表佔比高的生產庫 |
--master-data=2 | 輸出備份瞬間 Binlog 位置 (註釋形式),PITR 必備 | 主從架構、增量恢復 |
--routines --triggers --events | 備份存儲過程、函數、觸發器、事件調度器 | 所有生產備份 |
--hex-blob | 二進制欄位 (BLOB/BINARY) 以十六進制導出,避免編碼問題 | 含二進制欄位的表 |
--quick | 不緩存結果集直接流式輸出,減少內存佔用 (大表必備) | 大表備份 |
--lock-tables=false | 不鎖表 (配合 single-transaction),解決 MyISAM/視圖鎖表報錯 | 混合引擎/含視圖 |
--skip-lock-tables | 同 --lock-tables=false | 同上 |
--compress | 客戶端/服務端傳輸壓縮 (需雙端支援) | 跨網段備份 |
原因:表數量極多 (如 WordPress MU 數萬表),FLUSH TABLES WITH READ LOCK 耗時極長或因表損壞/權限失敗。
解決:添加 --lock-tables=false (或 --skip-lock-tables) 配合 --single-transaction,跳過表鎖,依賴 MVCC 快照一致性。
mysqldump -u root -p --single-transaction --lock-tables=false --databases huge_db > /backup/huge_db.sql
注意:若庫含 MyISAM 表,關閉鎖表將無法保證 MyISAM 表一致性。建議將 MyISAM 表轉為 InnoDB。
# 進入 MySQL 交互式
mysql -u root -p
# 執行
SOURCE /backup/full_2023-10-01.sql;
mysql -u root -p < /backup/full_2023-10-01.sql
# 指定目標庫 (備份文件含 CREATE DATABASE)
mysql -u root -p target_db < /backup/db_name.sql
mysql -u root -p --force target_db < /backup/huge.sql
# 會話級優化 (源文件頭部建議包含)
SET FOREIGN_KEY_CHECKS=0;
SET UNIQUE_CHECKS=0;
SET AUTOCOMMIT=0;
SET sql_log_bin=0; -- 不寫 Binlog,極大加速
-- 導入結束後
COMMIT;
SET FOREIGN_KEY_CHECKS=1;
SET UNIQUE_CHECKS=1;
SET AUTOCOMMIT=1;
SET sql_log_bin=1;
sed -n '/^-- Current Database: `db_name`/,/^-- Current Database: /p' full.sql | \
sed -n '/^CREATE TABLE `target_table`/,/^CREATE TABLE /p' > target_table.sql
# 手動檢查文件完整性 (以 DROP TABLE 開頭,以 UNLOCK TABLES/下一個 CREATE TABLE 結尾)
mysqldump --tables db_name target_table 重新導出 (需主庫可連);或用 mysqlbinlog 解析 Binlog 提取單表 DML (複雜)。tail -5 backup.sql 應以 -- Dump completed on ... 結尾。SELECT CHECKSUM TABLE t; 主備對比。