本文深入探討 mysqldump 主要工作模式,並與 mk-parallel-dump(Maatkit 工具套件)進行實測對比,為備份策略選型提供依據。
測試環境:單表 yejr,觀察各參數下的 SQL 執行序列。
-q (--quick)僅在 SELECT 加入 SQL_NO_CACHE,不鎖表、不快取結果,逐行串流輸出。
LOCK TABLES `yejr` READ /*!32311 LOCAL */;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`;
UNLOCK TABLES;
--lock-tables同上,但加 READ LOCAL LOCK,允許並發插入(MyISAM 特性),不阻塞讀取。
--lock-all-tables發起全域讀鎖(FLUSH TABLES WITH READ LOCK),阻塞所有寫入,確保跨表一致性。備份完成會話斷開自動解鎖。
FLUSH TABLES;
FLUSH TABLES WITH READ LOCK;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`;
--master-data在 --lock-all-tables 基礎上新增 SHOW MASTER STATUS,記錄二進制日誌位點,支援主從同步建立。
--single-transaction(InnoDB 推薦)設定會話隔離級別為 REPEATABLE READ,啟動事務後釋放鎖,確保一致性視圖不受其他會話提交影響。
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
UNLOCK TABLES;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`;
--single-transaction --master-data結合兩者:需短暫全域鎖獲取主庫狀態,改用 START TRANSACTION WITH CONSISTENT SNAPSHOT 替代 BEGIN,確保快照一致性。
FLUSH TABLES WITH READ LOCK;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
SHOW MASTER STATUS;
UNLOCK TABLES;
SELECT ...;
原理:WITH CONSISTENT SNAPSHOT僅在隔離級別為 REPEATABLE READ 或 SERIALIZABLE 時生效,等同START TRANSACTION+ 任意 InnoDB 表SELECT。
測試資料:單表 yejr,約 600MB+。
| 方案 | 耗時 | 輸出大小 | 系統負載 | 備註 |
|---|---|---|---|---|
| mysqldump + gzip | 10m15s | 608 MB | 峰值 13.93 | 標準單執行緒 |
| mysqldump + gzip --fast | 9m06s | 815 MB | 峰值 11.94 | 犧牲壓縮率換速度 |
| mk-parallel-dump | 6m49s | 819 MB | 峰值 13.93 | 並發導出,25 chunks |
mk-parallel-dump 透過並發顯著縮短備份窗口(快 ~30%)mysqldump --single-transactionmysqldump --single-transaction --master-data=2mk-parallel-dump 加速xtrabackup(實體備份、支援增量、不阻塞)