重要提示:mysqlhotcopy 是 Perl 腳本,**僅支援 MyISAM/Aria 引擎**,且已在 MySQL 5.7 中棄用、8.0 移除。現代 InnoDB 為主的生產環境,請使用 Percona XtraBackup(物理熱備)或 mydumper(邏輯並行備份)。本文僅供維護舊版 MyISAM 系統參考。
| 維度 | mysqlhotcopy | mysqldump |
|---|---|---|
| 本質 | 檔案層級 COPY (FLUSH TABLES + LOCK + cp) | SQL 語句集合 (SELECT ... INTO OUTFILE / INSERT) |
| 引擎支援 | MyISAM、Aria、MEMORY | 所有引擎 |
| 執行位置 | 必須在資料庫伺服器本機 | 可遠端客戶端執行 |
| 鎖定方式 | LOCK TABLES ... READ (全域讀鎖) | --single-transaction (InnoDB 無鎖) / LOCK TABLES |
| 還原方式 | 直接複製檔案覆蓋 datadir | SOURCE / mysql < backup.sql |
| 速度 | 極快(IO 限制) | 較慢(解析/執行 SQL) |
| 跨版本/架構 | 不支援 | 支援 |
# 1. Perl DBD::MySQL 模組
yum install perl-DBD-MySQL -y
# 或 cpanm DBD::mysql
# 2. 專用備份帳號(最小權限)
mysql> GRANT SELECT, RELOAD, LOCK TABLES ON *.* TO 'hotcopyer'@'localhost' IDENTIFIED BY 'StrongPass123!';
mysql> FLUSH PRIVILEGES;
# 3. 配置檔 ~/.my.cnf 或 /etc/my.cnf
[mysqlhotcopy]
user=hotcopyer
password=StrongPass123!
port=3306
socket=/var/lib/mysql/mysql.sock
mysqlhotcopy db_name db_name_backup
# 輸出範例:
Locked 10 tables in 0 seconds.
Flushed tables (`db_name`.`t1`, `db_name`.`t2`) in 0 seconds.
Copying 45 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 10 tables (45 files) in 3 seconds (3 seconds overall).
mysqlhotcopy db_name /backup/mysqlhotcopy/
# 產生 /backup/mysqlhotcopy/db_name/ 目錄
# 排除名稱含 'log' 的表
mysqlhotcopy db_name./~log/ /backup/
# 僅備份 'order_' 開頭的表
mysqlhotcopy db_name./order_/ /backup/
# 建立記錄表
CREATE DATABASE IF NOT EXISTS backup_meta;
USE backup_meta;
CREATE TABLE `checkpoint` (
`time_stamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`src` VARCHAR(64),
`dest` VARCHAR(128),
`msg` VARCHAR(255)
) ENGINE=InnoDB;
# 授權
GRANT INSERT ON backup_meta.checkpoint TO 'hotcopyer'@'localhost';
FLUSH PRIVILEGES;
# 執行備份並記錄
mysqlhotcopy db_name./~log/ --allowold --checkpoint backup_meta.checkpoint /backup/
# 首次全量
mysqlhotcopy db_name /backup/db_full --checkpoint backup_meta.checkpoint
# 後續增量(僅複製變更檔案)
mysqlhotcopy db_name /backup/db_full --allowold --addtodest --checkpoint backup_meta.checkpoint
原理:比對檔案修改時間/大小,僅複製變更的 .MYD/.MYI 檔案。
# 1. 停止 MySQL
systemctl stop mysqld
# 2. 覆蓋資料目錄(謹慎!建議先備份原目錄)
cp -r /backup/db_full/* /var/lib/mysql/db_name/
# 3. 修正權限
chown -R mysql:mysql /var/lib/mysql/db_name/
# 4. 啟動
systemctl start mysqld
| 問題 | 原因/說明 | 對策 |
|---|---|---|
| InnoDB 表報錯 | 工具不支援 InnoDB | 遷移至 XtraBackup/mydumper |
| FLUSH TABLES 等待超時 | 長事務/長查詢阻塞 | 設定 --flushlog / 低峰期執行 / kill 長查詢 |
| 磁碟空間不足 | 目標分區剩餘空間 < 資料庫大小 | 清理空間 / 掛載新磁碟 / 壓縮備份 |
| 權限不足 | 缺少 RELOAD/LOCK TABLES/SELECT | 補全授權 |
| 檔案系統不支援硬連結 | --allowold 需要硬連結支援 | 避免使用 --allowold / 換檔案系統 |
| 工具 | 類型 | 引擎 | 熱備 | 並行 | 增量 | 壓縮 | 學習曲線 |
|---|---|---|---|---|---|---|---|
| XtraBackup | 物理 | InnoDB/MyISAM | ✅ | ✅ | ✅ | ✅ | 中 |
| mydumper/myloader | 邏輯 | 所有 | ✅ | ✅ | ❌ | ✅ | 低 |
| mysqldump | 邏輯 | 所有 | ⚠️ (單事務) | ❌ | ❌ | ✅ (管道) | 低 |
| mysqlhotcopy | 物理 | MyISAM | ✅ | ❌ | ✅ | ❌ | 低 |
mysqlhotcopy 是 MyISAM 時代的產物,以檔案複製速度換取備份效能,但受限於引擎、架構、版本。現代 MySQL 生產環境以 InnoDB 為主,**XtraBackup(物理熱備)+ mydumper(邏輯並行導出)是標準組合**。若仍在維護 MyISAM 系統,請將遷移至 InnoDB 並升級備份工具列入技術債務清單優先處理。