mysqlhotcopy 是 Perl 腳本,利用 LOCK TABLES + FLUSH TABLES + cp/scp 實現 MyISAM 表的極速物理熱備份。本文涵蓋依賴安裝、參數詳解、正則過濾、binlog 位點記錄、增量備份腳本、與 mysqldump 深度對比。
perl-DBI, perl-DBD-MySQLxtrabackup 或 mysqldump --single-transaction
# CentOS/RHEL
yum -y install perl perl-DBI perl-DBD-MySQL
# Ubuntu/Debian
apt-get install libdbi-perl libdbd-mysql-perl
# 手動編譯 DBD::mysql (舊版)
wget https://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.050.tar.gz
tar xzf DBD-mysql-4.050.tar.gz
cd DBD-mysql-4.050
perl Makefile.PL --mysql_config=/usr/local/mysql/bin/mysql_config
make && make test && make install
| 參數 | 說明 |
|---|---|
--allowold | 目標存在時不退出,舊目錄改名加 _old |
--addtodest | 增量備份模式,新備份覆蓋舊檔 (需配合 --allowold) |
--checkpoint=db.tbl | 指定表記錄檢查點 (binlog 位點) |
--flushlog | 鎖表後 FLUSH LOGS,產生新 binlog (增量關鍵) |
--keepold | 備份完成保留舊目錄 (_old) |
--method=cp|scp | 複製方式 |
--noindices | 不備份索引檔 (.MYI),備份更小更快,還原後 myisamchk -rq 重建 |
--regexp=expr | 正則匹配資料庫名 |
--record_log_pos=db.tbl | 記錄 master/slave 位點到指定表 |
--resetmaster | 鎖表後 RESET MASTER (清空 binlog,慎用) |
--user=, --password=, --port=, --socket= | 連線參數 (密碼必填,無交互模式) |
# 單庫備份
mkdir -p /backup/mysql
/usr/local/mysql/bin/mysqlhotcopy --user=root --password=Pass123 --flushlog dbname /backup/mysql
# 多庫備份
/usr/local/mysql/bin/mysqlhotcopy -u root -p Pass123 --flushlog db1 db2 db3 /backup/mysql
# 正則匹配 (以 ttlsa 開頭)
/usr/local/mysql/bin/mysqlhotcopy -u root -p Pass123 --flushlog --regexp='^ttlsa' /backup/mysql
# 正則匹配 (a-f 開頭)
/usr/local/mysql/bin/mysqlhotcopy -u root -p Pass123 --flushlog --regexp='^[a-f]' /backup/mysql
# 備份指定表 (ttlsa_com 庫中 user_ 開頭)
/usr/local/mysql/bin/mysqlhotcopy -u root -p Pass123 --flushlog ttlsa_com./^user_/ /backup/mysql
# 排除表 (排除 user_log 開頭)
/usr/local/mysql/bin/mysqlhotcopy -u root -p Pass123 --flushlog ttlsa_com./~^user_log/ /backup/mysql
CREATE TABLE `mysqlhotcopy_log_pos` (
`host` VARCHAR(60) NOT NULL PRIMARY KEY,
`time_stamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`log_file` VARCHAR(32),
`log_pos` INT(11),
`master_host` VARCHAR(60),
`master_log_file` VARCHAR(32),
`master_log_pos` INT(11),
`relay_log_file` VARCHAR(32),
`relay_log_pos` INT(11)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
GRANT SELECT, RELOAD, LOCK TABLES ON *.* TO 'mysqlbackup'@'localhost' IDENTIFIED BY 'Pass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON mysql.mysqlhotcopy_log_pos TO 'mysqlbackup'@'localhost' IDENTIFIED BY 'Pass123';
FLUSH PRIVILEGES;
/usr/local/mysql/bin/mysqlhotcopy \
-u mysqlbackup -p Pass123 \
--flushlog \
--record_log_pos=mysql.mysqlhotcopy_log_pos \
--keepold \
--regexp='[a-zA-Z0-9_-]' \
/backup/mysql/mysqlhotcopy_$(date +%Y%m%d_%H%M%S)
mysqlhotcopy 備份 (複製目錄到 datadir、修權限、啟動)master_log_file, master_log_posmysqlbinlog --start-position=POS LOG_FILE | mysql -u root -p
#!/bin/bash
mysqlhotcopy="/usr/local/mysql/bin/mysqlhotcopy"
user="mysqlbackup"
password="Pass123"
socket="/tmp/mysql.sock"
backupdir="/backup/mysql"
datadir="mysqlhotcopy_$(date +%Y%m%d_%H%M%S)"
target="$backupdir/$datadir"
retention=5
# 檢查從庫狀態 (僅主從架構需求)
status=($(mysql -u$user -p$password -S $socket -e "SHOW SLAVE STATUS\G" --skip-column-names \
| egrep "Slave_IO_Running|Slave_SQL_Running" | awk '{print $2}'))
if [[ "${status[0]}" == "Yes" && "${status[1]}" == "Yes" ]]; then
mkdir -p "$target"
$mysqlhotcopy -u $user -p $password -S $socket \
--record_log_pos=mysql.mysqlhotcopy_log_pos \
--keepold --flushlog \
--regexp="[a-zA-Z0-9_-]" \
"$target"
find "$backupdir" -name "mysqlhotcopy_*" -type d -mtime +$retention | xargs rm -rf
else
echo "$(date) Slave error, backup skipped" >> /var/log/mysqlhotcopy.log
fi
| 維度 | mysqlhotcopy | mysqldump |
|---|---|---|
| 本質 | 檔案級 COPY (物理) | SQL 語句集合 (邏輯) |
| 引擎支援 | 僅 MyISAM | 全引擎 |
| 執行位置 | 僅本機 | 遠端客戶端可執行 |
| 線上熱備 | LOCK TABLES + FLUSH TABLES | --single-transaction (InnoDB) |
| 備份速度 | 極快 (GB/s 級) | 較慢 (受限 SQL 解析/網路) |
| 還原速度 | 極快 (檔案複製 + 權限) | 慢 (SQL 重放) |
| 跨版本遷移 | 不支援 | 支援 |
| 依賴 | Perl + DBD::mysql | 無 (MySQL 內建) |
| 適用場景 | 大型 MyISAM 庫、本機極速備份 | 通用備份、異機還原、遷移、InnoDB |
MySQL 5.7+ 已棄用,8.0 移除。MyISAM 庫建議:
ALTER TABLE tbl ENGINE=InnoDB;xtrabackup (Percona) 實現 InnoDB 物理熱備mysqldump --single-transaction 流程mysqlhotcopy 是 MyISAM 時代的極速利器,但隨引擎演進已完成歷史使命。理解其原理有助於掌握物理備份核心邏輯:鎖定 → 同步 → 複製 → 記錄位點 → 釋放。